手撕開機grub-rescue問題
在實際折騰Linux的過程中,遇到grub-rescue問題是件很正常的事情。實際上這個問題,沒有什么技術含量,但是要看什么場合。
記得之前教了某個MM玩Linux,主要也是工作需要吧。本來一切都是很美好的,可是下午卻被一通電話吵醒了。電話的那頭很著急的跟我說,她的電腦啟動不了了,電腦啟動不了的理由有千萬種死法。于是我平靜的問她,由什么提示或輸出嗎?
然后她跟我講屏幕中出現了grub resuce的字樣。對于這樣的情況,不用說我都知道,她把某些東西給搞壞了。但是按照網上的教程卻無法修復,于是詳細詢問后就有了這篇文章了。
實話說,grub2主要分為2個部分,一部分一般情況下寫在MBR中,而另1部分寫在某個分區的/boot/grub目錄中。如果grub沒有正確的被安裝就可能會引發上面的問題。
對于這樣的問題,我們可以通過如下的方式來進行修復:
- 找到Linux安裝的分區
- 進行臨時grub的關聯
- 重新生成grub
下面我們分別來進行說明。 在這里,要修改的Linux為Ubuntu 14.04版本,對于其他的發行版也是類似的。
找到分區
我們先在提示符grub rescue>下輸入命令ls列出所有的磁盤分區信息,這里假設得到如下的結果:
- (hd0),(hd0,msdos8),(hd0,msdos7),(hd0,msdos6),....
接著,我們需要嘗試列出某個分區上是否存在/boot/grub這個目錄。對于Windows系統的分區來說,會直接得到1個unknow filesystem的錯誤提示。換句話說,我們需要進行如下的操作:
- ls (hd0,msdosX)/boot/grub
在這里,X代表上面分區中得到的數字,比如msdos8中的數字8。
如果按照這種方式應該是可以找到對應分區的,這也是網上教程的方法,但是由于她的電腦中將boot分區單獨進行了分區,因此使用上述的方式會出現1個對應文件不存在的提示。
因此,我們需要將上述的方式修改為:
- ls (hd0,msdosX)/grub
在這里,我們去掉了boot目錄,這樣就可以搜索到對應的目錄了。 對于在使用ls命令時提示文件不存在的情況我們可以進行如下的操作:
- ls (hd0,msdosX)/
進行關聯
緊接著,如果找到了正確的grub目錄后,我們需要將其與grub關聯起來,在這里,我們主要通過set命令來進行設置操作,從而臨時進行關聯操作:
- grub resuce> set root=(hd0,msdos6)
- grub resuce> set prefix=(hd0,msdos6)
而GRUB的正常啟動過程涉及到通過grub-install生成的核心鏡像的環境變量prefix。而環境變量root主要用于從前綴中加載normal模塊。
在這里,我們假設正確的分區為(hd0,msdos6),我們通過set命令設置其root和prefix都為該分區。之后我們需要進行加載的操作了:
- grub resuce> insmod normal
- grub resuce> normal
在這里,normal命令會讀取/boot/grub/grub.cfg文件并運行菜單。
重新生成grub
通過上述的方式我們可以現實丟失的grub菜單了。此時不要高興的太早了,因此這只是臨時的關聯,如果重啟的話,這個問題還是會再次出現的。為了解決這個問題,我們需要進入Linux中重新生成grub來進行修改:
- cat@cat-pc:~$ sudo update-grub
- Generating grub configuration file ...
- Found theme: /boot/grub/themes/deepin/theme.txt
- Found background image: /boot/grub/themes/deepin/background.png
- Found linux image: /boot/vmlinuz-4.4.0-2-deepin-amd64
- Found initrd image: /boot/initrd.img-4.4.0-2-deepin-amd64
- Found Windows 7 (loader) on /dev/sda1
- done
- cat@cat-pc:~$ sudo grub-install /dev/sda
- Installing for i386-pc platform.
- Installation finished. No error reported.
在這里,我們假設使用的是deepin的發行版,然后使用update-grub重新生成grub菜單。***再使用grub-install將其安裝在硬盤上。
這樣,我們就***的解決了開機啟動時grub rescue導致無法正常啟動的問題了。
如果某天某個MM向你咨詢這個問題,不要吝惜這樣的好機會,因為花不了你10分鐘又可以拉近關系。
參考文章: