【Linux】grub2基礎教程

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的啓動器

   

       14) grub2掛載軟盤鏡像

           menuentry "Boot from DOS IMG" {

                 linux16 /memdisk

                  initrd16 /win98.img

        }

                  對非標準的1.4M和2.8M的其他鏡像掛載方法,需要指定 CHS參數:

           menuentry "Boot from IMG" {

                 linux16 /memdisk c=* h=* s=* floppy

                  initrd16 /xxx.img

        }

 

 

    15) grub2掛載ubuntu-desktop的鏡像啓動進入 livecd

           內存夠大時(大於iso鏡像)可以用 loopback,把iso文件放在某一分區根目錄下:

           menuentry "Ubuntu 10.01 LiveCD"    {

                  search -f -s /ubuntu-desktop-i386.iso

                  loopback loop /ubuntu-desktop-i386.iso

                  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/ubuntu-desktop-i386.iso

                  initrd (loop)/casper/initrd.lz

           }

           iso 按實際文件名修改

 

          內存不夠時,把 iso 內 casper 目錄下的 vmlinuz和initrd.lz 複製出來和 iso 文件放在同一分區根目錄下:

           menuentry "Ubuntu 10.01 LiveCD"    {

                  search -f -s /ubuntu-desktop-i386.iso

 

                  linux /vmlinuz boot=casper iso-scan/filename=/ubuntu-desktop-i386.iso

                  initrd /initrd.lz

           }

 

三、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,可用800x6001024x768,建議跟你想設定的圖片大小一致

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

if [ ${recordfail} = 1 ]; then

  set timeout=-1     # 若有啓動失敗的記錄,則菜單項不再倒計時

else

  set timeout=10    #倒計時10秒後進按默認啓動項啓動

fi

#設定默認啓動前等待時間,默認爲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

#設定選擇項字體及背景顏色

#如果使用默認,背景將完全被藍色擋住了,需要修改blueblack,背景圖片才能顯示

### 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-prober30_others爲系統自動查找並添加其他系統菜單項,按windowslinuxmacos順序

#查找並添加,支持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引導的系統如win2000xpwin2003,因其引導機制只能從第一硬盤啓動,系統會自動添加#映射命令,對vistawin7就沒有這句命令

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         默認爲0,單系統時啓動菜單自動隱藏,要取消自動隱藏菜單,改爲大於0再sudo update-grub。(注意:單系統下/etc/grub.d/30_os- prober 可能沒引用這裏的變量,如果修改這裏不能顯示菜單,還要修改 /etc/grub.d/30_os-prober,具體看下面修改部份)

GRUB_HIDDEN_TIMEOUT_QUIET=true

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等可在這裏添加, text 參數啓動進入字符模式

 

# 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 << EOF

       ********

       ********

       ********

       EOF

這類語句,EOF中間的文本會直接寫入grub.cfg中相應位置,所以個性化的語句添加在這地方就可以了。

其他使用變量的語句不要隨變做修改,除非你清楚修改後會有什麼結果。

 

1)看看00_header,一樣在終端中打開sudo gedit /etc/grub.d/00_header,找到這部分

 

cat << EOF

load_env ->加載由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 << EOF

if [ \${recordfail} = 1 ]; then

  set timeout=-1    -------->設定爲若有啓動失敗記錄,不倒計時,不會進入默認啓動,需手動選擇才能啓動選擇項,若要設置爲即使曾啓動錯誤也進行默認啓動,可把時間設爲

                                                                             合適的正值,如 set timeout=5

else

  set timeout=${GRUB_TIMEOUT}      ------>使用/etc/default/grub中的設定值

fi       -------->這行後添加行

background_image (hd0,7)/boot/images/002.jpg       -------->添加背景圖片的絕對路徑,可以按05_debian_theme修改圖片路徑。

EOF

 

2)05_debian_theme修改字體及背景顏色、添加背景圖片

先打開文件 sudo gedit /etc/grub.d/05_debian_theme

看這裏

 

  cat << EOF

set menu_color_normal=white/black       ------->設置菜單全局的字體和背景顏色

set menu_color_highlight=black/white      ------->設置選擇項的字體和背景顏色。

EOF

 

可供使用菜單顏色有:

black(當背景色時爲透明)bluegreencyanredmagentabrownlight-graydark-graylight-bluelight-green

light-cyanlight-redlight-magentayellowwhite

 

 

 

添加背景圖片,看這一段

 

       source /usr/lib/grub/grub-mkconfig_lib

 

       # this allows desktop-base to override our settings

       f=/usr/share/desktop-base/grub_background.sh

       if test -e ${f} ; then

      source ${f}

       else

         WALLPAPER="/usr/share/images/desktop-base/moreblue-orbit-grub.png"

         COLOR_NORMAL="black/black"

         COLOR_HIGHLIGHT="magenta/black"

       fi

 

