一、grub.cfg詳解(紅色為說明) grub.cfg 默認為只讀,要修改前先設為可寫 sudo chmod +w /boot/grub/grub.cfg set default=0 #默認為0 insmod jpeg #添加jpg支持,如要使用png或tga文件做背景,加上 insmod png或insmod tga insmod ext2 #除了用作啟動的分區外,其他分區格式可在menu底下再添加 set root=(hd0,7) #設定root分區 search --no-floppy --fs-uuid --set f255285a-5ad4-4eb8-93f5-4f767190d3b3 #設定uuid=****的分區為root,和上句重復,可刪除 # 以下為終端配置 if loadfont /usr/share/grub/unicode.pf2 ; then #設置終端字體,unicode.pf2支持中文顯示 set gfxmode=640x480 #設置分辨率,默認為 640x480,可用800x600,1024x768,建議跟你想設定的圖片大小一致 insmod gfxterm #插入模塊 gfxterm,支持中文顯 示,它還支持 24 位圖像 insmod vbe #插入 vbe 模塊,GRUB 2 引入很多模塊的東西,要使用它,需要在這里加入 if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod that don't # understand terminal_output terminal gfxterm #設置 GRUB 2 終端為 gfxterm fi fi set timeout=10 background_image (hd0,7)/boot/images/1.jpg #設置背景圖片 ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/05_debian_theme ### set menu_color_normal=white/black set menu_color_highlight=cyan/black #這兩行為 Debian 下的菜單顏色設置,如果默認的話,你會發現背景完全被藍色擋住了,你需要修改 blue 為 black,這樣背景就會出現 ### END /etc/grub.d/05_debian_theme ### # 10_linux 為自動添加的當前root分區linux引導項 ### BEGIN /etc/grub.d/10_linux ### #菜單項,要包括 menuentry 雙引號" " 和大括號 { }才完整,否則不顯示菜單 menuentry "Ubuntu, Linux 2.6.31-9-386" { insmod ext2 set root=(hd0,7) search --no-floppy --fs-uuid --set f255285a-5ad4-4eb8-93f5-4f767190d3b3 #這句與set root=(hd0,7)重復,可刪除 linux /boot/vmlinuz-2.6.31-9-386 root=UUID=f255285a-5ad4-4eb8-93f5-4f767190d3b3 ro quite splash #不喜歡看到一長串的, roo=UUID=***可用root=/dev/sda7代替 initrd /boot/initrd.img-2.6.31-9-386 } ### END /etc/grub.d/10_linux ### ### BEGIN /etc/grub.d/20_memtest86+ ### menuentry "Memory test (memtest86+)" { linux16 /boot/memtest86+.bin } ### END /etc/grub.d/20_memtest86+ ### # 自動添加存在於其他分區的系統引導項 ### BEGIN /etc/grub.d/30_os-prober ### #windows 啟動菜單 menuentry "Windows Vista (loader) (on /dev/sda1)" { insmod ntfs #windows格式為ntfs,或為fat32改為 insmod fat set root=(hd0,1) search --no-floppy --fs-uuid --set ece067d2e067a196 #可刪除 #grub2比較先進的地方就是如果發現windows啟動是通過ntldr 引導的,定為2000/xp/2003,會在這加上 drivemap -s (hd0) ${root} ,作用相當於grub的map,可正常啟動非第一硬盤的xp/2003系統。 chainloader +1 } # 查找到其他分區上的linux系統並自動添加 menuentry "Ubuntu karmic (development branch) (9.10) (on /dev/sda3)" { insmod ext2 set root=(hd0,3) search --no-floppy --fs-uuid --set 4d893970-0685-44ed-86b3-1de45b2db84a linux /boot/vmlinuz-2.6.31-9-generic root=/dev/sda3 initrd /boot/initrd.img-2.6.31-9-generic } #若存在macos會自動在這里添加。 ### END /etc/grub.d/30_os-prober ### # 以下為手動添加的菜單項 ### 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 ### # 手動添加時,硬盤編號從0開始(hd0),主分區編號從1開始(hd0,1),邏輯分區從5開始(hd0,5) 二、grub2終端部分命令介紹 在出現選擇菜單時,按C進入終端命令行模式,按E進入當前菜單項編輯模式(和grub一樣),編輯中按Ctrl + C退出,按Ctrl + X 以編輯內容啟動。 1. help 查看命令用法,顯示所有可用命令 help search search 命令用法 2. ls 列出當前的所有設備。如 (hd0) (hd0,1) (hd0,5) (hd1) (hd1,1) (hd1,2) ....... ls -l 詳細列出當前的所有設備。對於分區,會顯示其label及uuid。 ls / 列出當前設為root的分區下的文件 ls (hd1,1)/ 列出(hd1,1)分區下文件 3. search search -f /ntldr 列出根目錄里包含ntldr文件的分區,返回為分區號 search -l LINUX 搜索label是LINUX的分區。 search --set -f /ntldr 搜索根目錄包含ntldr文件的分區並設為root,注意如果多外分區含有ntldr文件,set 失去作用。 4. 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 5. set 使用set可以設置變量的值 set root= set timeout= 需要調用變量的值時,使用${AA},如set root=(hd1,1) 則${root}=(hd1,1) 6. pager 分頁顯示。 set pager=1 滿頁時暫停,按space繼續 set pager=0 取消分頁 7. linux linux取代grub中的kernel 三、 單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=<大於0> 四、雙硬盤雙系統 Grub Loading時間過長的解決方案 grub2的boot.img設定root的uuid從第一分區開始搜索分區的/boot/grub下的模塊並加載, 如果linux分區處於第二硬盤甚至第三硬盤,會導致搜索時間過長而,出現菜單時間會長達10多秒。 對雙(多)硬盤的情況建議把grub安裝在ubuntu所在硬盤的mbr上,/boot分區或 / 分區 盡量靠前,並設該硬盤為啟動盤,會大大縮短啟動時間。 五、grub2幾種修復方法 1. 雙系統重裝windows造成grub2被改寫的修復 方法一 grub4dos0.4.4 在Windows啟動項上加上grub4dos啟動(不多說了,看置頂貼),重啟選擇進入grub,在命令行下輸入(/boot單獨分區的去掉 /boot) 代碼: grub>find --set-root /boot/grub/core.img grub>kernel /boot/grub/core.img grub>boot 進入grub2菜單,進入系統后再執行 代碼: sudo grub-install /dev/sd? 方法二 進入Livecd 后修復(感謝billbear) 引用: sudo -i mount 你的根分區 /mnt mount 你的/boot 分區 /mnt/boot #如果有的話 #掛載你其他的分區,如果有的話 # 重建grub到sda的mbr grub-install --root-directory=/mnt /dev/sda 2. 由於root分區uuid改變造成的不能正常啟動,只能進入grub rescue模式的修復 代碼: grub rescue>set grub rescue>prefix=(hd?,?)/grub grub rescue>root=hd?,? grub rescue>set root=hd?,? grub rescue>set prefix=(hd?,?)/boot/grub grub rescue>set grub rescue>root=hd?,? grub rescue>prefix=(hd?,?)/boot/grub grub rescue>insmod /boot/grub/normal.mod grub rescue>normal 這時就可以調出 /boot/grub/grub.cfg,修改相應uuid, 改到命令行下 grub>insmod /boot/grub/linux.mod grub>set root=hd?,? grub>linux /boot/vmlinuz-*** root=/dev/sd?? grub>initrd /boot/initrg.img-**** 進入系統 hd?,? 是grub文件所在分區 sda? 是/分區。 3. grub模塊和配置文件grub.cfg受損無法啟動時修復 Livcd啟動進入試用 引用: sudo -i mount 你的根分區 /mnt mount 你的/boot 分區 /mnt/boot #如果有的話 # 掛載你其他的分區,如果有的話 # 重建grub到sda的mbr grub-install --root-directory=/mnt /dev/sda # 重建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 六、 一些補充說明 1. chainloader grub2將支持 chainloader /file 的用法。 目前支持的文件只有 grub2 的 boot.img 和 grub4dos 的grldr 和 grub.exe。希望正式版能支持 ntldr bootmgr peldr 等文件。 2. drivemap drivemap 兼容 grub 的 map,主要用於只能從 (hd0) 引導啟動的系統如 win2000 xp 2003,可以象 map 用法一樣如: menuentry "Windows XP" { insmod ntfs drivemap (hd0) (hd1) drivemap (hd1) (hd0) set root=(hd1,1) chainloader +1 } 實際上 drivemap 有了更方便的用法: menuentry "Windows XP" { insmod ntfs set root=(hd1,1) drivemap -s (hd0) ${root} chainloader +1 } 3. grub2 引導軟盤img鏡像啟動 比如要加載(hd1,1)根目錄下的 a.img 鏡像,先把 memdisk 從 memdisk.gz 中解壓出來,用法是: linux (hd1,1)/memdisk #鏡像文件超過2.88M要加上 c=* h=* s=* initrd (hd1,1)/a.img boot 現在有bug,加載memdisk會自動重啟,beta2還沒修正。