Linux 啟動故障與排除

誤刪除/boot/grub/grug.conf

/boot/grub/grub.conf 檔記錄開機磁碟分割位置、核心檔位置、映像檔檔案系統位置,同時指定根分割區以及掛載方式。如果該設定檔被刪除,系統啟動的時候會出現什麼情況呢?這個場景很容易模擬,只需要將該檔臨時移動到 /tmp 目錄下並重啟系統,然後可以看到系統停在 GRUB 界面的 GRUB Shell 上(圖10)。如果系統上沒有其他檔被破壞,只需要按照丟失的 grub.conf 內的檔案格式,在 GRUB Shell 中使用其特有的命令語法,指定正確的開機磁碟分割、核心檔的絕對路徑名稱以及根分割區、initramfs 映像檔檔案系統相對路徑名就可以。在 GRUB Shell 中指定資訊方法如下。

圖10:因誤刪除 /boot/grub/grub.conf 所導致的啟動問題。
圖10:因誤刪除 /boot/grub/grub.conf 所導致的啟動問題。

root (hd0,0)
kernel /vmlinuz-3.8.13-16.2.1.el6uek.x86_64 ro root=/dev/VolGroup/LogVol01
initrd /initramfs-3.8.13-16.2.1.el6uek.x86_64.img

第一句 root 表示指定開機磁碟分割。不管硬碟是什麼類型,在 GRUB Shell 中都統一使用 hd 來表示。而且 GRUB Shell 中的第一用 0 表示,所以 hd0,0 表示第一塊硬碟的第一個分割區為 boot 分割區。第二句 kernel 表示指定核心檔的絕對路徑名稱,這裡的絕對路徑是以 /boot 分割區的根目錄為參照點。可以用 tab 鍵補齊檔案名,在 kernel 這一行的 root 用於指定真正的根分割區,ro 用於指定根檔案系統的掛載方式為唯讀。第三句 initd 指定映像檔檔案系統的絕對路徑名稱。從 RHEL6 開始,映像檔檔案系統統一更名為 initramfs 開頭的檔,一般指定了核心檔之後需要指定與其版本號相同的 initramfs。在 RHEL5 以及之前版本的 Linux 系統上,映像檔檔案系統名稱則是 initrd 開頭的檔。

當這三樣資訊指定完成之後,最後輸入 boot,表示使用上述臨時指定資訊來啟動系統(圖11)。

圖11:在 GRUB Shell 中指定開機磁碟分割、核心檔、根分割區以及映像檔檔案系統。
圖11:在 GRUB Shell 中指定開機磁碟分割、核心檔、根分割區以及映像檔檔案系統。

如果所有資訊指定都正確,而且系統沒有其他檔被損壞,載入了映像檔檔案系統之後,就會有一個 Switching root 的動作,這表示系統已經能夠從映像檔檔案系統,切換到真正的根檔案系統,如無其他錯誤,系統即可啟動成功(圖12)。

圖12:從映像檔檔案系統切換到真正的根並完成後續啟動過程。
圖12:從映像檔檔案系統切換到真正的根並完成後續啟動過程。

但目前我們只是靠臨時指定的資訊進入到系統中,臨時資訊只對這一次啟動生效,下次重啟系統之後還會碰到同樣的問題。所以最後需要手工重建 /boot/grub/grub.conf 檔案。最簡單的方式,是參照 grub.conf 的範本,根據系統上的實際資訊手工編寫一個 grub.conf 檔案。grub.conf 的範本可以在 /usr/share/doc/grub-0.97/ 找到,檔案名為 menu.lst。以下是參照 menu.lst 手工建立的 grub.conf 檔,內容雖然簡單,但足以使系統正常啟動起來。
timeout 10
default 0
title  CentOS 6.5
root   (hd0,0)
kernel /vmlinuz-3.8.13-16.2.1.el6.x86_64 ro root=/dev/VolGroup/LogVol01
initrd /initramfs-3.8.13-16.2.1.el6.x86_64.img
如果有多個核心,可以增加新的 title,以及在 title 下定義另外一套 root,kernel,initrd 映像檔。保存退出再重啟系統,GRUB 即可按照所定義內容自動完成後續啟動引導。

誤刪開機磁碟

在真實環境中,很多的誤操作通常會刪除開機磁碟分割中更多的內容,而不只是一個設定檔。在下面的實驗中我們將 /boot 分割區中所有的內容都移動到 /tmp 目錄下,然後卸載 /boot 分割區,並對其所在的 /dev/sda1 設備執行一次格式化,這樣可以保證將上面的資料徹底全部幹掉,然後再介紹這種情況下的修復思路和操作方法(圖13)。

圖13:徹底清空了 /boot 檔案系統。
圖13:徹底清空了 /boot 檔案系統。

完成所有的破壞性操作重啟系統後,看到的第一個系統界面是 GRUB Shell。問題來了,既然剛才已經將開機磁碟分割所在的檔案系統 sda1 整個格式化了,為什麼開機之後還是能讀取到 stage2 呢?這其實就是 GRUB 啟動引導管理器最難理解的一個地方。作業系統安裝時預設只會安裝 stage1,Start.S 和 stage2,並且在系統啟動時,通過硬體跳轉而非檔案系統的方式,去存取和載入 stage2。所以剛才的操作,只相當於在檔案系統上刪掉了 stage2 的 inode,而並沒有破壞 stage2 主體。所以即便格式化了開機磁碟分割,開機之後通過硬體跳轉還是能讀取 stage2,因此 GRUB Shell 便可以載入成功。除非用其他檔案將 stage2 覆蓋掉,或者是直接將 /boot 檔案系統用 dd 破壞掉,就另作別論了。現在 GRUB Shell 雖然能顯示出來,但是當載入核心和映像檔檔案系統時,會因為找不到相關檔而錯誤(圖14)。

圖14:無法找到核心和映像檔檔案系統而錯誤。
圖14:無法找到核心和映像檔檔案系統而錯誤。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。