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,即已經寫入了有效內容。
修復完成后重啟即可。
原創文章,作者:以夢為馬,如若轉載,請注明出處:http://www.www58058.com/86167