伊莉討論區

標題: GRUB2中文指南 (中) [打印本頁]

作者: virtumann    時間: 2011-6-25 12:51 PM     標題: GRUB2中文指南 (中)

自訂選單項目(此小節之後待校稿)

GRUB 2 允許使用者建立自訂選單選項,在執行 sudo update-grub 時此選項將會自動加入主選單中。在 /etc/grub.d/ 中有一個空的 40_custom 檔可以使用,或是以其當作建立其他自訂選單的範本。這裡有一些自訂選單需要考量的地方: 檔案的名稱將會決定選項在選單中的排序。數字檔名會在前先執行,跟著是文字檔名。 10_linux 選項會出現在 30_os-prober 選項之前,然後跟著是 40_custom 選項,最後是 my.custom.entries。 使用者欲將自訂選項排在主選單第一位,可以將檔案命名為 06_xxx 如此一來它將會是選單中的第一筆選項。 檔案必須有可執行權限:sudo chmod +x /etc/grub.d/filename。 在 update-grub 指令未執行前,grub.cfg 的內容不會加入新增變更部份。 不像 grub.cfg,自訂檔案可以在任何時間編輯,不是唯讀權限,而且若想要的話可以以使用者為檔案擁有者。 自訂檔案是靜態的。當新的核心加入或移除時其內容將不會被變更(除非內容受使用者加入的命令稿影響)。 若自訂檔案將 menuentry 放在 grub.cfg 的最上方,使用者也許想要在執行 update-grub 後確認 /etc/default/grub 的 DEFAULT= 設定狀態。確保它依然指到想要的選單選項上。在計數時,/etc/default/grub 第一筆「選單選項」為 0。

建立自訂選單
使用者可選擇由預設的 /etc/grub.d/40_custom 檔來修改或是建立一個新檔。建立一個新自訂選單最簡單的方法為從 /boot/grub/grub.cfg 複製一份使用中的選項。複製之後,在 40_custom 中的內容可剪裁為使用者想要的樣式。 根據預設的範例自訂檔(/etc/grub.d/40_custom)在 /etc/grub.d 中任何自訂檔的頭兩行應該是:

