Linux系統的配置文件缺失,或核心文件被篡改(例如:啓動級別被篡改),都會導致系統啓動的不成功。
爲了解決系統啓動過程中出現的問題,我們先來了解系統引導啓動的過程:
Linux的系統啓動過程大致爲:
通電——bios初始化——grub2磁盤引導階段——grub2文件引導階段——指定boot所在分區——啓動內核,只讀掛載 / 設備——啓動init程序進入初始化階段——啓動systemd初始化進程——讀取/etc/systemd/中的文件——啓動程序——啓動登錄程序
系統主要故障的解決:
1.grub2磁盤引導異常(MBR異常):
MBR:
作用:是爲了記錄/boot目標所在分區位置
地址:磁盤的0磁道1扇區的前446字節。
注意:磁盤的0磁道1扇區的前512字節記錄的信息如下
512 = 446 + 64 + 2
MBR(主引導記錄) mpt(主分區表) 55aa(硬盤有效性標誌)
##一個分區佔用16,所以最多有4個
故障模擬:
dd if=/dev/zero of=/dev/sda bs=446 count=1 ##填充MBR,使MBR失效
注意:其中 /dev/sda1後面的*是自舉功能標識,有代表具有自舉功能
重啓,可以看到系統停止在下面這樣的界面:
故障解決方法:
如果是虛擬機,我們可以進入虛擬機管理器,給系統添加有系統鏡像的虛擬光盤,並設定優先從光盤啓動
如果是真實主機,我們可以通過bios從擁有系統鏡像的光盤或者U盤啓動
進入挽救模式後,配置安裝MBR,然後虛擬機調整優先從磁盤啓動或真機拔下U盤
##添加帶有系統鏡像的虛擬關
##設置優先從光盤啓動
##選擇第三個Troubleshooting,修理故障
##選擇第2個Rescue a RedHat Enterprise linux system
1 ##鍵入1
##回車
chroot /mnt/sysimage/ ##進入shell
df
grub2-install /dev/sda ##安裝grub2
exit
exit
##配置完成後,恢復從磁盤啓動
##可以看到問題被成功解決,系統恢復正常
2.grub2文件引導異常(引導文件丟失):
問題模擬:爲了模擬故障環境,我們刪除grub2引導文件:
即刪除/boot/gurb2/grub.cfg
我們首先查看系統的掛載情況
可以看到系統的掛載在 / 下的硬盤爲/dev/sda3,掛載在/boot下的硬盤爲/dev/sda1(也可以進入挽救模式查看掛載情況)
重啓系統,可以看到異常,重啓不了
解決方法:
如果發現引導文件丟失時,還沒有關機,我們可以直接用命令新建文件
grub2-mkconfig > /boot/grub2/grub.cfg
如果已經重啓,進入報錯界面,我們可以鍵入命令
set root='hd0,msdos1' ##此位置是不固定的,位置指定boot所在分區
linux16 /vmlinz-3.10.0-123.el7.x86_64 ro root=/dev/sda3 ##寫根分區掛載設備名稱
initrd16 /initramfs-3.10.0-123.el7.x86_64.img
boot
##注意:文件名比較長,可以tab鍵補齊
配置完後,可以重啓成功,但是這只是臨時的,再次啓動還是會異常無法啓動,所以需要用命令生成引導文件
grub2-mkconfig > /boot/grub2/grub.cfg
配置完後,重啓能夠繼續正常啓動。
至此,就可以解決由於引導文件丟失所引起的系統故障。
3.內核文件丟失:
首先我們看一下/boot下有哪些文件:
系統啓動異常模擬:我們刪除/boot下的內核文件,模擬內核文件丟失的情況:
重啓電腦,可以看到系統,可以看到系統異常,無法正常啓動:
解決方法:
首先,給系統插入一個與系統版本一致的鏡像,然後我們從鏡像啓動,進入挽救模式:
進入挽救模式後,我們做以下操作:分佈鍵入以下命令:
chroot /mnt/sysimage
mkdir /rhel7.0 ##新建一個目錄
mount /dev/sr0 /rhel7.0/ ##把完整的系統鏡像掛載到該目錄下
cd /rhel7.0/Packages ##打開系統鏡像中的安裝包
cp kernel-3.10.0-514.el7.x86_64.rpm /mnt/ ##將我們需要的安裝包拷貝到/mnt下
cd /mnt/
rpm2cpio kernel-3.10.0-514.el7.x86_64.rpm | cpio -id ##解開內核對應的安裝包
cd boot
cp vmlinuz-3.10.0-514.el7.x86_64 /boot ##將解開的內核安裝包中對應的boot文件複製到我們原系統的/boot下 ,以填補原來/boot文件的缺失
exit
exit
恢復從硬盤啓動,可以看到系統正常啓動:
開機後我們可以看到我們之前刪除的文件重新出現在/boot下:
4.系統初始化鏡像文件丟失
系統啓動異常模擬:
我們刪除/boot下的系統初始化鏡像文件
重啓系統,我們可以看到系統的異常,系統初始化鏡像文件找不到
解決方法:
依舊是給系統插入一個帶有相同版本系統鏡像的光驅,然後進入挽救模式:
進入挽救模式後,我們可以鍵入以下命令:
chroot /mnt/sysimage
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) ##重建系統初始化鏡像文件
cd /boot/ ##打開系統配置目錄
ls ##查看配置文件
exit
exit
配置後關閉系統,重新選擇通過硬盤啓動:
至此,該問題就完全得到了解決。
注意:$(uname -r) 是一個變量,用來指代當前系統的內核版本
5./boot分區丟失
模擬問題:我們刪除/boot分區中的信息,以模擬/boot分區丟失的情況:
刪除分區後我們重啓電腦,可以看到系統異常,無法正常啓動:
解決方案:
給系統插入一個載有與系統版本一致的系統鏡像的光驅,並使系統從光驅啓動:
進入挽救模式後,一次鍵入以下命令:
1 ##輸入1,選擇continue
[Enter] ##再回車
chroot /mnt/sysimage ##切換到真實根目錄下
mkdir /boot ##新建/boot
mkdir /rhel7.3 ##新建鏡像掛載目錄
mount /dev/sr0 /rhel7.3/ ##掛載系統鏡像到我們新建的目錄下
cp /rhel7.3/Packages/kernel-3.10.0-514.el7.x87_64.rpm /mnt/ ##將內核的安裝包複製到/mnt下
cd /mnt/ ##切換到/mnt
rpm -ihv kernel-3.10.0-514.el7.x87_64.rpm --force ##強制安裝
grub2-mkconfig > /boot/grub2/grub.cfg ##新建系統引導文件
exit
exit
執行完上面的命令後,我們切換系統從硬盤啓動,就可以正常啓動系統
6.啓動級別init異常
模擬問題:
我們將啓動級別改爲重啓,這樣開機時就不會正常進入系統,而是處於不斷的開機自啓:
ln -s /lib/systemd/system/reboot.target /etc/systemd/system/default.target ##更改重啓爲新開機級別
配置完模擬問題後,我們重啓系統,可以看到系統一直在不斷自啓,無法正常進入系統。
解決方案:
在進入上面的界面後,我們按上下鍵,避免自動直接進入系統,而後按e進入可編輯模式,在linux16 /。。。後面加上啓動級別爲 5 即圖像化系統啓動界面 就可以正常進入系統。
在進入系統後我們重新設定系統的啓動級別爲級別5
systemctl set-default graphical.target ##設置系統的默認啓動級別爲5
至此,啓動級別異常導致的系統異常就解決了。
可以看到,系統啓動異常的原因就是將重啓鏈接到了系統默認啓動級別上。