Linux 啟動故障與排除

GRUB 被徹底破壞

剛才我們假設在整個開機磁碟分割上的內容已被刪除,但其實簡單的刪除命令甚至是格式化操作,都不會破壞啟動引導管理器的主體 stage2。而且預設情況下,作業系統對 stage2 的存取也並不通過檔案系統實現。所以只要在開機的時候能顯示出 GRUB Shell,可以說破壞程度也不算嚴重。在下面的這個場景中,我們將假設系統整個開機磁碟分割被徹底破壞的修復方法。徹底破壞包括了對 GRUB 的 stage2 的破壞,這次我們將通過 dd 的方式,將開機磁碟分割上的檔案系統和所有資料全部幹掉。具體方法是先將開機磁碟分割 /dev/sda1 卸載,然後執行以下命令徹底破壞開機磁碟分割。
dd if=/dev/zero of=/dev/sda1 bs=1M    (ENTER)
該命令可以將整個開機磁碟分割上每一個設備塊徹底清洗,完成之後再重新開機,看到的故障現象會和剛才完全不同,整個系統進入了黑屏的狀態,沒有任何錯誤。之前曾經提到,如果設備啟動之後確認在 BIOS 自檢階段沒有任何錯誤,而又同時沒有見到任何的 GRUB 提示資訊的情況下,則可以判斷問題多數和 GRUB 有關係。但是由於沒有任何提示資訊,要了解開機磁碟分割的狀況,還是只有先進入到 Rescue 模式。在 Rescue 模式下,手動掛載 /dev/sda1 即出現無法讀取檔案系統的錯誤提示,而且當執行 blkid 驗證時也無法顯示 /dev/sda1 的檔案系統,那麼就基本上可以判斷出問題所在了(圖23)。開機磁碟分割上連檔案系統都沒有,怎麼可能會有其他關鍵檔案呢?

圖23:/dev/sda1 檔案系統被徹底破壞。
圖23:/dev/sda1 檔案系統被徹底破壞。

這次的破壞程度更嚴重,修復的步驟也多了一步,就是恢復 GRUB 啟動引導管理器的核心功能。先手動建立開機磁碟分割檔案系統,然後手動安裝 GRUB,接著才是重裝核心,重寫 grub.conf 以及最後更改 /etc/fstab 設定檔。以預設方式進入到 Rescue 模式中,確保系統自動掛載根分割區到 /mnt/sysimage 目錄下,然後重建 /dev/sda1 上的檔案系統。
mkfs.ext4 /dev/sda1    (ENTER)
並手動將 /dev/sda1 掛載到 /mnt/sysimage/boot 目錄下。

重建 GRUB

重建分為兩個步驟,先 chroot 到 /mnt/sysimage 目錄下,然後執行命令,將 GRUB 的一些關鍵檔複製到開機磁碟分割 /boot/grub 目錄中。
Grub-install /dev/sda    (ENTER)
如果執行 exit 切換回 Rescue 模式的光碟根目錄,再進入到 /mnt/sysimage/boot/grub 目錄下,可以看到產生了一堆 GRUB 相關檔,這些檔都是剛才執行 grub-install 命令所建立的(圖24)。

圖24:通過 grub-install 複製 GRUB 的關鍵檔到開機磁碟分割。
圖24:通過 grub-install 複製 GRUB 的關鍵檔到開機磁碟分割。

第二步是在 chroot 狀態下執行 grub 命令,進入到 GRUB Shell 當中,先執行以下命令來確認系統的開機磁碟分割:
root (hd0,0)(ENTER)
然後執行:
setup (hd0)(ENTER)
將 GRUB 安裝到 Boot Sector(圖25)。從命令的輸出可以看到,通過 setup (hd0) 將 GRUB 安裝到硬碟頭部的過程中,會安裝 stage1.5,stage1.5 的安裝需要 27 個磁區,而在檔案系統之前的 boot sector 一共有 63 個磁區,所以這段空間足夠容納 stage1.5。stage1.5 的主要作用,是使 GRUB 獲得檔案系統定址能力。因此系統如果重新開機,載入 GRUB 的順序將變成了 stage1、Start.S、stage1.5、stage2,而且因為有了檔案系統定址能力,所以 GRUB 載入 stage2 是通過檔案系統定址,而非通過之前的硬體定址實現。

圖25:通過 GRUB Shel 將 grub 安裝到 Boot Sector。
圖25:通過 GRUB Shel 將 grub 安裝到 Boot Sector。

驗證的方式也很簡單,在恢復之後的系統上,一旦刪除了 /boot/grub/stage2,GRUB 就會報出另外一種 Error 15 的錯誤(圖26)。其實也可以選擇另外一種方案,將 GRUB 安裝在分割區的頭部(圖27),不過這個時候分割區到檔案系統之間只有一個磁區的空間,因此無法安裝 stage1.5,所以系統啟動引導時將還是會通過硬體跳轉方式去尋找 stage2。當在 GRUB Shell 中完成 GRUB 在開機磁區的安裝之後,重啟系統將可以看到熟悉的 GRUB Shell 界面。那麼剩下的步驟就和上一個場景的修復一樣,掛載光碟,安裝核心的 rpm 套件,以及生成對應的映像檔檔案系統 initramfs,在 /boot/grub/ 目錄下建立和修改 grub.conf 指定啟動資訊,修改 /etc/fstab 檔。此過程和之前的例子一樣,這裡不再贅述。

圖26:因無法通過檔案系統定址 stage2 所導致的錯誤。
圖26:因無法通過檔案系統定址 stage2 所導致的錯誤。
圖27:將 GRUB 集成在開機磁碟分割頭部。
圖27:將 GRUB 集成在開機磁碟分割頭部。

發佈留言

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