!/bin/sh
exec tail -n +3 $0 使用者可從 /boot/grub/grub.cfg 或是從傳統 GRUB 檔中複製已存在的選單選項。若使用者想從傳統 GRUB 的 menu.lst 中複製: 若使用者從 GRUB 升級至 GRUB 2 則也許可找到一份備份檔在 /boot/grub 目錄下。 以下來自 GRUB 選單中的項目必須修改才能作用: title 更改為 menuentry。此行必須由 { 作為結束 root 更改為 set root= kernel 必須改為 linux 任何 partition 命名(sda4, sdb6)必須修改,因為 GRUB 和 GRUB 2 的分割區計數方式不同。GRUB 2 中的第一個分割區為 1,不是 0。裝置依然由 0 開始計數。 仔細檢視任何作用中的 GRUB 2 menulist 條目格式以確保使用正確的格式。 一般 menuentry 建構規則: 第一行一定由 menuentry 開頭,並以 { 結束 大括號之間的區域就是會出現在 GRUB 2 的內容。依照需求編輯。 menuentry 最後一行一定是 } 每行最後面不要留下空白 set root= 行應該指到 GRUB 2 的 /boot 位址(sdXY) 在 linux 行中的 root 應指向系統分割區。 若 GRUB 2 無法找到指定的核心,試試看以裝置名稱來取代 UUID(例如:/dev/sda6)。 一份從 grub.cfg 複製來由使用者修改過的選項範例可能會看起來像這樣:

menuentry "My Default Karmic" { set root=(hd0,1) search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8 linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash initrd /boot/initrd.img-2.6.31-11-generic } 一份由網站上的指令將系統還原光碟(SystemRescueCD)安裝為硬碟版(在 sda8 上)的選項範例:

menuentry "System Rescue CD" { set root=(hd0,8) linux /sysrcd/rescuecd subdir=sysrcd setkmap=us initrd /sysrcd/initram.igz } 一份連鎖載入另一個 GRUB 開機載入程式的選項範例:

menuentry "Grub 1 Bootloader" { set root=(hd0.8) chainloader +1 }

備用模式

Grub 2 可以被設定為若預設選單項目因某些原因而開機失敗時,退回至先前成功開機的選單項目。這個網頁(德文)可以找到一個範例稿以達成此目的。

命令列&救援模式

使用者可以有數種方法來嘗試從失敗的開機中復原。如果選單依然可以使用,選單設定可以由使用者來檢視和修改。此外,若 GRUB 2 偵測到開機時因為 grub.cfg 的錯漏而無法將控制權轉移到所選擇核心的錯誤,它將會回復到救援模式。兩種方式都允許使用者藉由受限的命令列介面來復原為可用的系統。如果只有「Grub」字樣出現在螢幕頂端而沒有提示符號(存取命令列)或選單,參考從開機光碟重新安裝小節。

發現並解決問題: 如果你在閱讀此小節,你的作業系統也許遇到開機上的問題。以下段落將會詳述 GRUB 2 命令列功能的使用及編輯方法,以試圖將系統開機。GRUB 2 的其中一項進步就是從命令列中搜尋分割區內容的能力。若以下段落的指令無法使用,特別是伴隨著「無法找到(not found)」或是「核心必須先載入(the kernel must be loaded first)」的訊息,則使用以下指令來探索分割區。在 Ubuntu 中,/boot 目錄下通常都會包含至少一個「vmlinuz」核心和一個「initrd」 .img 檔案。在 /boot/grub 目錄下應該通常會包含一個「grub.cfg」以及許多「.mod」檔案。X 是磁碟,由 0 開始。Y 是分割區號碼,由 1 開始。在單一磁碟上一個乾淨的 Ubuntu 安裝中,主磁碟/分割區通常是 hd0,1。在單一磁碟包含 Windows 的多重開機環境下,一般通常位於 hd0,5。使用 ls 指令來查閱哪些是 GRUB 2 已知的磁碟/分割區。 欲探索 GRUB 2 的已知裝置,在 GRUB 2 選單中按「c」以進入命令列(如果還沒有進入的話): ls 顯示 GRUB 2 已知的磁碟/分割區。 ls (hdX,Y)/ 顯示指定磁碟/分割區下的 / 目錄內容。 ls (hdX,Y)/boot 顯示 /boot 目錄內容。例如:ls (hd0,5)/boot ls (hdX,Y)/boot/grub 顯示 /boot/grub 目錄內容。例如:ls (hd0,5)/boot/grub

開機時編輯選單
若開機過程中選單無法正常顯示,按住 SHIFT 鍵讓電腦試著顯示 GRUB 2 選單。 當選單顯示後,按下任何鍵(ENTER 除外)來停止倒數計時並以上/下鍵選擇想要的項目。 按下「e」鍵進入所選選項的設定。



使用鍵盤來定游標位置。在此例中,游標已經被移動,因此使用者可以修改或刪除數字 9。 對任一行或每一行做單一或多處修改。不要使用 ENTER 來做行列間的移動。 可使用 Tab 鍵自動完成功能,這在輸入核心和 initrd 項目的時候特別好用。 當完成時,決定下一個步驟: CTRL-x - 以修改過後的設定開機(以高亮度強調) CTRL-c - 進入命令列來進行診斷、載入模組、修改設定等等。 ESC - 放棄所有修改並回到主選單 這些選擇也會列在螢幕底部作為提示。

命令列模式
從主要 GRUB 2 選單畫面使用者可選擇按下「c」進入命令列模式。 這裡有一些好用的小訣竅和特性來使用 GRUB 2 命令列: 關閉開機影像也許會讓終端機更容易檢視。按下「c」進入命令列然後輸入: set color_normal=white/blue 或是任何你想使用的顏色組合。第二個選項使用「black」會保留選單的透明度,若使用者想使用實色當作背景色的話應該避免此選擇。 為了預防畫面捲動到螢幕最上方以外,首先執行 set pager=1,此設定動作類似終端機的「| more」指令。如此將允許一個全畫面的資料,並在按下「ENTER」鍵時才會繼續往下捲動。 輸入 help 可檢視所有指令的清單。輸入 help x 來檢視所有以「x」字母開頭的指令。Tab 鍵自動完成以及使用向上鍵來重複上一個指令與一般終端機動作相同。 TAB 自動完成功能非常的好用。在任何時間,若元件是獨一的,按下 TAB 鍵可以自動完成一項輸入,否則會顯示所有可用的選項。輸入一些額外的字元後再按下 TAB 可自動完成剩餘的部份。 一些好用的指令包括: 指令 結果 background_image 載入一個現存的背景影像。使用 tab 自動完成來協助輸入檔名! background_image=/usr/share/images/grub/ 然後用 tab 來顯示所有影像的清單。當初始測試開機影像時 很有用的指令。 cat 用來顯示目前檔案內容。 cat /boot/grub/grub.cfg, cat /etc/fstab help 檢視所有可用指令。輸入 help x 來取得一份以字母 x 開頭的指令清單。help xxx 取得關於 xxx 指令的資訊。此指令應該接在「set pager=1」指令之後,會讓螢幕顯示類 似終端機「| more」指令的行為,以預防捲動超過螢幕頂端。 ls 單獨使用,列出 GRUB 2 所知道的所有裝置,例如 (hd0) (hd0,1) 等等。使用 ls 來檢視可用的分割區。使用 ls /boot, ls /boot/grub 來檢視 /boot 和 /grub 目錄內容。 initrd 載入 initrd。 linux 載入 linux 核心。 loopback 把檔案掛載成裝置。loopback loop (hd0,2)/iso/my.iso lsmod 顯示已載入模組 reboot 重新開機 rescue 進入救援模式 set 顯示適當的環境變數。與其他結合,設定變數如 set gfxmode=640x480, set color_normal=cyan/black 在命令列模式中使用後面的指令來測試各種選單字型顏色。 vbeinfo 顯示可用的螢幕解析度。

使用命令列介面開機
若使用者有開機上的麻煩但選單可用,最簡單的開機方法就是編輯現存的選單。參考開機時編輯選單。若 GRUB 2 尋找可用 grub.cfg 檔案失敗,它應會回復至 grub-rescue 模式。命令列提示符號會顯示 grub-rescue> 且將不會顯示選單。使用者可由此命令列才來嘗試手動輸入指令來開機至可用的系統。

若命令列提示符號沒有啟動,按下「c」來進入命令列模式。您將會看到 GRUB 2 提示符號: grub> 或 grub rescue>

若您在任何時間想要取消並重來,ESC 將會移除修改部份並讓使用者返回前一個選單。使用以下兩個指令來決定您想要開機的系統所在裝置(磁碟機)和分割區。 set 當輸入 set 且沒有附加項目時,此指令會顯示目前的 GRUB 2 設定。 ls 執行 ls 來查看 GRUB 2 認出的裝置。例如:(hd0) (hd0,1) (hd1,5)在此範例中 sda, sda1, sdb5 已被識別出來。

以最近使用的核心快速開機
指令摘要*: set root=(hdX,Y) linux /vmlinuz root=/dev/sdXY ro initrd /initrd.img boot

詳細指令*: 每行完成後按下 ENTER。某些條目可能不會有回應。這是正常的。 如果執行這些指令時有「檔案未找到(file not found)」或類似的錯誤訊息,確認您使用正確的 X,Y 值。ls 指令能協助決定正確的值。一旦確認了 X,Y 值,執行以下指令: set prefix=(hdX,Y)/boot/grub 1*. set root=(hdX,Y) 輸入來自 ls 指令正確的 X,Y 值並按 ENTER。記住 GRUB 2 將第一個裝置算為 0,第一個分割區為 1。例如:若 Ubuntu 系統安裝在 sda5,輸入: set root=(hd0,5)


2*. linux /vmlinuz root=/dev/sdXY ro 範例:linux /vmlinuz root=/dev/sda3 ro

Wubi 使用者請參考備註。
3. initrd /initrd.img 選擇最新的 initrd 影像。 4. boot 以選定的分割區最新的核心來開機。

僅適用於 Wubi 使用者 - 用以下指令替換步驟 1 及 2:
set root=(loop0) linux /vmlinuz root=/dev/sdXY loop=/ubuntu/disks/root.disk ro 此變更並非永久性的。在成功的開機進入系統後使用者應執行 sudo update-grub 並觀察 GRUB 2 設定檔(/boot//grub/grub.cfg)。對於啟動主要 linux 核心的問題,確認檔案中在 [### BEGIN /etc/grub.d/10_linux ###] 段落的 search, linux, 和 initrd 行現在正確的指向正確位址。使用者也許需要重新安裝 GRUB 2(sudo grub-install /dev/sdX)。

手動開機到指定的核心
若 在開機過程中 GRUB 2 選單無法編輯,在命令列下還是有可能允許開機至某個特定核心下。若 GRUB 2 所使用的目錄位址正確,使用者可能可以在命令列中輸入單一行的指令提供所需的所有訊息。此小節將會提供如何輸入此訊息的逐步指引。指令完成時看起來會類似 如下所示: 指令摘要*: set linux /boot/vmlinuz- 詳細指令*:

只有在完成每一步驟(「1」、「2」、「3」和「4」)之後才按下 ENTER。 第 1 步*:設定根分割區 set root=(hdX,Y) 使用來自 ls 指令查詢到的正確 X, Y 值並 ENTER。記住 GRUB 2 將第一個磁碟算為 0,第一個分割區為 1。舉例,若 Ubuntu 系統位於 sda5,輸入:set root=(hd0,5)

若是安裝在 Windows 中的 Wubi,使用以下指令:
set root=(loop0) 第 2 步*:輸入「linux」行訊息 linux /boot/vmlinuz-<您的版本> root=/dev/sdXY ro

若是以 Wubi 安裝在 Windows 中,請使用以下指令代替:
root=/dev/sdXY loop=/ubuntu/disks/root.disk 在輸入 linux /boot/ 之後,使用者可按下 TAB 來顯示可用的核心。在「/」後沒有空白。若沒有可見的核心,那麼在「設定根分割區」步驟中的位址設定可能有誤。輸入正確的核心或是用 tab 自動完成。 至於在 root=/dev/ 部份,請使用正確的裝置名稱,例如「/dev/sda1」、「/dev/sdb5」等等。加上任何選項,例如 ro(唯讀),在每行的行末(一般而言非必要)。 一旦此行的所有資訊都正確,看起來應該會類似以下的範例。 linux /boot/vmlinuz-2.6.31-16-generic root=/dev/sda1 ro 當正確輸入並按下 ENTER 後,若找到 linux 核心,會有一行高亮度類似「Linux-bzImage」的確認訊息出現如下圖。



若出現「檔案未找到(file not found)」或類似的訊息出現,表示要不是裝置/分割區/檔案不存在,不然就是 GRUB 2 並非在正確的磁碟、分割區和/或目錄中搜尋。使用 ls 指令來查明正確的位址接著執行以下指令。重複第 2 步。 set prefix=(hdX,Y)/boot/grub 第 3 步:輸入「initrd」行訊息 initrd /boot/initrd.img-<您的版本> 在輸入了 initrd /boot/ 之後,使用者可按下 TAB 來顯示可用的 initrd 映像檔。不要在「/」之後留空白。若沒有可見的映像檔,表示在「設定根分割區」步驟中的位址設定可能有誤。輸入正確的映像檔位址或是用 tab 自動完成。 一旦此行的所有資訊都正確,看起來應該會類似以下的範例。按下 ENTER。觀察確認訊息。 initrd /initrd-2.6.31-16-generic root=/dev/sda1 ro 當正確輸入並按下 ENTER 後,若找到 initrd 映像,會有一行高亮度類似「Initrd」的確認訊息出現如上圖。

第 4 步:重開機 boot 輸入指令並按下 ENTER。 救援模式

===救援模式=== 救援模式是 GRUB 2 的主要強化部份。若 GRUB 2 尋找可用的 grub.cfg 失敗並無法轉移控制權至核心,他將會進入 grub-rescue> 提示符號。在此提示符號下使用者可探查問題、進行修改,以及重新嘗試開機。

救援模式所提供的指令比起一般 GRUB 提示符號列少,但也提供額外的指令: 指令 結果 dump 清除記憶體 exit 退出 GRUB 2 normal 若可能的話回到標準的「grub>」模式 以下指令可以在 grub 救援模式中使用: boot cat chainloader dump exit kfreebsd kfreebsd_loadenv kfreebsd_module help initrd insmod linux lsmod multiboot normal rmmod set unset 雖然以下的指令並非全都是開機至 linux 核心所必須,這些指令能讓使用者在執行 boot 指令前確認問題所在,提供較佳的機會以成功開機。 若需要額外的指令,使用者可以試著用 insmod normal 來載入一般的 GRUB 2 模組。若成功, help 和其他額外的指令就可以使用。 指令摘要*:

1. ls 2. set prefix=(hdX,Y)/boot/grub 3*. set root=(hdX,Y) 4. set 5. ls /boot 6. insmod /boot/grub/linux.mod 7*. linux /vmlinuz root=/dev/sdXY ro 8. initrd /initrd.img 9. boot

以 Wubi 安裝(在 Windows 內)只要用以下指令來替換步驟 3 和 7:
set root=(loop0) linux /vmlinuz root=/dev/sdXY loop=/ubuntu/disks/root.disk ro 詳細指令: 1. ls 此指令將顯示已知的裝置和分割區。由此資訊,使用者必須決定系統安裝在哪一個裝置和分割區。 2. set prefix=(hdX,Y)/boot/grub 若不正確,稍後將會發生「無此磁碟(no such disk)」或「無法找到(not found)」錯誤訊息。 3. set root=(hdX,Y) 在此指令中,X 為裝置/磁碟,由 0 開始。Y 為分割區,由 1 開始。範例:(hd0,1) 是 sda1。(hd3.5) 是 sdc5。 4. set 檢視「prefix=」列表。這裡應該會與步驟 3 的根目錄位址符合,為以下格式:prefix=(hdX,Y)/boot/grub。 5. ls /boot 檢視內容。使用者應該能看到多個核心、initrd 影像和 grub 目錄。若沒有,使用 ls 指令來檢查裝置並試著找尋檔案和目錄。若有必要,設定另一個裝置 為 root。 6. insmod /boot/grub/_linux.mod 載入(插入模組) linux 模組。此模組未載入,若沒有載入此模組,使用者將會收到一個「Unknown command linux」訊息。 7. linux /vmlinuz root=/dev/sdXY ro 載入 linux 核心,以正確的名稱替換掉「X」和「Y」(例如:sda1)。使用者將會看到核心已被載入的訊息。(參看上一小節圖片)

Wubi 使用者必須使用先前說明的替代指令。
8. initrd /initrd.img 載入 initrd 影像。當按下 enter 時,使用者可能會或不會看到終端機中的訊息。(參看上圖的高亮度部份) 9. boot 嘗試使用輸入的訊息進行開機。 這些變更並非永久的。在成功開機進入系統後,使用者應該執行 sudo update-grub 並觀察 GRUB 2 設定檔(/boot//grub/grub.cfg)。若開機進入主要 linux 核心有問題,請先確定在 [### BEGIN /etc/grub.d/10_linux ###] 段落中的 search, linux 和 initrd 這三行資訊目前指到正確的位址。使用者也許需要用 sudo grub-install /dev/sdX 指令來重新安裝 GRUB 2。

GRUB Errors

GRUB 2 並不會回報錯誤碼。若是錯誤訊息有帶著一個錯誤碼,這是由 GRUB 過渡至 GRUB 2 時發生的問題。

解決「Unrecognized Device String (Error 11)」
此錯誤訊息通常是肇因於選單選項中不良或異常的內容。最常見的原因為使用者試圖從使用連鎖載入(Chainload)功能的 Jaunty 升級至 GRUB 2 導致。 1. 當啟動 GRUB 2 時顯示以下訊息:



2. 記住 Jaunty 的連鎖載入功能是有問題的,使用者按下任意鍵來回到主選單,然後按「e」直到看見「grub edit>」。編輯高亮度的「Chainload into GRUB 2」選項或任何使用者試圖用來開機的選項。



3. 有敏銳記憶力的使用者應該還記得「root」需要修改為「uuid」。使用方向鍵來移動游標,用「uuid」來取代「root」。當結束編輯時,使用者按下 ENTER 鍵,然後再按「b」來使用修改過的選項來開機。注意這些指令與 GRUB 2 中使用的不同。



若使用者打算保留雙重 GRUB 選項,以 root 身份開啟 /boot/grub/menu.lst 並將「Chainload into Grub 2」選單選項第二行「root」變更為「uuid」以修正錯誤。


File Not Found (Error 15)
此錯誤為 GRUB 2 安裝至 /boot 但主開機磁區(MBR)依然為傳統 Grub。此狀況發生在當您執行 sudo update-from-grub-legacy 時未選擇您的磁碟。執行此指令後使用者馬上會被要求選擇一個裝置(sda、sdb 等)。當顯示此畫面時選擇磁碟並按下空白鍵。沒有選擇磁碟將會導致 Error 15 的產生。

欲修復此錯誤,必須要重新安裝 GRUB 2。詳細指令請參考從開機光碟重新安裝小節。

Grub 顯示救援模式提示符號(且未繼續進行開機)
您 可能有一個有問題的 BIOS,且您的 /boot/* 檔案沒有位於磁碟的 1024 磁柱之內。在磁碟前端建立一個小型分割區,以 /mnt/b 來掛載,執行 cp -av /boot/* /mnt/b;umount /mnt/b;mount /dev/small_partition /boot; grub-install /dev/<device>。




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!