用grub命令列啟動系統

xsdan發表於2010-01-15

grub是一個多系統的啟動管理器,不但有linux版本的grub,也有windows版本的grub。可以說,grub是一個非常強大的多系統啟動管理器,具有多重系統引導,互動式操作,可設定grub啟動密碼,可對映硬碟,可以定製開機畫面等等特點。透過命令列啟動系統就是互動式操作的一個應用,至於其它應用,這裡就不再一一列出。想要深入瞭解它的話,可以看一下grub的手冊: [url][/url] 。

[@more@]

閒話少說,先把透過命令列啟動系統的過程列出來。為了解釋方便,特標上行號:
1 root (hd0,2)
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
  怎麼樣?linux的啟動命令列是不是很簡潔啊?下面就一一解釋這幾命令。
  第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 .ly,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,敲Enter鍵即可啟動系統。
  系統啟動以後,再想一下這個手動啟動的過程,如果瞭解grub的話,手動啟動系統並不複雜。而啟動選單呢,很像是根據我們手動輸入的內容編寫而成的一個指令碼。這個“指令碼”讓你在啟動系統時不必每次都手動輸入,所以這個“指令碼”還是很有用的,我們還是手動編寫一個吧。
  若瞭解linux目錄結構的話,就會知道啟動選單在根分割槽的boot資料夾下的grub資料夾中,是一個名叫grub.confg的檔案;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這一部分的啟動選單用了鏈式裝入器,也不必理會什麼意思,照搬就可以了。若想讓xp系統預設啟動,把default項改為1。
  現在一份新的啟動選單就弄好了!
  這篇日記算是勉強寫完了。一方面,我也不是特別瞭解grub,無法作更深入的挖掘;另一方面,這篇日記牽涉到很多linux檔案系統、目錄結構、硬碟分割槽等知識。既要談一點這方面的知識,否則讀起來會很吃力;又不能談的過多,否則會偏離正題。但是不管怎麼說,用命令列啟動fedora是沒什麼問題了......
本文出自 51CTO.COM技術部落格

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/262387/viewspace-1030610/,如需轉載,請註明出處,否則將追究法律責任。

相關文章