轉:grub2基礎教程-修訂版 | |
|
|
來源: ChinaUnix博客 日期: 2009.12.01 16:01 (共有1條評論) 我要評論 | |
grub2基礎教程-修訂版 smallapple 目錄 一、grub2 新特性 二、grub2 安裝與啟動 三、grub2 配置文件詳解 四、腳本修改 五、使用grub2 常見錯誤及修復方法 一、grub2新特性 1、grub2和grub有很多不同的地方: a)圖形接口 b)使用了模塊機制,通過動態加載需要的模塊來擴展功能 c)支持腳本語言,例如條件判斷,循環、變量和函數 d)支持rescue模式,可用于系統無法引導的情況 e)國際化語言。包括支持非ASCII的字符集和類似gettext的消息分類,字體,圖形控制臺等等 f)有一個靈活的命令行接口。如果沒有配置文件存在,GRUB會自動進入命令模式 g)針對文件系統、文件、設備、驅動、終端、命令、分區表、os loder的模塊化、層次化、基于對象的框架 h)支持多種文件系統格式 i)可訪問已經安裝的設備上的數據 j)支持自動解壓 2、設備的命名 grub2同樣以fd表示軟盤,hd表示硬盤(包含IDE和SCSI硬盤)。設備是從0開始編號,分區則是從1開始,主分區從1-4,邏輯分區從5開始,而grub分區編號是從0開始的。下面給出幾個例子 : (fd0):表示整個軟盤 (hd0,1):表示BIOS中的第一個硬盤的第1個分區 (hd0,5)/boot/vmlinuz:表示BIOS中的第一個硬盤的第一個邏輯分區下的boot目錄下的vmlinuz文件 二、grub2安裝與啟動 1、安裝ubuntu9.10時,grub默認安裝在第一硬盤(hd0)的mbr,其實就是把引導文件boot.img寫入硬盤的mbr,當然,用戶也可以選擇不寫入硬盤mbr而是寫入linux分區的引導扇區。啟動時根據mbr所提供信息找到啟動分區后,加載分區內的grub核心文件core.img和配置文件grub.cfg,進入選擇菜單畫面,在菜單畫面,按上下箭號選擇需要系統菜單項,按Enter進入選項。 按e進入己選擇菜單的編輯狀態,在編輯狀態下,由上下左右箭號來移動光標,enter鍵換行,ctrl+x以編輯的內容啟動,ctrl+c進命令行狀態,按Esc退出,回到菜單項。 在需要使用額外的內核參數啟動時,比如要加上acpi=off時,把光標移動到linux這一行最后,在splash后加上一空格再輸入acpi=off,然后按ctrl+x啟動。 按c進入命令行狀態,按Tab鍵可查看所有可用的命令。 在命令行狀態,可以根據需要加載或移除相應模塊,也可用來啟動在菜單沒有顯現的的系統。 比如,在第一硬盤的第一分區上裝有windows xp系統,但在菜單上沒顯示出來,我們可以命令行狀態下輸入命令啟動: grub>set root=(hd0,1) grub>chainloader +1 grub>boot 又比如啟動第二硬盤第一邏輯分區上的ubuntu系統: grub>set root=(hd1,5) grub>linux /boot/vmlinuz-xxx-xxx root=/dev/sdb5 grub>initrd /boot/initrd.img-xxx-xxx grub>boot 其中內核vmlinuz和initrd.img的版本號可用按Tab鍵自動查看。 2、下面介紹下在grub2中一些常用的命令 1)help 查看命令用法,如 help search:查看search命令詳細用法 2)set 設置變量值,如 set default=0 set timeout=5 set root=(hd0,3)等等 需要調用變量AA的值時,使用${AA},如set root=(hd1,1),則${root}=(hd1,1) 3)default 定義默認引導的操作系統。0 表示第一個操作系統,1表示第2個,依此類推 4)timeout 定義在時間內用戶沒有按下鍵盤上的某個按鍵,自動引導default指定的操作系統。 5)root 指定用于啟動系統的分區。 6)insmod和rmmod 加載或移除某模塊,如 insmod jpeg insmod png insmod ntfs rmmod png 等 7)drivemap drivemap兼容grub的map,主要用于只能從第一硬盤(hd0)引導啟動的系統如 win2000 xp 2003,比如要添加第二硬盤第一分區上的xp系統: menuentry "Windows XP" { set root=(hd1,1) drivemap -s (hd0) ${root} chainloader +1 } 8)ls 列出當前的所有設備。如(hd0),(hd0,1),(hd0,5),(hd1),(hd1,1),(hd1,2)等 ls -l 詳細列出當前的所有設備。對于分區,會顯示其label及uuid。 ls / 列出當前設為root的分區下的文件 ls (hd1,1)/ 列出(hd1,1)分區根目錄的文件 9)search search -f /ntldr 列出根目錄里包含ntldr文件的分區,返回為分區號 search -l LINUX 搜索label是LINUX的分區。 search --set -f /ntldr 搜索根目錄包含ntldr文件的分區并設為root,注意如果多個分區含有ntldr文件, set失去作用。 10)loopback loopback命令可用于建立回放設備,如 loopback lo0 (hd1,1)/abc.iso 可以使用lo0設備來訪問abc.iso里的內容,比如說,可以從abc.iso里的軟盤映像中啟動 loopback lo0 (hd1,1)/aa.iso linux (lo0)/memdisk initrd (lo0)/abc.img 要刪除某一回放設備,可以使用-d參數: loopback -d lo0 11)pager 分頁顯示。 set pager=1 顯示滿一頁時暫停,按space繼續 set pager=0 取消分頁顯示 12)linux 用linux命令取代grub中的kernel命令 13)chainloader 調用另一個啟動器,如 chainloader (hd0,1)+1 調用第一硬盤第一分區引導扇區內的啟動器,可以是windows或linux的啟動器 三、grub2配置文件詳解 grub2改用grub.cfg為配置文件,配置文件包含以下基本內容:(紅色為解釋部分) ### BEGIN /etc/grub.d/00_header ### load_env #加載變量,如果在grubenv保存變量,則啟動時裝載 set default="0" #設置默認引導項,默認值為0 insmod ext2 #插入文件系統支持的模塊,除了用作啟動的分區外,其他分區格式可在menuentry底下再添加 set root=(hd0,8) # 指定系統root分區,也就是 / 分區 search --no-floppy --fs-uuid --set 2d61e5f9-1d2a-4167-a6f1-b991ba00878b #指定uuid=2d61e5f9-1d2a-4167-a6f1-b991ba00878b的分區為root分區,如果前面的分區號(hd0,8)的#uuid與這里的uuid一致,這兩句作用一樣,如果不一致,則指定uuid的起作用。 if loadfont /usr/share/grub/unicode.pf2 ; then #設置終端字體,unicode.pf2支持中文字符顯示 set gfxmode=640x480 #設置顯示分辨率,默認為640x480,可用800x600,1024x768,建議跟你想設定的圖片大小一致 insmod gfxterm #插入終端模塊gfxterm,支持中文字符顯示和支持24位圖像 insmod vbe #插入vbe模塊,GRUB2引入模塊化機制,要使用它,需要在這里加入 if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod that don't # understand terminal_output terminal gfxterm #設定grub2終端為gfxterm fi fi set timeout=10 #設定默認啟動前等待時間,默認為10秒 ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/05_debian_theme ###set menu_color_normal=white/black #設定菜單字體及背景顏色 set menu_color_highlight=black/blue #設定選擇項字體及背景顏色 #如果使用默認,背景將完全被藍色擋住了,需要修改blue為black,背景圖片才能顯示 ### END /etc/grub.d/05_debian_theme ### ### BEGIN /etc/grub.d/10_linux ### #10_linux為系統自動添加的當前root分區linux引導項 #每個菜單項要包括menuentry雙引號" "和大括號{ }才完整,否則不顯示菜單 menuentry "Ubuntu, Linux 2.6.31-10-generic" { set quiet=1 insmod ext2 set root=(hd0,8) search --no-floppy --fs-uuid --set 2d61e5f9-1d2a-4167-a6f1-b991ba00878b #這句與set root=(hd0,8)效果一樣,可刪除其一,二者不一致以這句為準 linux /boot/vmlinuz-2.6.31-10-generic root=UUID=2d61e5f9-1d2a-4167-a6f1-b991ba00878b ro quiet splash #不喜歡看到一長串的, roo=UUID=***可用root=/dev/sda8(/分區的分區號)代替 initrd /boot/initrd.img-2.6.31-10-generic } … ### END /etc/grub.d/10_linux ### #20_memtest86+為系統自動添加的內存測試菜單項 ### BEGIN /etc/grub.d/20_memtest86+ ###menuentry "Memory test (memtest86+)" {linux16 /boot/memtest86+.bin}menuentry "Memory test (memtest86+, serial console 115200)" {linux16 /boot/memtest86+.bin console=ttyS0,115200n8}### END /etc/grub.d/20_memtest86+ ### #30_os-prober或30_others為系統自動查找并添加其他系統菜單項,按windows,linux,macos順序 #查找并添加,支持windows 7識別 ### BEGIN /etc/grub.d/30_os-prober ### ### END /etc/grub.d/30_os-prober ### ### BEGIN /etc/grub.d/30_otheros ### # This entry automatically added by the Debian installer for a non-linux OS # on /dev/sda1 menuentry "Microsoft Windows XP Professional" { set root=(hd0,1) search --no-floppy --fs-uuid --set e852-230b drivemap -s (hd0) $root #對以ntldr引導的系統如win2000,xp,win2003,因其引導機制只能從第一硬盤啟動,系統會自動添加#映射命令,對vista和win7就沒有這句命令 chainloader +1}### END /etc/grub.d/30_otheros ### #40_custom為自定義的啟動項,如啟動cdlinux ### BEGIN /etc/grub.d/40_custom ### menuentry "CDLinux"{ set root=(hd0,8) linux /CDlinux/bzImage root=/dev/ram0 vga=791 CDL_LANG=zh_CN.UTF-8 initrd /CDlinux/initrd } ### END /etc/grub.d/40_custom ### 定制個性化的配置文件,可以加入背景圖片,使用中文字符,讓啟動畫面獨具特色,而不是單調的黑、白、藍三色。下面是一張經美化啟動畫面: 四、腳本修改 該怎樣定制個性化的配置文件呢? 系統安裝完成后,用戶就會發現/boot/grub/grub.cfg文件只有root權限可讀,如果要直接修改grub.cfg文件,要先修改其權限。好不容易把grub.cfg修改好了,系統內核或grub升級時,會自動執行update-grub,grub.cfg文件就會被打回原形,如何保證修改后的配置文件能一直保留下來呢? 其實不用修改grub.cfg,只要把個性化配置寫入/etc/default/目錄下的grub和/etc/gurb.d目錄下的腳本文件,以后不管升級內核或者是升級grub所執行的update-grub,都會按要求創建個性化的grub.cfg。 1、首先看下 /etc/default/grub,先從應用程序-附件里打開終端,輸入 sudo gedit /etc/default/grub 用戶密碼 看看打開的文件可作什么修改: # If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. GRUB_DEFAULT=0 ->設置默認啟動項,按menuentry順序。比如要默認從第四個菜單項啟動,數字改為3,若改為 saved,則默認為上次啟動項。 GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true ->隱藏菜單,grub2不再使用,不管 GRUB_TIMEOUT="3" ->設置進入默認啟動項的等候時間,默認值10秒,按自己需要修改 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" ->添加內核啟動參數,這個為默認 GRUB_CMDLINE_LINUX="noresume" ->手動添加內核啟動參數,比如 acpi=off noapic等可在這里添加 # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL=console ->設置是否使用圖形介面。去除前面#,僅使用控制臺終端,不使用圖形介面 # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' #GRUB_GFXMODE=640x480 設定圖形介面分辨率,如不使用默認,把前面#去掉,把分辨率改為800x600或1024x768 # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID=true ->設置grub命令是否使用UUID,去掉#,使用root=/dev/sdax而不用root=UUDI=xxx # Uncomment to disable generation of recovery mode menu entrys #GRUB_DISABLE_LINUX_RECOVERY="true" ->設定是否創建修復模式菜單項 2、再看下/etc/grub.d目錄下的腳本文件: 00_header,05_debian_theme,10_linux,20_memtest86+,30_os- prober,40_custom這五個腳本對應grub.cfg上的各個部分,有的版本的grub可能把30_os-prober分出另一部分為 30_os-others,這并不影響。怎樣修改這些腳本文件才能保證不會破壞update-grub的運行,又能讓生成的grub.cfg合乎意愿呢? 其實很簡單,只要在腳本文件中找到 cat 其他使用變量的語句不要隨變做修改,除非你清楚修改后會有什么結果。 1)看看00_header,一樣在終端中打開sudo gedit /etc/grub.d/00_header,找到這部分 cat 加載由save_env保存在grubenv的變量 set default="${GRUB_DEFAULT}" ->使用/etc/default/grub中的設定值 if [ \${prev_saved_entry} ]; then saved_entry=\${prev_saved_entry} save_env saved_entry prev_saved_entry= ->變里設置的變量由下句保存到grubenv save_env prev_saved_entry fi ->這里回車添加新行后可插入需要添加的模塊 insmod jpeg ->添加背景圖片格式支持,如jpeg,png,tga等。 insmod fat ->添加文件系統格式支持如fat,ntfs,也可在menuentry下添加 EOF 再看看最后這一段 cat 設定為若有啟動失敗記錄,就顯示菜單,需手動選擇才能啟動選擇項 else set timeout=${GRUB_TIMEOUT} ->使用/etc/default/grub中的設定值 fi ->這行后添加行 background_image (hd0,7)/boot/images/002.jpg ->添加背景圖片的絕對路徑 EOF 2)05_debian_theme修改字體及背景顏色 先打開文件 sudo gedit /etc/grub.d/05_debian_theme 看這里 cat 設置菜單項的字體和背景顏色 set menu_color_highlight=black/white ->設置選擇項的字體和背景顏色。 EOF 可供使用菜單顏色有: black,blue,green,cyan,red,magenta,brown,light-gray,dark-gray,light-blue,light-green,light-cyan,light-red,light-magenta,yellow,white 3)10_linux這部分是自動搜索當前系統,建立當前系統的啟動菜單,包括系統頭,內核等信息,不要隨便修改,要使用個性菜單名,比如中文菜單,可適當添加: 先打開文件 sudo gedit /etc/grub.d/10_linux,找到 cat 雙引號內可添加個性化字符,$1變量也可改為定值,如改為menuentry "啟動 Ubuntu Karmic" { recordfail=1 save_env recordfail ->如不要保存啟動失敗記錄的,這兩句可刪除 EOF if [ "x$3" = "xquiet" ]; then cat 啟動畫面不用splash,要用跳動字符的,這段可刪除 個性化菜單項也可在這里修改,即上面的menuenrty "$1"不變,修改下面的數值: linux_entry "${OS}, Linux ${version}" \ ->可改為 linux_entry "啟動 Ubuntu, Linux ${version}"\ "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}" \ quiet if [ "x${GRUB_DISABLE_LINUX_RECOVERY}" != "xtrue" ]; then linux_entry "${OS}, Linux ${version} (recovery mode)" \ ->可改為 linux_entry "啟動 Ubuntu, Linux ${version} (修復模式)"\ "single ${GRUB_CMDLINE_LINUX}" fi 注意只修改引號內的字符,前面的menuentry,linux_entry和后面的\不要做修改。 4)20_memtest86+自動添加內存測試啟動項 打開文件 sudo gedit /etc/grub.d/20_memtest86+,找到 cat 雙引號內可添加個性字符如menuentry "啟動 內存測試" linux16 $MEMTESTPATH } menuentry "Memory test (memtest86+, serial console 115200)" { linux16 $MEMTESTPATH console=ttyS0,115200n8 } EOF 上面有兩內存測試項,可刪除其中一個。 5)30_os-prober查找其他分區中存在的系統并建立菜單項,依次為windows,linux,macos。 對于單系統,默認會隱藏菜單,可在這里去掉隱藏 先打開文件 sudo gedit /etc/grub.d/30_os-prober 單ubuntu系統會自動隱藏菜單,要取消隱藏菜單,可把這部份的三個timeout=0改為和/etc/default/grub中的timeout一致,比如timeout=10。 cat 比如改為menuentry "啟動 Windows XP" { EOF linux啟動項 linux) LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`" ...... if [ -z "${LLABEL}" ] ; then LLABEL="${LONGNAME}" fi cat 比如改為menuentry "啟動 Mandriva" { EOF macos啟動項 macosx) OSXUUID="`grub-probe --target=fs_uuid --device ${DEVICE} 2> /dev/null`" cat 比如改為menuentry "啟動 MacOS" { EOF 6)40_custom 自定義啟動項,按菜單標準格式在后面添加即可,如 #!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. menuentry "啟動 Veket" { set root=(hd0,8) linux /veket/vmlinuz root=/dev/ram0 PMEDIA=hd initrd /veket/initrd.gz } menuentry "啟動 CDLinux" { set root=(hd0,8) linux /CDlinux/bzImage root=/dev/ram0 vga=791 CDL_LANG=zh_CN.UTF-8 initrd /CDlinux/initrd } 3、把各項腳本修改保存后,在終端執行 sudo update-grub 再執行 sudo gedit /boot/grub/grub.cfg 看看配置文件是不是和你想要的一樣了。 如果有不夠滿意的地方,重新修改下腳本文件,再執行sudo update-grub 4、ubuntu和windows雙系統,怎樣讓系統默認為從windows啟動 在 /etc/grub.d目錄中的腳本文件的文件名都是以數字開頭,這確定了在執行update-grub時各文件內容被執行的順序,我們只要把 30_os-prober這個文件名的數字30改為05到10之間的數字即可(沒多少可選06、07、08、09),比如改為08_os-prober, 這樣創建出來的grub.cfg內的菜單項,windows的排序就會自動在ubuntu之前。 五、使用grub2常見錯誤及修復方法 1、雙系統,重裝windows引起沒有ubuntu啟動項 使用安裝版的windows重裝windows時會改寫mbr,造成grub丟失,可以用grub4dos引導進入ubuntu后修復grub或用livecd啟動后修復grub。 1)用grub4dos修復ubuntu 先下載最新版的grub4dos,下載地址http://nufans.net/grub4dos/ ,如果是xp系統,把grub4dos壓縮包內的grldr復制到C盤根目錄下,修改boot.ini,在最后加上一行 c:\grldr="grub4dos", 對 于vista/win7系統,把壓縮包內的grldr.mbr和grldr復制到C盤根目錄下,在C盤自己建立一個boot.ini文件,若有boot隱 藏分區的,先給boot分區分配盤符,再把grldr,grldr.mbr和boot.ini放在boot分區下,boot.ini內容如下: Win7使用軟改激活的請不要使用此方法,否則會造成win7不能啟動。 然后在根目錄新建一個menu.lst,內容為 timeout 0 default 0 title grub2 find --set-root /boot/grub/core.img kernel /boot/grub/core.img boot (有/boot分區的改為 find –set-root /grub/core.img kernel /grub/core.img) 重啟后選擇Grub4Dos會自動轉入grub2,從grub2菜單項選擇ubuntu啟動后,在終端執行 sudo grub-install /dev/sda 將grub裝入第一硬盤的mbr,如要裝入第二硬盤的mbr把sda改為sdb,第三硬盤為sdc,類推。 至于要把grub裝到sda或sdb或sdc的mbr上,需根據自己情況確定,看看要設置哪一塊硬盤為啟動盤,就把grub裝到那塊硬盤的mbr上。 2)用livecd修復grub 用ubuntu9.10的livecd啟動后,打開終端 假如你的ubuntu的 / 分區是sda7,又假如 /boot分區是 sda6,用livecd啟動,在終端下輸入 sudo -i mount /dev/sda7 /mnt mount /dev/sda6 /mnt/boot (如果沒 /boot 單獨分區這步跳過) grub-install --root-directory=/mnt /dev/sda 和前面一樣,要裝入第二硬盤的把sda改為sdb。 如果grub.cfg己丟失,需要重建的還要執行 mount --bind /proc /mnt/proc mount --bind /dev /mnt/dev mount --bind /sys /mnt/sys chroot /mnt update-grub umount /mnt/sys umount /mnt/dev umount /mnt/proc exit 3)用帶grub啟動的光盤或U盤修復 如果手上有grub啟動的工具盤,用工具盤啟動,在grub菜單上按c進入命令行狀態, 在grub>提示符下輸入 grub>find /boot/grub/core.img (有/boot分區的用find /grub/core.img) (hdx,y) (顯示查找到的分區號) grub>root (hdx,y) grub>kernel /boot/grub/core.img (/boot分區的用 kernel /grub/core.img) grub>boot 執行boot后能轉入grub2菜單,啟動ubuntu后,再在ubuntu終端下執行 sudo grub-install /dev/sda (或sdb,sdc等)修復grub。 如果ubuntu的啟動分區使用ext4格式,要有支持ext4格式的grub才能修復。 4)沒安裝引導器的 grub4dos引導ubuntu的方法 按第一步的方法使用 boot.ini 建立grub4dos引導項,自己編寫 menu.lst,內容如下 timeout 3 default 0 title Ubuntu 9.10 root (hdx,y) --------> (hd0x,y) 為 /boot分區的分區號 kernel /vmlinuz-xxx-generic root=/dev/sdxy ------->/dev/sdxy 為 / 分區的分區號 initrd /initrd.img-xxx-generic 沒 /boot 分區的用 timeout 3 default 0 title Ubuntu 9.10 root (hdx,y) kernel /boot/vmlinuz-xxx-generic root=/dev/sdxy initrd /boot/initrd.img-xxx-generic 2、安裝時grub沒裝在mbr上而選擇裝在linux分區的pbr上,怎么引導ubuntu 1)按前面的方法一,以grub4dos引導轉入grub2。 2)把ubuntu分區/boot/grub目錄下的boot.img提取出來,放到C盤根目錄下,然后修改boot.ini,在最后添加一行 C:\boot.img="grub2" 對vista/7可在C盤新建一個boot.ini,內容為 [boot loader] timeout=0 default=c:\boot.img [operating systems] c:\boot.img="grub2" 重啟后選擇grub2就可進入grub2菜單。 此法兼容性較差,成功率低,僅供測試。 3、由于分區調整引起分區號或分區UUID改變造成的grub2不能正常啟動 己安裝好系統,對硬盤再次進行分區調整時可能會改變現有分區的分區號發生變化,或者某種原因改變啟動分區的UUID,都會造成grub2不能正常啟動,而啟動進入修復模式(grub rescue),這時就要對grub進行修復。 1)用ubuntu9.10的livecd光盤啟動,進入試用桌面系統后,再修復grub,操作方法如第一種情況的第二種方法— 2)在rescue模式下啟動并修復 由于分區問題,啟動時會自動進入rescue模式,只要grub核心文件還在分區內,就能由rescue模式轉到normal模式,進而通過命令進入系統。下面這個就是rescue介面: 由于在rescue模式下,只有少量的基本命令可用,必須通過一定的操作才能加載正常模塊,然后進入正常模式。 rescue模式下可使用的命令有:set,ls,insmod,root,prefix(設置啟動路徑) 先假設grub2的核心文件在(hd0,8)分區,再來看看怎樣從rescue模式進入從(hd0,8)啟動的正常模式(normal)。 在rescue模式下search命令不能用,對不清楚grub2文件處于哪個分區的,可以用ls命令查看,比如 ls (hd0,8)/ 查看(hd0,8)分區根目錄,看看有沒有boot文件夾 ls (hd0,8)/boot/ 查看(hd0,8)分區的/boot目錄下文件 ls (hd0,8)/boot/grub/ 查看(hd0,8)分區/boot/grub目錄下文件 通過文件查看,可以確定grub2核心文件處于哪個分區,接下來就可以進行從rescue到normal的轉變動作: 1)分區號(hd0,8)在單獨使用時可以不加小括弧,在使用路徑是必須加小括弧,如第2和第3步。 2)由于grub2版本的的不一致,有的可能在第9步insmod normal.mod加載正常模塊后直接進入normal模式,即出現了normal grub>的提示符,這種情況就不能執行第10步,即可以跳過normal命令的輸入。 3)雖然輸入normal命令會出現菜單,但由于缺少加載內核的Linux命令,直接從菜單不能進入系統,需要按c在命令行繼續操作。 4)使用/boot單獨分區的,要正確修改路徑,如 prefix=(hd0,8)/grub insmod /grub/normal.mod 另外root=/dev/sda8也要修改根分區的分區號。 5)按boot啟動系統后,再在系統下打開終端,執行命令修復grub 重建配置文件grub.cfg sudo update-grub 重建grub到第一硬盤mbr sudo grub-install /dev/sda 4、雙硬盤雙系統 Grub Loading時間過長的解決方案 grub2的boot.img設定root的uuid從第一分區開始搜索分區的/boot/grub下的模塊并加載, 如果linux分區處于第二硬盤甚至第三硬盤,會導致搜索時間過長而,出現菜單時間會長達10多秒。 對雙(多)硬盤的情況建議把grub安裝在ubuntu所在硬盤的mbr上,/boot分區或 / 分區 盡量靠前,并設該硬盤為啟動盤,會大大縮短啟動時間。 5、重復一下,單linux系統或硬盤安裝時iso放在C盤,umount /isodevice引起的誤認為單系統不能出現菜單項的幾種處理方法。 1. 開機自檢后時按幾下shift鍵,可調出菜單項 2. sudo update-grub 重建grub.cfg,會發現新的系統而改寫grub.cfg,一般能出現菜單項。 3.如第二種方法不能解決,直接修改grub.cfg 把在### BEGIN /etc/grub.d/30_os-prober 中的這一段 if keystatus; then if keystatus --shift; then set timeout=-1 else set timeout=0 fi else if sleep$verbose --interruptible 3 ; then set timeout=0 fi fi 整段刪除或修改三處set timeout=,再執行 sudo update-grub 6、安裝 ubuntu 9.10 后出現 Error : No such device: xxx-xxx-xxx,不能啟動的修復辦法(未經實機測試) 由于grub2兼容性問題,少部分電腦安裝完ubuntu9.10重啟時會出現 Error:no such device:3c7c1d30-86c7-4ea3-ac16-30d6b0371b02 Failed to boot default entries. Press any key to continue. 原因是電腦不支持 uuid的搜索, soier 的修復過程證實了這個問題,見 http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=238346 [url=http://forum.ubuntu.org.cn/viewtopic.php?f=77&t=238175][/url] 原貼使用的是 live DVD進入修復系統模式,的shell 下change root 修復,livecd 沒有修復系統模式,現的根據他的方法寫個 livecd (能支持ext4讀寫的其他版本的live Linux一可以)下的修復辦法,希望有這個問題的朋友測試下看行不行(我電腦沒這個問題,沒辦法測試 ): 1)、livecd 啟動進入試用系統 2)、掛載 / 分區,比如 / 分區為 /dev/sda7 sudo mount /dev/sda7 /mnt 如果有 /boot 單獨分區,則掛載 /boot 分區 3)、修改 grub.cfg sudo chmod +w /mnt/boot/grub/grub.cfg sudo chmod +w /mnt/grub/grub.cfg (/boot 單獨分區的) sudo gedit /mnt/boot/grub/grub.cfg sudo gedit /mnt/grub/grub.cfg (/boot 單獨分區的) 找到 grub.cfg 可所有的這句 search --no-floppy --fs-uuid --set 3c7c1d30-86c7-4ea3-ac16-30d6b0371b02 的前面加上 # 號注釋掉 # search --no-floppy --fs-uuid --set 3c7c1d30-86c7-4ea3-ac16-30d6b0371b02 這句的grub.cfg中有好幾處,后面的uuid不盡相同,要全部找到并注釋掉 4)、重啟試試能否進入系統,可這進系統再進行下個步 5)、sudo gedit /usr/lib/grub/grub-mkconfig_lib 找到173-175行 if fs_uuid="`${grub_probe} --device ${device} --target=fs_uuid 2> /dev/null`" ; then echo "search --no-floppy --fs-uuid --set ${fs_uuid}" fi 前面全部加#注釋掉,記住從 if 開始到 fi結束,以防止語法錯誤 # if fs_uuid="`${grub_probe} --device ${device} --target=fs_uuid 2> /dev/null`" ; then # echo "search --no-floppy --fs-uuid --set ${fs_uuid}" # fi 然后 sudo update-grub 這樣重建出來的 grub.cfg 就沒有 search --no-floppy --fs-uuid --set 3c7c1d30-86c7-4ea3-ac16-30d6b0371b02 的語句 7、如何從grub2回到grub (wubi使用者勿試) sudo apt-get purge grub-pc ------>清除grub2 sudo rm -fr /boot/grub/* sudo apt-get install grub ------->安裝 grub sudo grub-install /dev/sda -------->安裝grub到第一硬盤mbr,第二硬盤為/dev/sdb,若安裝到分區引導扇區則為分區號如 /dev/sda7等 sudo update-grub -------->重建menu.lst 參考論壇資料: http://bbs.znpc.net/forumdisplay.php?fid=57&page=1 |