1. 程式人生 > >CentOS 6 啟動故障與恢復

CentOS 6 啟動故障與恢復

grub、故障恢復

POST加電自檢,然後找到啟動設備即磁盤,從磁盤加載MBR第一扇區二進制代碼,接著是grub的stage1、stage1.5、stage2階段,到這裏有個問題,在stage2階段會加載linux內核文件即/boot/vmlinuz-2.6.32-696.el6.x86_64 ,然後加載根/,但是加載根的話需要文件系統ext4的驅動,而ext4文件系統的驅動模塊在/lib/modules/2.6.32-696.el6.x86_64/kernel/fs/ext4/ext4.ko下且必須先加載根,如此一來就形成了死循環。

解決方法是使用偽文件系統--虛擬磁盤,即/boot/initramfs-2.6.32-696.el6.x86_64.img

,此文件包含系統啟動所需的基本驅動,如ext4.ko,而此文件的作用就是掛載根 /

查看此文件包含的驅動模塊的方法如下:

cp /boot/initramfs-2.6.32-696.el6.x86_64.img  /app/ 
cd /app
mv initramfs-2.6.32-696.el6.x86_64.img initramfs-2.6.32-696.el6.x86_64.img.gz
gunzip initramfs-2.6.32-696.el6.x86_64.img.gz  
file initramfs-2.6.32-696.el6.x86_64.img  
cpio -id < initramfs-2.6.32-696.el6.x86_64.img
tree | grep ext4.ko

如果不小心將initramfs文件刪=刪除,可以使用下述方法恢復

mkinitrd  /boot/initramfs-`uname -r`.img `uname -r`
名稱要與/boot/grub/grub.conf定義的偽根保持一致

只要根掛載成功,那後續的init進程就能夠順利啟動


grub的三個階段

stage1

即MBR的前446字節的bootloader,由於空間太小所以能夠執行的功能有限,其主要作用就是引導至stage1.5階段

stage1.5

主要作用是進入/boot下,/boot也是ext4文件系統,要進入其中也需要先加載文件系統驅動,但是本階段不屬於任何分區,即本階段直接

使用MBR第一扇區512字節後的二進制代碼完成,是直接與磁盤打交道而不經過文件系統;

註意/boot分區與/分區的文件系統可以不一樣,前者使用grub引導,後者使用偽文件系統引導

stage2

完成1.5階段就可以進入/boot分區下,剩下的就是2階段要完成的加載內核文件和偽文件系統,其工作目錄為/boot/grub/


下面來具體說下grub的三個階段啟動故障即恢復方法:


stage1

由於某種原因MBR的前446字節無效,即stage1階段故障

dd if=/dev/zero of=/dev/sda bs=1 count=446
#模擬故障
hexdump  -C -n 512 /dev/sda 
#檢查

此時磁盤將不可用,直接跳到光盤界面(如果有的話),接著通過光盤進入救援模式

chroot /mnt/sysimage  
#切根,否則grub-install不生效

grub-install /dev/sda  
#安裝grub,自動修復stage1,也會修復stage1.5
hexdump -C -n 512 /dev/sda  
#檢查是否修復
sync  
#同步磁盤
exit 退出並重啟,此時系統就可以正常啟動

同理stage1.5出現故障也可以使用此方法恢復

下面說一下stage1.5故障的另一種恢復方法

模擬故障,破壞磁盤MBR後的20個扇區(只要破壞stage1.5即可)

dd if=/dev/zero  of=/dev/sda bs=1 count=10240 seek=512
hexdump -C -n 10552 /dev/sda


重啟系統,進救援模式,按esc鍵

切根

chroot /mnt/sysimage  
#切根,否則grub-install不生效

安裝grub,此處使用交互方式

grub  
#進入grub模式
root (hd0,0)  
#指定根在第1個磁盤的第1個分區
setup (hd0)  
#grub安裝在第1塊磁盤

退出、重啟


參考博客:

http://www.linuxidc.com/Linux/2017-03/141966.htm

CentOS 6 啟動故障與恢復