天天看點

CentOS6啟動流程和故障修複實驗

CentOS6啟動流程和故障修複實驗

一、啟動流程概述

1、上電POST自檢,加載BIOS的硬體資訊,擷取第一個啟動裝置

2、讀取第一個啟動裝置MBR裡的引導加載程式(grub)的啟動資訊

3、加載核心作業系統的核心資訊,核心開始解壓縮,并嘗試驅動所有的硬體裝置

4、核心執行init程式,并擷取預設的運作資訊

5、init程式執行/etc/rc.d/rc.sysinit檔案

6、啟動核心的外挂子產品

7、init執行運作的各個批處理檔案(scripts)

8、init執行/etc/rc.d/rc.local

9、執行/bin/login程式,等待一會登入

簡單流程:

POST (Power ON Self Test,加電自檢)---->Boot Sequesce(BIOS,找到第一啟動裝置)---->Boot Loader(加載引導程式到記憶體中)---->Kernel (ramdisk,加載核心和虛拟磁盤映像檔案)---->rootfs(挂載臨時根)---->switchroot(切換臨時根為系統根目錄)---->/sbin/init(開機後第一個讀取的檔案)---->配置檔案(/etc/inittab,/etc/init/*.conf)---->設定預設運作

級别---->系統初始化腳本rc.sysinit---->關閉或啟動對應級别的服務---->啟動終端

二、删除centos6系統的grub.conf⽂件,⼿動啟動系統

目的:掌握centos6系統中的啟動時grub.conf檔案的作用是提供啟動菜單,删除該檔案後,需要

手動指定啟動核心等參數。

實驗步驟
1、删除grub.conf⽂件前,要知道該⽂件中kernel⾏root指定位置

root=/dev/mapper/vg_CentOS-lv_root

2、删除了/boot/grub/grub.conf啟動菜單⽂件

[[email protected] ~]# rm /boot/grub/grub.conf -f

3、reboot重新開機

[[email protected] ~]# reboot

4、進⼊grub界⾯,⼿動指定核心等參數
CentOS6啟動流程和故障修複實驗

重新開機後出現的grub>提⽰符界⾯,⼿動指定核心及參數才能啟動系統。

(1)先指定根路徑:

grub> root (hd0,0)

注意:此時可使⽤Tab鍵補全可選的指令。

CentOS6啟動流程和故障修複實驗

(2)再指定核心及參數

grub> kernel /vmlinuz-2.6.32-696.el6.x86_64 ro

root=/dev/mapper/vg_CentOS-lv_root

CentOS6啟動流程和故障修複實驗

(3)指定虛拟磁盤映像⽂件

grub> initrd /

CentOS6啟動流程和故障修複實驗

(4)boot啟動

grub> boot

CentOS6啟動流程和故障修複實驗

最後啟動成功輸⼊⽤戶名和密碼登入系統:

CentOS6啟動流程和故障修複實驗

(5)⼿動編寫恢複grub.conf⽂件

CentOS6啟動流程和故障修複實驗
CentOS6啟動流程和故障修複實驗

重新開機後通過⼿動建立的grub.conf成功進⼊系統:

CentOS6啟動流程和故障修複實驗

三、破壞grub1階段并修複

實驗步驟
1、删除/boot/grub⽬錄下的各的stage⽂件啟動不受影響

在/boot/grub/⽬錄下,除保留grub.conf引導菜單⽂件以外,其它⽂件都删除,不影響系統啟動。

[[email protected] grub]# mv grub.conf …/

[[email protected] grub]# rm -rf *

[[email protected] grub]# ls

[[email protected] grub]# mv …/grub.conf .

[[email protected] grub]# ls grub.conf

[[email protected] grub]#reboot

CentOS6啟動流程和故障修複實驗

進⼊此grub菜單界⾯,就說明grub的stage1第⼀階段和stage1.5階段已經通過了,正在讀取stage2階段。

2、破壞grub的stage1第⼀階段并恢複系統啟動

前提系統安裝CD光牒已經放在光驅⾥。

[[email protected] ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446

[[email protected] ~]# reboot

重新開機後,系統⽆法進⼊正常的原來系統,啟動時按F2鍵,進⼊BIOS設定第⼀啟動裝置為CD-ROOM裝置。或直接在關機狀 态使⽤虛拟機開機進⼊固件的功能:

CentOS6啟動流程和故障修複實驗

CD光牒啟動界⾯:

CentOS6啟動流程和故障修複實驗

選擇救援模式即第3⾏,回車确定:

CentOS6啟動流程和故障修複實驗

選擇語⾔,選擇ok,回車确定:

CentOS6啟動流程和故障修複實驗

選擇鍵盤類型,選擇ok,回車确定:

CentOS6啟動流程和故障修複實驗

選擇不啟⽤⽹絡即選擇No,回車确定:

CentOS6啟動流程和故障修複實驗

嘗試挂載損壞引導的系統中的根,選擇Continue,回車确定:

CentOS6啟動流程和故障修複實驗

已經挂載損壞系統上的根,回車确定

CentOS6啟動流程和故障修複實驗

确認把損壞引導系統的根挂載在/mnt/sysimage⽬錄下,回車确定

CentOS6啟動流程和故障修複實驗

進⼊shell,選擇第1⾏後,選擇Ok,回車确定:

CentOS6啟動流程和故障修複實驗

檢視磁盤分區:

bash-4.1# df

CentOS6啟動流程和故障修複實驗

切換損壞引導的系統上的真正的根:

bash-4.1#chroot/mnt/sysimage

CentOS6啟動流程和故障修複實驗

驗證切換真正的根後,檢視磁盤分區:

sh-4.1# df

CentOS6啟動流程和故障修複實驗

下⾯在真正的根下安裝grub,安裝前檢視第⼀啟動磁盤分區的第⼀個扇區即MBR的前446位元組:

hexdump -C -n 446 -v /dev/sda

CentOS6啟動流程和故障修複實驗

此時觀察MBR目前446位元組是⽆内容的。

安裝grub:

sh-4.1# grub-install /dev/sda

CentOS6啟動流程和故障修複實驗

再次檢視MBR的前446位元組

CentOS6啟動流程和故障修複實驗

看/boot/grub目錄下,生成了此前删除的各檔案:

CentOS6啟動流程和故障修複實驗

grub所需的⽂件,能正常啟動,編輯/boot/grub/grub.conf:

sh-4.1# vim /boot/grub/grub.conf

在kernel所在的⾏,尾部添加selinux=0即可。

CentOS6啟動流程和故障修複實驗

或者編輯/etc/selinux/config,修改為SELINUX=disabled也能實作同樣的功能,還有⼀種⽅法是在啟動時,中⽌啟動進 ⼊gurb菜單,在kernel⾏的核心參數最後寫上selinux=0完全可實作相同的功能。

退出chroot環境:

sh-4.1# exit

重新開機系統:

bash-4.1# reboot

CentOS6啟動流程和故障修複實驗

重新開機後,系統成功修改grub引導⽂件。

CentOS6啟動流程和故障修複實驗

四、破壞grub1.5階段并恢複

實驗步驟
1、删除grub1.5階段

檢視包含grub1.5階段的内容:

[[email protected] ~]# hexdump -C -n 10240 -v /dev/sda

删除grub1.5階段即MBR的512位元組之後的部分:

[[email protected] ~]# dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512

再次檢視包含grub1.5階段的内容:

[[email protected] ~]# hexdump -C -n 10240 -v /dev/sda

重新開機:

[[email protected] ~]# reboot

設定CD光牒開機啟動項,顯⽰如下界⾯,迅速按F2鍵進⼊BIOS設定界⾯:

CentOS6啟動流程和故障修複實驗

選擇Boot菜單,設定CD-ROM第⼀啟動:

CentOS6啟動流程和故障修複實驗

選擇CD-ROM Drive,⽤組合鍵Shift+加号(+)把該項移動到第⼀項即可,按F10儲存退出,重新啟動。

選擇救援模式即第3⾏,回車确定:

CentOS6啟動流程和故障修複實驗

選擇語⾔,選擇ok,回車确定:

CentOS6啟動流程和故障修複實驗

選擇鍵盤類型,選擇ok,回車确定:

CentOS6啟動流程和故障修複實驗

選擇不啟⽤⽹絡即選擇No,回車确定:

CentOS6啟動流程和故障修複實驗

嘗試挂載損壞引導的系統中的根,選擇Continue,回車确定:

CentOS6啟動流程和故障修複實驗

已經挂載損壞系統上的根,回車确定:

CentOS6啟動流程和故障修複實驗

确認把損壞引導系統的根挂載在/mnt/sysimage⽬錄下,回車确定:

CentOS6啟動流程和故障修複實驗

進⼊shell,選擇第1⾏後,選擇Ok,回車确定:

CentOS6啟動流程和故障修複實驗

檢視磁盤分區:

bash-4.1# df

CentOS6啟動流程和故障修複實驗

切換根:

bash-4.1# chroot /mnt/sysimage/

進⼊grub指令⾏:

bash-4.1# grub

重新寫⼊/boot/grub/⽬錄下grub所需的⽂件⾥:

grub> root (hd0,0)

grub> setup (hd0)

CentOS6啟動流程和故障修複實驗

退出grub界⾯、退出切換根:

grub> quit sh-4.1# exit

重新開機系統:

bash-4.1# reboot

CentOS6啟動流程和故障修複實驗

把第⼀啟動項,修改為硬碟啟動即可,成功恢複grub1.5階段,正常啟動系統。

注意:此例模拟破壞grub1.5問題解決⽅法,有⼀個前提,就是必須保證/boot/grub/⽬錄下,有stage1、stage1_5、 stage2等類似的⽂件,因為修複時,會把破壞的内容寫到這些⽂件⾥,是以,如果這些⽂件不存在,是⽆法寫⼊⽂件的, 也就是⽆法修複成功。

五、破壞grub2階段即删除/boot/⽬錄下所有⽂件

實驗步驟
1、删除/boot/⽬錄下所有⽂件

[[email protected] ~]# rm -rf /boot/* [[email protected] ~]# reboot

2、使⽤CD光牒啟動,進⼊救援模式

在啟動剛開始界⾯,迅速按⽅向鍵上下鍵,進⼊BIOS設定界⾯。

CentOS6啟動流程和故障修複實驗

進⼊BIOS,設定CD光牒啟動:

CentOS6啟動流程和故障修複實驗

按F10,儲存退出即可。

CentOS6啟動流程和故障修複實驗

啟動後,直接選擇進⼊救援模式即可。

CentOS6啟動流程和故障修複實驗
3、切根後安裝grub

選擇語⾔,選擇ok,回車确定:

CentOS6啟動流程和故障修複實驗

選擇鍵盤類型,選擇ok,回車确定:

CentOS6啟動流程和故障修複實驗

選擇不啟⽤⽹絡即選擇No,回車确定:

CentOS6啟動流程和故障修複實驗

嘗試挂載損壞引導的系統中的根,選擇Continue,回車确定:

CentOS6啟動流程和故障修複實驗

已經挂載損壞系統上的根,回車确定:

CentOS6啟動流程和故障修複實驗

确認把損壞引導系統的根挂載在/mnt/sysimage⽬錄下,回車确定:

CentOS6啟動流程和故障修複實驗

進⼊shell,選擇第1⾏後,選擇Ok,回車确定:

CentOS6啟動流程和故障修複實驗

檢視磁盤分區:

bash-4.1# df

CentOS6啟動流程和故障修複實驗

切換根:

bash-4.1# chroot /mnt/sysimage/

安裝grub:

sh-4.1# cd /boot/ sh-4.1# grub-install /dev/sda

CentOS6啟動流程和故障修複實驗
4、複制vmlinuz核心⽂件

挂載磁盤并拷貝vmlinuz核心⽂件:

sh-4.1# mount /dev/cdrom /media sh-4.1# cp /media/isolinux/vmlinuz /boot/

注意:拷貝核心⽂件vmlinuz時,除了 /media/isolinux/vmlinuz所在的路徑是核心⽂件,還有⼀個存放位置 是/mnt/Packages/kernel-2.6.32-696.el6.x86_64.rpm,隻需把該⽂件解壓即可,最後再介紹如何解壓這個rpm核心 ⽂件。

CentOS6啟動流程和故障修複實驗
5、建立虛拟磁盤映像⽂件

sh-4.1# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

6、建立grub.conf⽂件

檢視根⽬錄在grub.conf應該寫⼊的位置:

sh-4.1# df

或:

sh-4.1# blkid

在這裡插入圖檔描述

這⾥查到root指定位置為/dev/mapper/vg_CentOS-lv_root,當然也可⽤UUID代替其寫為root=UUID=938fa34fd04a-41d5-a6a9-888eeccd26b2。

sh-4.1# vim /boot/grub/grub.conf

内容為:

default=0

timeout=5

title redhat

root (hd0,0)

kernel /vmlinuz ro root=/dev/mapper/vg_CentOS-lv_root rhgb quiet initrd /initramfs-2.6.32-696.el6.x86_64.img

7、重新開機reboot

sh-4.1# exit bash-4.1# reboot

系統啟動恢複正常。

繼續閱讀