Linux系統啟動流程中grub故障修復(一)
阿新 • • 發佈:2019-01-10
GRUB 是引導裝入器 -- 它負責裝入核心並引導 Linux 系統。GRUB 可以引導多種作業系統,如Linux、 DOS、 Windows 。
GRUB共分為三個階段:stage1主要負責BIOS和GRUB之間的交接,載入存放於各個分割槽中的開機檔案;stage1.5是連線stage1和stage2之間的通道,起著過渡的作用,負責識別stage2所在/boot分割槽的檔案系統,以便進入stage2;stage2是grub的核心部分,在這個階段完成載入核心、載入根檔案系統驅動、掛載根等工作。
1 破壞grub第1階段
如圖所示,用hexdump命令檢視/dev/sda的mbr,即/dev/sda的前512個位元組。mbr的前446個位元組儲存了與啟動相關的資訊,即grub的第一階段。
使用dd命令將mbr的前446個位元組清0,dd命令用指定大小的塊拷貝一個檔案,並在拷貝的同時進行指定的轉換:
if=[STDIN],即輸入裝置或檔案
of=[STDOUT] ,即輸出裝置或檔案
bs指定每個塊的大小,預設以位元組為單位
count指定塊的個數
skip指定跳過多少個塊之後再輸入
seek指定跳過多少個塊之後再輸出
dd if=/dev/zero of=/dev/sda bs=1 count=512表示用0裝置將/dev/sda的前512個位元組覆蓋,即清0。
清0後用hexdump命令確認,如上圖,前446個位元組已全部為0,清0後重啟。
由於破壞了第一階段需要用到的mbr前446個位元組,所以系統認為硬碟已經不具備引導功能了,就不用硬碟啟動了,而是直接進入到光碟啟動介面。為了修復被破壞的第一階段,需要進入光碟救援模式,即Rescue installed system。
此步驟是在詢問是否同意將系統掛載到/mnt/sysimage,選擇continue即可
開啟shell,如圖所示。此時/mnt/sysimage是系統的根,進入/mnt/sysimage下就可以看到原來硬碟的根下的內容。接下來使用grub install命令進行修復。
直接執行grub install報錯,是因為在救援模式的/mnt/sysimage下沒有grub相關命令,需要使用chroot命令切根,切根後使用作業系統自帶的grub命令進行修復。
grub install /dev/sda 開始進行修復,修復過程中可能會報錯:Unknown parttition table signature 未知的分割槽表簽名,忽略即可,不影響修復結果。 注意:grub install命令後需跟某個硬碟,不能跟具體的分割槽,因為mbr在硬碟的第一個扇區,不屬於任何一個分割槽。
如圖,修復成功。修復完成後,用sync將操作同步到磁碟。
用hexdump檢視mbr,可發現前446個位元組已寫入了新的內容。
grub install不僅能夠修復第1階段的相關內容,也可以修復第1.5階段和第2階段的內容,如圖所示,在/boot/grub下產生了第1.5階段和第2階段的相關配置檔案。修復完成後重啟即可。
2 破壞第1.5階段
第1.5階段位於mbr後硬碟上的一小段空間,也不屬於任何分割槽。同樣可以使用dd命令將1.5階段清0,為了不破壞第一階段,需要跳過第一階段所處的前512個位元組,清0後使用hexdump命令進行確認。
然後重啟,觀察能否啟動。
如上圖,可以發現,與破壞1階段後的啟動介面不同,剛才破壞了1階段後,直接進入到了光碟啟動介面,因為系統認為硬碟沒有啟動功能了,不可引導了,所以直接用光碟啟動了,而這一次由於並沒有破壞第一階段,所以系統認為硬碟仍然可引導,就用硬碟進行引導,但由於1.5階段被破壞了,所以就卡在這個地方,無法進入到2階段。修復1.5階段仍然需要進入到光碟救援模式,按任意鍵進入下面的介面。
按ESC進入Boot Menu,以進入到救援模式中。
進入救援模式的過程與第1階段類似,此處不再贅述。
開啟shell後,使用grub命令進行修復,同樣需要切根。
grub是互動式命令,輸入grub後進入互動模式,使用root(hd0,0)和setup(hd0)即可完成修復。
root(hd#,#)hd#表示boot分割槽所在硬碟是系統的第幾塊硬碟,hd即hard disk硬碟,hd0表示第一塊硬碟(之前用sda表示第一塊硬碟);第二個#表示boot分割槽在該硬碟上的第幾個分割槽;
setup(hd#)表示將grub安裝在哪個分割槽上。
注意:此操作需依賴/boot/grub下的一些檔案,若沒有這些檔案,會導致修復失敗。
修復完成後,用hexdump命令可以看到mbr後1.5階段已不再為0,即已經寫入了有效內容。
修復完成後重啟即可。