CentOS 6開機啟動流程實驗篇

CentOS 6開機啟動流程實驗篇


  • centos 系統的啟動流程

  • grub

  • 破壞Linux的核心文件再修復體驗系統啟動流程


CentOS 6開機啟動的具體詳情請參見理論篇!


解了系統啟動的基本流程,以下我們通過“破壞式實驗”,即破壞系統啟動過程中的一些關鍵環節,使系統無法啟動,然后我們再通過修復這些文件使得系統正常重
啟,進而體驗Linux系統的啟動流程,這些關鍵環節包括破壞grub三個stage(stage1、stage1-5、stage2)
中的任何一個階段,甚至是整個grub; 還有掛載文件/etc/fstab,內核文件vmlinuz,
系統引導時需要加載的驅動程序文件initramfs以及MBR中的相關信息等。

接下來開始實驗,建議提前備份相關文件或給系統先做快照!

  1. 破壞MBR中的前446bytes,即stage1

  2. 破壞MBR之后的扇區,即stage1-5

  3. 刪除整個grub文件(stage2隨即也被刪除)

  4. 刪除用戶空間的第一個進程: /sbin/init

  5. 刪除/boot目錄

  6. 刪除initramfs文件

  7. 刪除/boot及/etc/fstab

  8. 在邏輯卷的系統上刪除/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 ~]#

wKiom1ffg5HwIsYfAACUwG-yhjc648.png

此時重啟系統,發現系統直接進入了光盤引導模式

wKiom1ffg6vCE6kiAAVuFPagJpQ368.png

分析:開機直接進入了光盤引導模式,說明系統的開機時經過了POST–>BIOS, 卻在系統引導時出現的問題,這屬于grub的事,我們只需重新安裝grub即可。

進入救援模式,重新安裝grub:

可在上面那個界面直接選擇Rescue救援模式,也可重裝啟動系統,按ESC鍵,選擇CD-ROM再進入。

wKioL1ffg8SCVjvhAAANnE19Wvg511.png

wKioL1ffg_DClq0tAAAm_2dgFjA457.png

wKioL1ffhAijomdlAAAgkyfd-w8319.png

查看下磁盤的掛載與分區是否正常,如果正常則直接重裝grub,注意重裝grub解決不了分區表被破壞的情況,這是兩碼事,所以給系統提前備份分區表很重要!

wKioL1ffhCGhvzhxAAAclS0M4IA707.png

wKioL1ffhFChVmHUAAA1oUZthGI263.png

修復:重建grub

wKiom1ffhGrDbS0dAAA7CBsboMc280.png

重啟:

wKioL1ffhH_gYc6WAAAEtAd1N5c602.png

正常的開機啟動畫面,而不是直接進入了光盤引導界面!

wKioL1ffhJbzxK-bAAAIKmFzvIs858.png

wKioL1ffhLaSYoJjAACL0FegsQ4070.png


結:如果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 ~]#

重啟:發現屏幕一直卡在了黑色界面

wKiom1ffhPyjH0lVAAAGjl6_IVk350.png

好吧,手動進入救援模式然后重建grub!

重建grub后可查看/dev/sda上的前1024字節

wKioL1ffhRmS-LkkAABNZDQG6K0589.png

此時重啟系統就正常啟動了!


結:如果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 字樣

wKiom1ffhUKSF1scAAAEJ7PWhXI026.png

照樣手動進入救援模式先重裝grub,因為刪除了grub文件,grub肯定是被破壞了!

此時我們在重裝grub時發現“分區表簽名”的問題,可忽略!

wKioL1ffhV2QPz3cAAAdNrHYmNk069.png

我們進入grub目錄可查看grub下的文件是否全部恢復:

wKioL1ffhX2g30p1AAAMOsIuIWw327.png


現少了grub.conf文件,沒有grub.conf文件,系統在啟動時也就無法加載內核,當然啟動不成功,故而我們此時可以選擇手寫一份
grub.conf文件,永久有效,也可選擇重啟,此時系統會進入grub> 模式,在grub>
模式里面我們也可以以命令的形式給出系統內核文件存放的位置、內核的名稱及核心參數,以及虛擬文件系統initrd,
但僅對本次啟動有效,下次啟動時還得書寫一次!

此時我們選擇直接在grub目錄里面書寫:

wKioL1ffhZiQKKtMAAAWpr66_38821.png

如果是在grub> 模式,可以這么寫:

wKiom1ffha7gX5RBAABhyAqweWE033.png

小結: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 ~]#

重啟:

wKiom1ffhduRROoBAAAkZBRCeuA361.png

重啟后我們直接進入了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 ~]#

wKiom1ffhibjQ8qhAAAX4rUMmFQ142.png

然后我們重啟就可以了!

別外,進入救援模式自然屢試不爽,直接將備份的init文件恢復到/sbin目錄下就完事,且不用擔心由于某服務沒起來而卡住的現象!

自然,如果系統初始化腳本/etc/rc.d/rc.sysinit被刪除了,亦可通過同樣的方法找回,有人說沒備份咋辦,呵呵,那就找相同配置的另一機器吧!

