系統啓動過程
系統引導過程概述
傳統的Linux系統啓動過程主要由著名的init進程(也被稱爲SysV init啓動系統)處理,而基於init的啓動系統被認爲有效率不足的問題,systemd是Linux系統機器的另一種啓動方式,宣稱彌補了以傳統Linux SysV init爲基礎的系統的缺點。
傳統的 init啓動過程
在我們打開Linux電腦的電源後第一個啓動的進程就是init。分配給init進程的PID是1。它是系統其他所有進程的父進程。當一臺Linux電腦啓動後,處理器會先在系統存儲中查找BIOS,之後BIOS會檢測系統資源然後找到第一個引導設備,通常爲硬盤,然後會查找硬盤的主引導記錄(MBR),然後加載到內存中並把控制權交給它,以後的啓動過程就由MBR控制。
主引導記錄會初始化引導程序(Linux上有兩個著名的引導程序,GRUB和LILO,80%的Linux系統在用GRUB引導程序),這個時候GRUB或LILO會加載內核模塊。內核會馬上查找/sbin下的“init”程序並執行它。從這裏開始init成爲了Linux系統的父進程。init讀取的第一個文件是/etc/inittab,通過它init會確定我們Linux操作系統的運行級別。它會從文件/etc/fstab裏查找分區表信息然後做相應的掛載。然後init會啓動/etc/init.d裏指定的默認啓動級別的所有服務/腳本。所有服務在這裏通過init一個一個被初始化。在這個過程裏,init每次只啓動一個服務,所有服務/守護進程都在後臺執行並由init來管理。
關機過程差不多是相反的過程,首先init停止所有服務,最後階段會卸載文件系統。
systemd啓動過程
- 打開電源後電腦所做的第一件事情就是BIOS初始化。BIOS會讀取引導設備設定,定位並傳遞系統控制權給MBR(假設硬盤是第一引導設備)。
- MBR從Grub或LILO引導程序讀取相關信息並初始化內核。接下來將由Grub或LILO繼續引導系統。如果你在grub配置文件裏指定了systemd作爲引導管理程序,之後的引導過程將由systemd完成。Systemd使用“target”來處理引導和服務管理過程。這些systemd裏的“target”文件被用於分組不同的引導單元以及啓動同步進程。
- systemd執行的第一個目標是default.target。但實際上default.target是指向graphical.target的軟鏈接。Linux裏的軟鏈接用起來和Windows下的快捷方式一樣。文件Graphical.target的實際位置是/usr/lib/systemd/system/graphical.target
- 以流程來看:
- 通電——>進入初始化階段——>bios 初始化——>grub2 磁盤引導階段——>grub2 文件引導階段——> 指定boot所在分區——>啓動內核,只讀掛在 / 設備啓動——>init 程序進入初始化階段——> 啓動 systemd 初始化進程——>讀取 /etc/systemd/中的文件——>啓動程序——>啓動登陸環境
grub文件引導階段
由文件/boot/grub2/grub.cfg控制流程:
指定/boot分區位置 —–> 加載內核 —–> 啓動系統初始化進程 —–> grub2-mkconfig
內核引導階段
檢測硬件設備 —–> 設備驅動初始化 —–> 將/只讀掛載 —–> 載入初始進程systemd —–> 內核文件丟失請重新安裝內核
systemd初始化
開啓selinux和systemd-tools —–> 加載內核參數 —–> 加載系統時鐘,鍵盤,主機名稱 —–> 讀寫掛載/文件系統 —–> 激活raid, lvm設備 —–> 激活系統配額 —–> 啓動multi-user.target.wants中的所有服務腳本 —–> 啓用虛擬控臺 —–> 啓動圖形
設定啓動級別
systemctl set-default + 啓動級別
/etc/systemd/system/default.target
啓動級別:
runlever0.target -> poweroff.target //關機'
runlever1.target -> rescue.target //單用戶模式
runlever2.target -> multi-user.target //多用戶模式,不支持NFS
runlever3.target -> multi-user.target //完整多元化模式
runlever4.target -> multi-user.target //未定義使用
runlever5.target -> grapical.target //帶有圖形界面的多用戶使用
runlever6.target -> reboot.target //重啓
tips :
開機自啓動是因爲添加了鏈接到腳本上,開機就會自動運行腳本開啓,有無圖形也是因爲鏈接在有無圖形的腳本上
如果出現一開機就關機的現象,是因爲將開機的級別指定在了poweroff.target,所以將開機指定到相應的用戶模式啓動級別就好了
系統啓動出錯恢復
1.引導程序boot損壞:
這裏爲了演示,我們將/dev/vda前446字節刪除達到相同效果
dd if=/dev/zero of=/dev/vda bs=446 count=1 ##注意一定是446 ,多了的話,就不只是修復引導了
446字節是啓動引導
首先,保證selinux是disabled
重啓,發現一直在booting,即無法引導系統系統
關閉虛擬機 ,將virt-manager中添加cdrom,SATA硬盤,選擇iso鏡像
頂置以硬盤啓動
啓動程序,第一個界面選擇修復Troubleshooting
第二個界面選擇拯救模式Rescue a Res Hat Enterprise Linux system
進入Rescue模式
第一個選擇是環境,默認就是繼續,1,選擇只讀 2,跳過到shell 3,退出,重啓 4
我們選擇1 ,提示三遍,你的根現在在/mnt/sysimage 回車繼續
chroot /mnt/sysimage #進入 bash-4.2# grub2-install /dev/vda
反饋 : No error reported,即爲安裝成功
退出bash-4.2,退出sh-4.2關閉虛擬機
重新設置啓動,頂置以虛擬硬盤啓動,然後重新啓動你的虛擬機
完成!!
tips :
- 在啓動選項中選第一個按 e 進入,找到下圖所示地方,添加selinux=0 可以實現開機不加載selinux,相應的類似操作還有很多,比如輸入rw rd.break進入可以完成之前提到過的忘記密碼恢復
2.grub修復
系統啓動關鍵性文件 /boot/grub2/grub.cfg,記錄了grub引導的各個部分
//這裏只顯示一部分
其中87,102行會發現很熟悉,因爲這就是顯示再開機時的名稱
如果將對應的位置修改,則可以變成以下效果
grub2-mkconfig ##顯示grub.cfg 的文件信息
如果這裏的文件缺失,系統將不知道該讀哪一個地方,則開機後會進入如下界面
grub> set root='hd0,msdos1' ##看你的boot分區就寫什麼
# hdn 第n-1塊硬盤 ,這裏要知道自己的根在那裏
grub> linux16 /vmlinuz-... ro root=/dev/vda3
grub> initrd16 /initramfs-...
grub> boot ##啓動引導
配置好輸入boot就可以進入系統了,進入後,執行grub2-mkconfig > /boot/grub2/grub.cfg
添加缺失的引導配置文件
3.內核丟失
這裏以刪除內核文件爲例:
//同樣的,刪除了這個文件,那麼修復也就是要填補這個文件
重啓後會顯示丟失內核文件
修復:
設置cdrom啓動,頂置SATA CDROM1
—>進入拯救模式
—>繼續 1 , Enter
—>df,發現/dev/sr0這是光驅裏面的,這也是我們內核資源的來源
進入後
rpm2cpio /run/install/repo/Packages/kernal-....rpm | cpio -id ##提取到當前然後將它複製到/mnt/sysimage/boot下,即添加到配置文件的指定位置,不然系統還是讀取不到這個文件
//注意,進入之後,自己現在的根目錄是在/mnt/sysimage下,不是真正的根,所以需要將文件移動到真正缺少內核的地方,即/mnt/sysimage/boot 下
重新頂置以虛擬硬盤啓動
重新啓動,完成
4.初始化文件丟失
這裏還是以刪除這個文件爲例:
rm -fr /boot/initramfs-3.10…x86_64.img
man mkinitrd
mkinitrd [OPTION...] [< initrd-image>] < kernel-version> //這是修復初始化文件的命令用法
關機 —> 設置cdrom啓動 —> 進入拯救模式
chroot /mnt/sysimage ##切換用戶
mkinitrd /boot/initramfs-$(uname -r).img &(uname -r)
//其中,$()變量的應用 :
即在命令中,()內部的先執行,然後作爲$變量
比如: echo uname is $(uname -r) //先執行uname -r ,輸出作爲變量的輸入
顯示:echo uname is 3.10.0-327.el7.x86_64
退出關機
重新設置虛擬硬盤啓動
成功!
tips : 若將/boot全部刪除了
還是以系統的引導過程爲本,一步一步的修復:
恢復grub —-> 重新安裝內核 —-> 安裝grub,恢復自動引導文件 —-> 重啓
5.登陸閃退
問題描述: 一登陸輸入賬戶密碼後直接彈出
同樣的,進入拯救模式
chroot切換環境時,顯示丟失了一個文件
所以,將缺失的文件加上去,/bin/bash
--- > 將救援模式下的/bin/bash 複製到 /mnt/sysimage/bin/bash
重啓進入後,成功!