這裏會自動搜索背景文件,把合適的背景圖片更名爲 moreblue-orbit-grub.png(moreblue-orbit-grub.tga或moreblue-orbit-grub.jpeg),再放在/usr/share/images/desktop-base/目錄 下,然後執行 sudo update-grub,會出現如下的

       Generating grub.cfg ...

       Found background image: moreblue-orbit-grub.png

    ......

 

再重啓,漂亮的背景圖片就會出現了。

 

3)10_linux這部分是自動搜索當前系統,建立當前系統的啓動菜單,包括系統頭,內核等信息,不要隨便修改,要使用個性菜單名,比如中文菜單,可適當添加:

先打開文件 sudo gedit /etc/grub.d/10_linux,找到

 

 

              cat << EOF

menuentry "$1" {        -------->雙引號內可添加個性化字符,$1變量也可改爲定值,如改爲menuentry "啓動 Ubuntu Karmic" {

        recordfail=1

        save_env recordfail       -------->如不要保存啓動失敗記錄的,這兩句可刪除

EOF

 

  if [ "x$3" = "xquiet" ]; then

    cat << EOF

       set quiet=1

EOF ->啓動畫面不用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 << EOF

menuentry "Memory test (memtest86+)" {       -------->雙引號內可添加個性字符如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 <<EOF

if [ \${timeout} != -1 ]; then

  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

fi

EOF

      else

       cat << EOF

if [ \${timeout} != -1 ]; then

  if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then

    set timeout=0

  fi

fi

EOF

 

下面這段自動查找並添加windows、linux和macos啓動項,可在menuentry內修改個性字符

windows啓動項

for OS in ${OSPROBED} ; do

   ......

  if [ -z "${LONGNAME}" ] ; then

    LONGNAME="${LABEL}"

  fi

    ......

      cat << EOF

menuentry "${LONGNAME} (on ${DEVICE})" {       ------->比如改爲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 << EOF

menuentry "${LLABEL} (on ${DEVICE})" {       -------->比如改爲menuentry "啓動 Mandriva" {

EOF

 

macos啓動項

    macosx)

      OSXUUID="`grub-probe --target=fs_uuid --device ${DEVICE} 2> /dev/null`"

        cat << EOF

menuentry "${LONGNAME} (on ${DEVICE})" {       -------->比如改爲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己丟失,或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的轉變動作:

 

先 ls 看看分區,根據分區列表,猜下 / 分區的編號再 ls (hd0,x)/ 看分區目錄下文件確定找到 / 分區,不對的話繼續找。找到 / 分區的 (hd0,x) 繼續

       grub rescue>root=(hd0,x)

       grub rescue>prefix=/boot/grub

       grub rescue>set root=(hd0,x)

       grub rescue>set prefix=(hd0,x)/boot/grub

       grub rescue>insmod normal

    rescue>normal     -------->若出現啓動菜單,按c進入命令行模式

       rescue>linux /boot/vmlinuz-xxx-xxx root=/dev/sdax

       rescue>initrd /boot/initrd.img-xxx-xxx

       rescue>boot

 

內 核版本號 -xxx-xxx可以按Tab鍵查看後再手動補全。

 

有 /boot分區的,要先找出 /boot 分區 (hd0,x),再找出 / 分區的 (hd0,y),同樣用 ls (hd0,x)/ 和 ls (hd0,y)/ 的方式確定分區

       grub rescue>root=(hd0,x)

       grub rescue>prefix=/grub

       grub rescue>set root=(hd0,x)

       grub rescue>set prefix=(hd0,x)/grub

       grub rescue>insmod normal

       rescue>normal     -------->若出現啓動菜單,按c進入命令行模式 

       rescue>linux /vmlinuz-xxx-xxx root=/dev/sday

       rescue>initrd /initrd.img-xxx-xxx

    rescue>boot

 

說明:

1)由於grub2版本的的不一致,有的可能在第9步insmod normal.mod加載正常模塊後直接進入normal模式,即出現了normal grub>的提示符,這種情況就不能執行第10步,即可以跳過normal命令的輸入。

2)雖然輸入normal命令會出現菜單,但由於缺少加載內核的Linux命令,直接從菜單不能進入系統,需要按c在命令行繼續操作。

3)使用/boot單獨分區的,要正確修改路徑,如

       prefix=(hd0,8)/grub

       insmod /grub/normal.mod

另外root=/dev/sda8也要修改根分區的分區號。

4)按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=<大於0>,再執行

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

原貼使用的是 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

 

8、重裝windows後出現 error: no such device

由於重裝windows時會改變windows引導分區的uuid,原來的配置文件grub.cfg中的 search --no-floppy --fs-uuid --set xxx-xxx 在搜索分區時會按原來的uuid查找分區,找不到相應的uuid,就出現 error: no such device,在ubuntu下執行

sudo update-grub

重建grub.cfg,就能解決。此方法也適用於用convert命令把fat改爲ntfs格式時出現的error。

參考論壇資料: http://bbs.znpc.net/forumdisplay.php?fid=57&page=1

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章