刪除系統初始化腳本:/etc/rc.d/sysinit

刪除之前要備份!

重啟:

wKiom1ffhj_Bh9qpAAGOhpgfx2o513.png

嘗試進單用戶模式修復:

wKioL1ffhlainN0rAACt1Y95uEE842.png

5.刪除/boot目錄

/boot目錄里面的文件最重要的文件有兩個:vmlinuz,grub

wKioL1ffhmzAaYczAABHDbky2sA237.png

[root@centos6 ~]#umount /boot
[root@centos6 ~]#rm -rf /boot
[root@centos6 ~]#

重啟:這個錯誤類型是不是有點熟悉的味道。。。跟破壞了stage2的錯誤一樣!

wKioL1ffhreBiNNWAAADl53tx6k294.png

分析:既然整個/boot目錄都被刪除了,而/boot目錄下最重要的文件是vmlinuz與grub,于是我們先恢復這兩個文件看看。/boot下的其它文件在安裝kernel時會自動生成!

另外,既然這個錯誤跟stage2一樣,那么說明即便刪除整個/boot目錄,也能成功地進行stage1與stage1-5,這是因為stage1在MBR中,而stare1-5在MBR后面的扇區上,stage2是在磁盤上!

第一:先恢復vmlinuz,rpm安裝kernel包

wKiom1ffhtTCLVP8AAAdkqg-jn0647.png

第二: 恢復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的錯誤一樣

wKioL1ffhvqSbiWuAAADokU5weI555.png

由啟動錯誤可知,initramfs是與stage1-5相關的!

wKiom1ffhxHwnR48AAAgSgU63uc427.png

如此,系統也可正常啟動!

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即可。

重啟:

wKioL1ffhzHTbmTeAAADHkahq_I331.png

這個錯誤太熟悉不過了吧,stage2被破壞了,stage1在MBR中,stage1-5在MBR后面的扇區中,跟刪除/boot目錄沒關系。

進入救援模式:

wKioL1ffh1zxrWyBAABWIIpcZxk490.png

wKiom1ffh43AOqRTAAANJQGhqi0979.png

由此可見,系統的掛載關系已經被破壞,我們根據上面的提示,寫好掛載配置文件/etc/fstab后重啟系統,讓系統自動掛載,然后再重新進入救援模式,恢復/boot目錄!


寫掛載配置文件之前,我們必須要知道/boot在哪個位置上,此時df命令已經不行了,此時我們可用fdisk -l來查看,
而根在哪個分區上,fdisk -l
命令是不容易看出來的,我們只能通過“試”的方法:多創建個幾個目錄,如/mnt/sda#,然后分別掛載除/boot即引導分區以外的其它幾個分區!直
至找到為止;另外,我們還得知道文件系統類型,我們可用bldid命令來獲取!

wKioL1ffh6WQ-tN9AAAUncWqUzA363.png

wKiom1ffh7jDMJNNAAA2M3mzgeU136.png

wKiom1ffh8uTCv2aAAAxpIqub4s537.png

此時,我們已經知道根在/dev/sda2上,而/boot在/dev/sda1上,且文件系統類型為ext4,OK,我們來書寫/etc/fstab吧,然后重啟讓系統自動掛載之!

注意:此時的/etc/fstab在/mnt/sda2上,即路徑為:/mnt/sda2/etc/fstab

但當我們書寫系統掛載配置文件時發現:

wKioL1ffh96yvAD8AAAECp5qK-8015.png

wKioL1ffh_PAJNCHAAADlkx7oiA883.png

錯誤很明顯,路徑錯了!注意設備的掛載。

wKiom1ffiAajS6CmAAAHAb-uBUE169.png

掛載關系好了之后再重啟系統讓其自動掛載:

wKioL1ffiBihCFkSAAAkeVg9aD4925.png

掛載關系無誤后就可以安裝kernel并重裝grub了:

8.在邏輯卷的系統上刪除/boot及/etc/fstab

兩樣地,如何系統是邏輯卷分區的,當刪除/etc/fstab后在救援模式下也是無法查看具體的分區情況的,在做實驗之前,我們先對該系統的邏輯卷情況做一大致了解:

wKiom1ffiDPDwDJQAACIbjRXwBk884.png

wKioL1ffiEnBeoPjAACEyj7leIo084.png

wKiom1ffiFqSilQFAABn7KsvGF8032.png

wKiom1ffiGywYtKRAACC9_XEOKg525.png

wKioL1ffiH3QqNKbAADCcQNLHxA242.png

wKiom1ffiJKTT4noAADb28XJXig757.png

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

wKiom1ffiT_gl4peAAAQbksGmTA857.png

因為此時vmlinuz也被刪除了,故grub也無能為力,我們進入救援模式:

wKioL1ffiVXisTXiAAAM0LFYmck342.png

查看分區情況:我們能了解到/boot分區在/dev/sda1上,另外,只能了解到/dev/sda2為邏輯卷,但具體如何分的還不得知

