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