運行環境:centos6 Vmware
一、系統啓動流程介紹
linux系統啓動時我們可以看到很多啓動信息,整體來說系統啓動分爲以下幾個過程:
加電自薦:power on system test
選擇啓動程序,加載MBR
加載系統內核Kernel,執行系統初始化信息
啓動用戶空間第一個執行程序init
用戶登陸系統
(1)加電自檢
自檢主要是檢測一下硬件設備是否存在並能正常工作,簡單來說加電過程就是給CMOS通電,然後啓動其上的BIOS程序,BIOS程序會根據CMOS上面的一些配置信息去讀取其他的硬件設備信息並檢測是否存在並能正常運行,之後進行硬件設備的初始化。
(2)選擇啓動程序,加載MBR
在硬件設備初始化後,BIOS會列出一些可以啓動的裝置順序,啓動管理程序來處理核心文件的加載問題,啓動管理程序就是Boot Loader,它是一個程序,所以也依賴於一個硬件之上,所以這個硬件就爲硬盤,準確的說爲第一個可以啓動的硬盤的第一個扇區內,就是我們之前談到的MBR(Master Boot Record,主引導紀錄)當中。Boot Loader有兩個主要功能,第一是去識別、加載操作系統的核心文件,並提交到內存中運行,進而來啓動對應的操作系統,另一個主要的功能就是提供菜單信息,並將啓動管理功能轉交給其它的加載程序。(Windows操作系統不具備將啓動管理功能轉交給其他的加載程序的功能,所以要同時裝linux系統和windos操作系統時一定要先裝windows操作系統,最後安裝Linux系統,通過Linux系統提供的Boot Loader菜單列表可以選擇啓動Windows操作系統的Boot Loader信息,也就是將啓動管理功能的控制權轉交給Windows系統分區的第一個扇區當中的Loader程序,然後完成 Windows的啓動。)
(3)加載系統內核Kernel,執行系統初始化信息
在Boot Loader開始讀取操作系統內核文件後,內核文件解壓縮後裝在到內存當中,然後根據內核提供的功能開始測試與加載各個設備,內核文件通常放在/boot目錄當中,並且是一個以VMlinuz開頭的文件,所以這裏我們遇到了一個問題,雞與蛋的問題(內核程序沒有加載到磁盤,就沒有辦法讀取系統上的內核文件,如果先去加載磁盤,就必須有磁盤的驅動程序),所以爲了解決這個維妮塔,我們採用一種叫做虛擬文件系統來解決這個問題,虛擬文件系統也放在/boot目錄下,是一個以initrd開頭的文件,這個文件可以通過Boot Loader程序將其加載到內存當中,這個文件會被解壓縮並且在內存中模擬一個根文件系統,Boot Loader可以加載kernel與initrd,然後再內存中讓initrd解壓縮解壓縮成根目錄,然後內核可以再這個虛擬的根文件系統之上加載合適的驅動程序,來加載硬盤等設備,之後釋放虛擬的根文件系統,並且以制度方式掛載磁盤上真實的根文件系統,之後開始正常的啓動過程。
(4)啓動用戶空間第一個執行程序init
init的配置文件中centos6中採用Upstart的方式,其特點時守護進程間的通信依賴於D-Bus進行,在該文件中有一個非常重要的配置項目,就是默認的系統啓動級別,分爲以下幾種:
0 :關閉所有服務:關機
1:單用戶模式,sigle模式,該級別可以允許root用戶直接登陸而無需認證
2:多用戶模式,需要用戶認證,會啓動網絡功能
3:完全多用戶模式,文本界面
4:預留級別
5:完全多用戶模式,圖形界面
6:關閉所有服務,重啓
通常使用較多的默認級別爲3或者5,切換方式爲命令init[0-6],通常可以使用命令runlevel來查看運行的級別
二、常見問題解決
(1)系統啓動時默認直接進入光盤引導系統
MBR分區前446字節被破壞,也就是對應着stage1 階段,/boot/grub目錄下的一階段文件丟失,所以導致無法引導。可通過救援模式進入光盤自帶shell,通過命令chroot 切換至真根模式。通過df命令模式查看到當前真根被掛載到/mnt/sysconfig目錄下,如圖所示:
df
chroot /mnt/sysconfig
進入救援模式後查看MBR前512字節中前446字節都爲0,且/boot/grub目錄下stage1階段文件全部丟失
hexdump -C -n 512 -v /dev/sda
我們可以通過命令來生成丟失的stage1階段的文件以及向mbr添加數據
grub-install /dev/sda(注意:這裏要直接跟硬盤名稱,不能跟分區名,如sda1,該操作是對整個硬盤)
添加完之後可以通過hexdump命令查看MBR數據,以及/boot/grub下的文件
(2)系統正常引導,但提示1.5錯誤
系統提示1.5錯誤,意味着/boot/grub目錄下的1.5階段文件丟失以及MBR從512字節之後大量字節丟失。解放方法和上文(1)相同,使用相同命令,該命令會自動補齊grub目錄下除grub.conf文件的所以文件。(也可能是/boot目錄下的文件全部丟失,解決方法請看實驗)
grub-install /dev/sda
(3)系統登陸時停留如下圖界面
系統stage2階段文件丟失,可以進入救援模式進入真根模式編輯,該方法會在下文中演示)也可以通過輸入命令暫時進入系統,進入後還需要編輯/boot/grub目錄下的grub.conf文件
root (hd0,0)
找到根目錄文件,需要一個一個進入測試,table鍵顯示文件
找到後按下Enter鍵,輸入kernel /以及Table鍵補齊
這樣就可以正常進入系統,不過只是本次生效,如果不進入/boot/grub目錄配置grub.conf文件,下次開機還需要手動配置。
(3)當遇到(2)的情況時,手動配置kernel 按Table鍵時什麼都不顯示,無法手動配置
當無法手動Table不出自己需要的信息時說明/Boot文件下的文件丟失,所以在我們需要的時候無法手動Table出文件名,所以此時只能進入救援模式,通過chroot命令進入真根模式,安裝丟失文件。
進入救援模式,切換真根環境,發現/boot目錄裏面只有一個gurb目錄,grub目錄中還丟失了grub.conf文件,所以我們需要編輯grub.conf文件,以及安裝/boot下的文件
mount /dev/cdrom1 /media(因爲這個系統的虛擬機有兩個光盤,所以是cdrom1)
rpm -ivh /media/Packages/kernel-2.6.32-696.e16.x86_64.rpm --force(這裏需要強制覆蓋以下,因爲內核本來就沒有刪除,這裏只是要恢復需要的內核文件)
這裏可以看到/boot目錄下文件已經從新生成
進入grub目錄下編輯grub.conf文件
vim /boot/grub/grub.conf
三 、實驗
誤刪除系統中的fstab文件以及/boot目錄下的所有文件
1、進入救援模式
2、當我們用命令chroot進入真根環境時提示錯誤,因爲/etc/fstab文件丟失,系統無法開機自動掛載,這裏我們需要手動掛載根目錄到光盤提供的目錄,如圖所示,這樣以便我們能進入真根環境
mount /dev/sda2 /mnt/sysimage
3、首先要恢復丟失的/etc/fstab文件,然後我們才能真正進入/boot目錄中就行配置,從假根環境中通過blkid命令將結果輸出重定向到真根環境中/etc/fstab中
blkid >> /mnt/sysimage/etc/fstab
chroot /mnt/sysimage/
4、編輯真根環境/etc/fstab文件
vim /etc/fstab
將剛纔導入的結果及進行編輯,寫入正確的格式
這裏建議重新啓動,讓系統重新自動掛載,也可以使用命令mount -a,但是會有些錯誤發現不了,比如該命令支持UUID等號後面有雙引號,如果你的fstab文件中UUID等號後面都帶了雙引號,mount -a當時可以生效,但是當你再次進入救援系統時還是無法掛載,這裏重啓啓動後就可以看到系統已經正常掛載。
5、通過df命令查看已經正常掛載,恢復/boot目錄下的文件
rpm -ivh /media/Packages/kernel-2.6.32-696.e16.x86_64.rpm --force(修復除/boot目錄下除了grub目錄的所有文件)
grub-install /dev/sda(自動再/boot目錄下創建grub目錄,並創建除grub.conf文件外的所有文件)
vim /boot/grub/grub.conf(上文中已經提到如何編輯)