wKiom1ffiWmhSjQCAAA6EBCqcuY404.png

wKioL1ffiXvyRy3dAAARdtyek4E413.png

此時我們用lvscan命令來掃描一下邏輯卷:此時即可發現邏輯卷的具體分區情況以及狀態。

wKioL1ffiYyBwjn-AAAPxs0Q4SY385.png

再將inactive的邏輯卷激活:vgchage -ay

wKiom1ffiaTSMI0LAAATzObZjIw424.png


時,根據上一個的經驗,我們應該先寫好系統掛載的配置文件,然后重啟系統讓其自動掛載,再rpm安裝kernel,重裝grub,即可大功告成!與上個實
驗唯一不同的是,這個邏輯卷實驗我們用lvscan時就能夠知道根/
分區在哪(本實驗在vg0上,而vg0在/dev/sda2上),于是,我們即可把根先掛載上,然后切根,再書寫/etc/fstab文件。

wKioL1ffibewaz8WAAAiJ9rv7YM932.png

wKioL1ffic2gju2wAAAgAUI0b6Q045.png

重啟系統使其自動掛載:

wKiom1ffieLQl2ZJAAAUPcakyXM011.png

wKiom1ffifjh0uOGAAAhifWlVQo989.png

看到掛載關系已經正常,此刻我們就可以rpm安裝kernel,然后重裝grub了。

安裝kernel:

wKioL1ffig2yLs0kAAAj0SeQBZQ737.png

重裝grub:

wKiom1ffiibwcODAAAAVmloXN8k946.png

grub.conf

wKiom1ffij6jEafPAAAMvjCGAjk040.png

至此,就可以重啟系統了!

wKioL1ffjrDyP56qAAAeZkNWElA648.png

最后,我們做一個grub的自我保護機制小實驗:

GRUB的界面也支持命令行接口,在GRUB界面可以按照提示輸入e、b、c等命令進行相應的編輯,在對應的title中輸入c可以進入命令行模式,在命令行中可以輸入一個信息如:

help: 獲取幫助find: 文件查找,通常用于定位文件,方法find(hd#,#)/root
kernel
initrd
boot

wKioL1ffjsLyo9lTAACrMMO0lkE506.png

wKiom1ffjtXAHv-5AAArqE8UQ5M516.png

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 ~]#

wKiom1ffju2Rdx_jAADht9awLtc396.png

提示按"p" 鍵輸入密碼:用于保護grub.conf的編輯功能

wKiom1ffjv-jTDb0AAAUOWcEDzc164.png

wKioL1ffjw_zpwKiAAAVSRQ-3tU061.png

正常的grub界面:

wKioL1ffjyGToK-bAAAWODcwoio859.png

選中相應的菜單直接回車試圖啟動系統時,提示輸入密碼:

wKioL1ffjzHSptIiAAADNpiLrV4375.png

然后系統就可以啟動了!

如果是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

(1)
LiansirLiansir
上一篇 2016-09-19
下一篇 2016-09-19

相關推薦

  • Linux用戶和組管理

    使用對象:Linux初學者   Linux系統中用戶和組管理是很重要的一部分內容。許多初學者在學習或剛接觸到用戶管理的時候會覺得很難理解,命令多、選項多、配置文件也多,用命令可以修改,用配置文件也可以修改,三兩下就被繞進去了。其實完全沒必要暈,只要了解了用戶管理的方式,就會很容易理解命令選項與配置文件之間的關系。下面我們就來了解下用戶管理命令與配置…

    Linux干貨 2016-10-23
  • linux文件管理命令與命令行展開

    linux文件管理命令與命令行展開

    2017-12-11
  • 用戶管理命令之NBA版

    用戶管理命令之NBA版 本文純屬扯淡,如有不嚴謹之處,還請海涵。 1 groupadd 作用:創建一個屬組 格式:groupadd [選項] 屬組名 選項: -:選項為空 創建新屬組 -g:指定組GID,默認是GID+1 實例 1.1 添加屬組team,指定組ID為1111      groupadd -g …

    Linux干貨 2017-03-27
  • Redis應用場景

    1.  MySql+Memcached架構的問題   實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據加載到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:   1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據…

    Linux干貨 2016-03-22
  • dd命令詳解

    dd命令: convert and copy a file用法:  dd if=/PATH/FROM/SRC of=/PATH/TO/DEST   bs=#: block size, 復制單元大小   count=#:復制多少個bs   of=fil…

    Linux干貨 2017-03-19
  • AWK文本工具和軟件包管理

    AWK文本工具 兩種版本1.nawk ??2.gawk gawk ?? 模式掃描和處理語言 選項: -F 指明輸入時用到的字段分隔符 -v ?var=value:自定義變量 基本格式: awk [options] ’program’???file…. program:pattern{action statrments;………

    Linux干貨 2018-03-15

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-09-23 11:30

    文章操作性很強,對于一些操作,也有理論性的分析,贊一個。

欧美性久久久久