CentOS 6開機啟動流程實驗篇
-
centos 系統的啟動流程
-
grub
-
破壞Linux的核心文件再修復體驗系統啟動流程
CentOS 6開機啟動的具體詳情請參見理論篇!
了
解了系統啟動的基本流程,以下我們通過“破壞式實驗”,即破壞系統啟動過程中的一些關鍵環節,使系統無法啟動,然后我們再通過修復這些文件使得系統正常重
啟,進而體驗Linux系統的啟動流程,這些關鍵環節包括破壞grub三個stage(stage1、stage1-5、stage2)
中的任何一個階段,甚至是整個grub; 還有掛載文件/etc/fstab,內核文件vmlinuz,
系統引導時需要加載的驅動程序文件initramfs以及MBR中的相關信息等。
接下來開始實驗,建議提前備份相關文件或給系統先做快照!
-
破壞MBR中的前446bytes,即stage1
-
破壞MBR之后的扇區,即stage1-5
-
刪除整個grub文件(stage2隨即也被刪除)
-
刪除用戶空間的第一個進程: /sbin/init
-
刪除/boot目錄
-
刪除initramfs文件
-
刪除/boot及/etc/fstab
-
在邏輯卷的系統上刪除/boot及/etc/fstab
見CentOS 6開機啟動流程實驗篇
1.破壞MBR中的前446bytes,即stage1
[root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=446 count=1 #破壞MBR中的bootloader,即stage1 1+0 records in 1+0 records out 446 bytes (446 B) copied, 0.00123036 s, 362 kB/s [root@centos6 ~]#
此時重啟系統,發現系統直接進入了光盤引導模式
分析:開機直接進入了光盤引導模式,說明系統的開機時經過了POST–>BIOS, 卻在系統引導時出現的問題,這屬于grub的事,我們只需重新安裝grub即可。
進入救援模式,重新安裝grub:
可在上面那個界面直接選擇Rescue救援模式,也可重裝啟動系統,按ESC鍵,選擇CD-ROM再進入。
查看下磁盤的掛載與分區是否正常,如果正常則直接重裝grub,注意重裝grub解決不了分區表被破壞的情況,這是兩碼事,所以給系統提前備份分區表很重要!
修復:重建grub
重啟:
正常的開機啟動畫面,而不是直接進入了光盤引導界面!
小
結:如果stage1被破壞,系統認為硬盤無法啟動,故而系統會直接進入光盤引導模式,也不會進入grub錯誤的界面,因此此時系統根本就無法啟動,只能
進入救援模式!進入之前如果提示chroot /mnt/sysimage,則表示/etc/fstab文件是正常的.
2.破壞MBR之后的扇區,即stage1-5
[root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1 2+0 records in 2+0 records out 1024 bytes (1.0 kB) copied, 0.00508186 s, 202 kB/s [root@centos6 ~]#
重啟:發現屏幕一直卡在了黑色界面
好吧,手動進入救援模式然后重建grub!
重建grub后可查看/dev/sda上的前1024字節
此時重啟系統就正常啟動了!
小
結:如果stage1.5被破壞,則系統啟動過程中會黑屏,一直卡著,也不會進入光盤引導模式,因為stage1未被破壞,則系統認為可以從硬盤啟動,成
功地進行了stage1,當進行stage1.5時發現stage1.5被破壞,系統就無法正常啟動下去,無法找到相應的驅動,就一直黑屏卡著不去。此時
若想恢復系統,就手動進入救援模式,然后重建grub.
其實,安裝grub有兩種方法,此處選擇是的簡單高效的一種:
安裝grub: (1) grub-install安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到DIR/boot目錄下 grub-install --root-directory=DIR /dev/DISK (2) grub grub> root (hd#,#)grub> setup (hd#)
其中,grub-install 命令的選項–root-directory是指要安裝到哪個目錄下,/dev/DISK就是指要安裝在哪個設備上,如:
grub-install --root-directory=/mnt/boot /dev/sda
在上面的兩個例子中,我們省略了–root-direcoty=,因為我們上在本機上重裝grub,當可省略,這里注意,最后掛載點的目錄名稱,一定是boot, 因為grub在安裝的時候,它會去找boot目錄,如果找不到則報錯,當我們把盤掛載到boot之后,可以認為,該盤的名字就叫boot,所以,它會在該盤內寫入bootloader,以引導系統。
而用grub命令安裝grub時,root (hd#,#) 表示第#-1個設備的第#-1個分區,因為磁盤分區的編號是從0開始的。
root (hd0,0) 表示第一個磁盤的第一個分區
且grub命令的重裝grub時,會依賴/boog/grub目錄下的相關文件,而grub-install命令不會依賴,故而建議用grub-install的方式重裝grub。
3.刪除整個grub文件(stage2隨即也被刪除)
刪除整個grub文件時,建議先備份一下再刪除!
[root@centos6 ~]#cp -r /boot/grub . [root@centos6 ~]#rm -rf /boot/grub [root@centos6 ~]#
/boot/grub目錄里面都有哪些文件,以及grub.conf里面的內容解釋請看上文的關鍵詞解釋部分,此處不再贅述。
重啟時我們發現 Error 15 字樣
照樣手動進入救援模式先重裝grub,因為刪除了grub文件,grub肯定是被破壞了!
此時我們在重裝grub時發現“分區表簽名”的問題,可忽略!
我們進入grub目錄可查看grub下的文件是否全部恢復:
發
現少了grub.conf文件,沒有grub.conf文件,系統在啟動時也就無法加載內核,當然啟動不成功,故而我們此時可以選擇手寫一份
grub.conf文件,永久有效,也可選擇重啟,此時系統會進入grub> 模式,在grub>
模式里面我們也可以以命令的形式給出系統內核文件存放的位置、內核的名稱及核心參數,以及虛擬文件系統initrd,
但僅對本次啟動有效,下次啟動時還得書寫一次!
此時我們選擇直接在grub目錄里面書寫:
如果是在grub> 模式,可以這么寫:
小結:grub-install只能重裝grub的stage1與stage1-5,無法恢復grub.conf文件,即無法完全重裝stage2,故需要我們牢記grub.conf文件的六項基本條例,以便正?;謴拖到y,當然備份最好。
4.刪除用戶空間的第一個進程: /sbin/init
/sbin/init是用戶空間的第一個進程,是一個二進制文件,我們無法書寫,刪除之前備份,恢復思路是將備份init恢復到/sin目錄下。
[root@centos6 ~]#cp /sbin/init . [root@centos6 ~]#rm -f /sbin/init [root@centos6 ~]#
重啟:
重啟后我們直接進入了switching root模式,發現命令都無法執行,其實很容易理解,/sbin/init都被刪除了還怎么執行命令!
此
時的系統其實已經經歷了POST–>BIOS–>MBR–>GRUB–加載內核階段,但當啟動init進程時卻無法啟動了,系
統進入了switching root模式,卻什么也干不了!那么我們的思路可以這么來:既然init啟動不了,我們就想辦法讓其啟動,一般地,init
默認執行的是/sbin/init,既然/sbin/init被刪除了,那么我們就把/sbin/init替換為/bin/bash,也就是說,將用戶空
間第一個進程init使其啟動為/bin/bash,然后利用bash命令將備份的init文件恢復到/sbin目錄下即可。
啟動過程中修改內核參數可以進入grub修改,也可以在啟動菜單的選項下修改(進入單用戶模式或直接按a鍵修改內核參數), 我們選擇直接在啟動菜單下按a鍵添加內核參數:init=/bin/bash
在進入bash模式時,需要重新以讀寫方式掛載根/.
而且這一過程也用不著進入救援模式,但是這一方法有時在添加完內核參數并重啟時系統卡在某個地方,往往是由于某個服務起不來而導致的,此時只需進入單用戶模式將上此服務用chkconfig命令off掉即可。因為單用戶模式并不依賴很多服務就可進入!
[root@centos6 ~]#cp /sbin/init . [root@centos6 ~]#rm -f /sbin/init [root@centos6 ~]#
然后我們重啟就可以了!
別外,進入救援模式自然屢試不爽,直接將備份的init文件恢復到/sbin目錄下就完事,且不用擔心由于某服務沒起來而卡住的現象!
自然,如果系統初始化腳本/etc/rc.d/rc.sysinit被刪除了,亦可通過同樣的方法找回,有人說沒備份咋辦,呵呵,那就找相同配置的另一機器吧!
刪除系統初始化腳本:/etc/rc.d/sysinit
刪除之前要備份!
重啟:
嘗試進單用戶模式修復:
5.刪除/boot目錄
/boot目錄里面的文件最重要的文件有兩個:vmlinuz,grub
[root@centos6 ~]#umount /boot [root@centos6 ~]#rm -rf /boot [root@centos6 ~]#
重啟:這個錯誤類型是不是有點熟悉的味道。。。跟破壞了stage2的錯誤一樣!
分析:既然整個/boot目錄都被刪除了,而/boot目錄下最重要的文件是vmlinuz與grub,于是我們先恢復這兩個文件看看。/boot下的其它文件在安裝kernel時會自動生成!
另外,既然這個錯誤跟stage2一樣,那么說明即便刪除整個/boot目錄,也能成功地進行stage1與stage1-5,這是因為stage1在MBR中,而stare1-5在MBR后面的扇區上,stage2是在磁盤上!
第一:先恢復vmlinuz,rpm安裝kernel包
第二: 恢復grub, 直接grub-install /dev/sda,然后再書寫grub.conf文件即可
6.刪除initramfs文件
刪除了initramfs文件,這個文件是在加載內核的時候要用到的,而且上一個實驗也證明了在安裝kernel時此文件會自動生成,要想恢復此文件則重新安裝kernel即可,反正也不費事;當然,initramfs這種重要的文件還有有命令可以生成的!
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
[root@centos6 ~]#rm -f /boot/initramfs-2.6.32-642.el6.x86_64.img [root@centos6 ~]#
重啟:又是熟悉的味道。。。跟破壞了stage1-5的錯誤一樣
由啟動錯誤可知,initramfs是與stage1-5相關的!
如此,系統也可正常啟動!
7.刪除/boot及/etc/fstab
[root@centos6 ~]#umount /boot [root@centos6 ~]#rm -rf /boot [root@centos6 ~]#rm -f /etc/fstab [root@centos6 ~]#
相信有了以上實驗,這個已經沒多大難度了,恢復/boot就是恢復vmlinuz與grub,然后再書寫一個掛載文件即可/etc/fstab即可。
重啟:
這個錯誤太熟悉不過了吧,stage2被破壞了,stage1在MBR中,stage1-5在MBR后面的扇區中,跟刪除/boot目錄沒關系。
進入救援模式:
由此可見,系統的掛載關系已經被破壞,我們根據上面的提示,寫好掛載配置文件/etc/fstab后重啟系統,讓系統自動掛載,然后再重新進入救援模式,恢復/boot目錄!
在
寫掛載配置文件之前,我們必須要知道/boot在哪個位置上,此時df命令已經不行了,此時我們可用fdisk -l來查看,
而根在哪個分區上,fdisk -l
命令是不容易看出來的,我們只能通過“試”的方法:多創建個幾個目錄,如/mnt/sda#,然后分別掛載除/boot即引導分區以外的其它幾個分區!直
至找到為止;另外,我們還得知道文件系統類型,我們可用bldid命令來獲取!
此時,我們已經知道根在/dev/sda2上,而/boot在/dev/sda1上,且文件系統類型為ext4,OK,我們來書寫/etc/fstab吧,然后重啟讓系統自動掛載之!
注意:此時的/etc/fstab在/mnt/sda2上,即路徑為:/mnt/sda2/etc/fstab
但當我們書寫系統掛載配置文件時發現:
錯誤很明顯,路徑錯了!注意設備的掛載。
掛載關系好了之后再重啟系統讓其自動掛載:
掛載關系無誤后就可以安裝kernel并重裝grub了:
8.在邏輯卷的系統上刪除/boot及/etc/fstab
兩樣地,如何系統是邏輯卷分區的,當刪除/etc/fstab后在救援模式下也是無法查看具體的分區情況的,在做實驗之前,我們先對該系統的邏輯卷情況做一大致了解:
OK,我們來刪除/boot及/etc/fstab:
[root@localhost ~]# cd /boot [root@localhost boot]# rm -rf * [root@localhost boot]# cd [root@localhost ~]# umount /boot [root@localhost ~]# rm -rf /boot [root@localhost ~]# rm -f /etc/fstab [root@localhost ~]#
重啟:系統進入了grub
因為此時vmlinuz也被刪除了,故grub也無能為力,我們進入救援模式:
查看分區情況:我們能了解到/boot分區在/dev/sda1上,另外,只能了解到/dev/sda2為邏輯卷,但具體如何分的還不得知
此時我們用lvscan命令來掃描一下邏輯卷:此時即可發現邏輯卷的具體分區情況以及狀態。
再將inactive的邏輯卷激活:vgchage -ay
此
時,根據上一個的經驗,我們應該先寫好系統掛載的配置文件,然后重啟系統讓其自動掛載,再rpm安裝kernel,重裝grub,即可大功告成!與上個實
驗唯一不同的是,這個邏輯卷實驗我們用lvscan時就能夠知道根/
分區在哪(本實驗在vg0上,而vg0在/dev/sda2上),于是,我們即可把根先掛載上,然后切根,再書寫/etc/fstab文件。
重啟系統使其自動掛載:
看到掛載關系已經正常,此刻我們就可以rpm安裝kernel,然后重裝grub了。
安裝kernel:
重裝grub:
grub.conf
至此,就可以重啟系統了!
最后,我們做一個grub的自我保護機制小實驗:
GRUB的界面也支持命令行接口,在GRUB界面可以按照提示輸入e、b、c等命令進行相應的編輯,在對應的title中輸入c可以進入命令行模式,在命令行中可以輸入一個信息如:
help: 獲取幫助find: 文件查找,通常用于定位文件,方法find(hd#,#)/root kernel initrd boot
GRUB也有自己的保護機制,只有通過論證才能修改grub.conf信息。可以通過以下方式來對grub.conf進行保護:
1、在第一個title之上添加password --md5 PASSWORD :主要用于保護編輯功能 2、在某個title內添加password --mdt PASSWORD : 主要用于保護內核 生成密碼的命令:grub-md5-crypt; openssl passwd -1
如:
[root@centos6 ~]#openssl passwd -1Password: Verifying - Password: $1$AawgjWjr$eEQJyxtCwJOk54Gnq2zK/. [root@centos6 ~]#
提示按"p" 鍵輸入密碼:用于保護grub.conf的編輯功能
正常的grub界面:
選中相應的菜單直接回車試圖啟動系統時,提示輸入密碼:
然后系統就可以啟動了!
如果是grub出現了問題導致系統無法啟動,上面已經有大量的實驗了,通過救援模式進行修復,主要步驟如下:
chroot /mnt/sysimage: 改變到磁盤根目錄 fdisk -l /dev/sda: 使用fdisk 檢查磁盤分區 grub-install /dev/sda: 安裝grub引導程序到磁盤/dev/sda的MBR扇區 exit 當然,grub-install命令也可用grub代替:#grubgrub>root (hd0,0) grub>setup (hd0) grub>quit 但時,grub命令在修復grub的會依賴到/boot/grub/目錄下的一些文件, 而grub-install命令是不依賴的!
至此本文就結束了,前半部分(理論篇)我們主要講述了centos 6的啟動流程,解析了相關的關鍵詞,后半 部分(實驗篇)將通過大量破壞式實驗體驗了相關的關鍵文件在Linux系統中起的作用。
原創文章,作者:Liansir,如若轉載,請注明出處:http://www.www58058.com/47781
文章操作性很強,對于一些操作,也有理論性的分析,贊一個。