linux學習之旅(十七)& 系統啓動及出錯恢復

系統啓動過程

系統引導過程概述

傳統的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啓動過程

  1. 打開電源後電腦所做的第一件事情就是BIOS初始化。BIOS會讀取引導設備設定,定位並傳遞系統控制權給MBR(假設硬盤是第一引導設備)。
  2. MBR從Grub或LILO引導程序讀取相關信息並初始化內核。接下來將由Grub或LILO繼續引導系統。如果你在grub配置文件裏指定了systemd作爲引導管理程序,之後的引導過程將由systemd完成。Systemd使用“target”來處理引導和服務管理過程。這些systemd裏的“target”文件被用於分組不同的引導單元以及啓動同步進程。
  3. 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

重啓進入後,成功!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章