歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 雙系統grub菜單破壞修復方法

雙系統grub菜單破壞修復方法

日期:2017/3/1 16:35:25   编辑:關於Linux
雙系統grub菜單破壞修復方法 今天下午把E盤和F盤合並了,再重啟電腦後,發現不能進入系統了,無論是vista還是fedora,極其郁悶了。google了一下,用了以下grub命令解決了: 1: grub>root (hd0, 0) 2: grub>makeactive //這句可加可不加 3: grub>chainloader +1 4: grub>boot www.2cto.com 突然間覺得grub很強大啊,有了想研究的沖動,於是又google。 這裡所說的Grub和上文中說的Grub for DOS是不一樣的,上文的Grub跟磁盤的第一扇區沒有關系,即是說,如果你把上面C盤裡grub目錄刪除,不會影響你的系統啟動。我下面講的Grub卻會把一部分代碼寫到磁盤的第一扇區上,即會寫到主引導紀錄MBR中。 www.2cto.com
1 Grub的代碼分兩部分,一部分寫入第一扇區的主引導紀錄MBR中,另一部分駐留在磁盤的某一固定位置。
2 Grub的工作過程。計算機啟動後,BOIS先做自檢等工作,然後BOIS會加載磁盤的第一扇區(512字節)到內存某處,然後跳轉到該處執行代碼,這段代碼就是上面所說的Grub寫入MBR的部分,這段代碼有Grub第二部分在磁盤上的位置信息,這段代碼就是根據此信息加載第二部分,第二部分才是Grub的核心,第二部分會讀取/boot/grub/grub.conf配置文件,然後
根據此配置文件彈出用戶界面,你看到的那些菜單選擇項就是這麼來的,當然,你也可以按字母鍵‘C’進入命令行方式。
3 如上所說,你的機器上的各操作系統的信息是寫入配置文件grub.conf的,如果你的配置文件不正確,grub當然找不到你想起動的操作系統了,此時需要你手工啟動。例如你因為在Windows裡格式化某盤(或別的原因),結果重啟機器後grub漂亮的界面不見了,只留下陌生的提示符“grub>”,別慌,你可以用命令來啟動你的操作系統。
從命令行啟動Windows: 1: grub>root (hd0, 0) 2: grub>chainloader +1 3: grub>boot 從命令行啟動Fedora Core2(假設裝在/dev/hda7上): 1: grub>kernel (hd0, 6)/boot/vmlinuz-2.6.5-1.385.img root=/dev/hda7 2: grub>initrd (hd0, 6)/boot/initrd-2.6.5-1.385.img 3: grub>boot 或者: 1: root (hd0,6) 2: kernel /vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet 3: initrd /initrd-2.6.26.5-28.fc8.img 4: boot 注:不同的系統的vmlinuz和initrd不一樣,請根據實際使用的系統來填寫。 下面就一一解釋這幾命令。
第1行命令:指定/boot所在的分區。
要是不知道自己的/boot分區在哪裡,沒關系,先輸入root (hd0,然後按Tab鍵,它會顯示可能的分區,然後根據分區類型判斷/boot分區。我就是這麼做的......所以Tab鍵是linux裡很好用的一個鍵。這裡指定/boot分區並不是必須的,在這裡省略的話要在kernel以及initrd中指定,即:kernel (hd0,2)/vmlinuz-2.6......和initrd (hd0,2)/initrd-2.6......
關於"hd0,2”,是指第一塊硬盤的第三個分區,這是一個主分區。linux裡的分區表示方法有兩種:一是像"hd0,2"這種純數字表示法,它是以"hd0,0"開始,意思是第一塊硬盤的第一個分區;第二塊硬盤就是hd1。還有一種是hda1這一種,它也表示第一塊硬盤的第一個分區;第二塊硬盤就是hdb。兩種表示法用在不同的場合,純數字表示法一般用在grub中指定/boot分區;第二種方法是日常使用的表示法,硬盤掛載等都用這種表示法。關於主分區與擴展分區,這裡稍微提一點:擴展分區是從hdx5或hdx,4開始的,其中x代表硬盤號。要更加詳細的了解linux的分區表示法,Google一下。
第2行命令:指定內核映像及根分區。
輸入kernel /vmlinuz,然後按Tab鍵補全內核映像全名;補全以後可以看到我的fedora內核映像是vmlinuz-2.6.26.5-28.fc8。如果有一個以上的內核,它會全部顯示出來讓你選擇(這種情況遇到過,從8升級到9以後,我的啟動菜單裡就有了兩個映像)。還有就是,我的/boot分區不是在根分區中,而是一個獨立的分區;如果/boot分區不是一個獨立分區,而是位於根分區中,就要這樣寫: kernel /boot/vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet,下面的initrd要寫成:initrd /boot/initrd-2.6.26.5-28.fc8.img。映像後面的部分是用來指定根分區的,要手動輸入。ro的意思是read only,root=/dev/VolGroup00/LogVol00是根分區位置,rhgb意思是圖形化啟動過程,quiet意思是不要顯示啟動信息。在實際操作中,我發現內核映像以後的部分其實不是必須的;也就是說,即使不輸入這部分內容,不指定根分區,不指定圖形化啟動過程,不省略啟動信息,也可以正確啟動。對於不必指定根分區,是否跟我的系統是單內核有關系?
這行命令要多理解一下。首先,vmlinuz中,vm是指vritual memery,linuz的意思是說,這一個經過壓縮的內核映像。還有,這一行命令中的root跟第一行命令中的root表達的不是同一意思。第一行命令中的root指的是系統的啟動分區,即/boot分區;第二行命令中的root指的是系統的根分區,即/分區。要詳細理解兩者的區別,就牽涉到linux文件系統及目錄結構,它是linux中關鍵性的概念之一,我會找個時間寫一些關於它東西,淺談一下我對它的理解。"root="後面的"/dev/VolGroup00/LogVol00"就是根分區的位置;看起來是不是怪怪的?因為我的根分區用的不是普通的硬盤分區,而是邏輯卷,術語叫LVM(logical volume manager)。這個也是linux裡一個很重要的東西。LVM要結合linux硬盤分區及目錄結構來理解,這裡就不談了,否則會越扯越遠,偏離正題。
第3行命令:指定initrd.img
initrd即initial ramdisk,字面上理解是初始化RAM磁盤。它實際上是一個臨時的文件系統,而且是與內核綁定在一起的。一般用來加載必須的系統文件、驅動程序和存儲設備等,系統啟動以後它立刻被釋放。據說,在沒有其它存儲設備的情況下,它就是永久的系統。我不是太了解,也寫不出更多的東西來。總之,initrd.img是一個與內核綁定在一起的,用來加載必須的系統文件的臨時文件系統。
第4行命令:啟動系統。輸入boot,敲回車鍵即可啟動系統。
系統啟動以後,再想一下這個手動啟動的過程,如果了解grub的話,手動啟動系統並不復雜。而啟動菜單呢,很像是根據我們手動輸入的內容編寫而成的一個腳本。這個“腳本”讓你在啟動系統時不必每次都手動輸入,所以這個“腳本”還是很有用的,我們還是手動編寫一個吧。
若了解linux目錄結構的話,就會知道啟動菜單在根分區的boot文件夾下的grub文件夾中。grub文件夾中還有一個menu.lst,它是grub.conf的鏈接文件。你可能有點疑問:你的/boot分區不是一個獨立的分區,不在根分區中麼?其實這就是linux與windows不同的地方之一,它是通過掛載的方式與根分區產生關系的,這牽涉到文件系統和目錄結構方面的東西,這裡不詳談。找到並打開grub文件夾,創建一個grub.conf,你需要root權限!
grub.conf該怎麼寫呢?和上面輸入的命令基本相似。下面是我虛擬機中fedora的grub.conf的內容:

其中,加#號的都是注釋文字,啟動時是被忽略的。核心部分如下:
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu title Fedora (2.6.26.5-28.fc8)
root (hd0,0)
kernel /vmlinuz-2.6.26.5-28.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.26.5-28.fc8.img
第一行,default項,表示默認啟動的系統。0代表按照grub中的順序默認啟動第一個系統,改為1,則是默認啟動第二個系統。以此類推。第二行,timeout項,表示選擇菜單等待時間為5秒。這個可以自己設定選擇菜單等待的時間。第三行,splashimage項,表示開機啟動時出現的背景畫面。若不想讓畫面顯示,可以在前面加#號以忽略。第四行,hiddenmenu項,表示隱藏選擇菜單,加#號表示不隱藏。若裝了雙系統又不想讓它出現選擇菜單,可以把前面的#號去掉。第五行,title項,選擇菜單上出現的系統標題。下面的就不用再解釋了。。。
仿照這個grub.conf另外寫一個啟動菜單,注意我實際電腦中的/boot分區是(hd0,2),其它的完全照搬。然後把它放在/boot/grub中,就可以正常啟動fedora了。但是我的實際的電腦中裝的是xp和fedora雙系統,按照那個啟動菜單雖然可以正常啟動fedora,卻不能正常啟動xp,仍然需要手動輸入。所還需要在剛才的啟動菜單尾部加上一部分:
title windows xp
rootnoverify (hd0,0) #我實際電腦中xp系統是放在第一個分區中的
chainloader +1
若想讓xp系統默認啟動,把default項改為1。xp這一部分的啟動菜單用了鏈式裝入器,也不必理會什麼意思,照搬就可以了。
現在一份新的啟動菜單就弄好了!
這篇日記算是勉強寫完了。一方面,我也不是特別了解grub,無法作更深入的挖掘;另一方面,這篇日記牽涉到很多linux文件系統、目錄結構、硬盤分區等知識。既要談一點這方面的知識,否則讀起來會很吃力;又不能談的過多,否則會偏離正題。但是不管怎麼說,用命令行啟動fedora是沒什麼問題了...... 從命令行啟動Debian和啟動Fedora Core2類似。
說明:如果你通過分區軟件調整了分區的大小,鬼知道會有什麼結果。我沒試過,從理論上說你玩完了,因為Grub的第一部分中的關於第二部份的地址信息會失效,結果Grub的核心加載不了了!
4 你以後可以使用同樣的方法來啟動系統,如果感到不爽,想要菜單,那就修改你的/boot/grub/grub.conf文件吧。現在機器已經跑起來了
Copyright © Linux教程網 All Rights Reserved