GRUB安裝及命令行排錯

 

GRUB安裝

  • 安裝 Grub 涉及三個步驟:
  1. 建立 /boot/grub/grub.conf 配置文件。
  2. 在 /boot/grub 安裝 Grub 文件。
  3. 安裝 Grub 開機程序。

第二及第三步能夠經過 grub-install 單一個指令來完成。 另外,第二步亦可經過 grub 這個指令來完成。linux

  • Grub 慣用名稱

Grub 按如下方式爲碟盤及分區命名:shell

  1. 不論碟盤是 IDE(PATA)、SATA 或 SCSI 碟盤,也不論它們的廣泛稱謂是 hd 或 sd,全部碟盤一概稱爲 hd。
  2. 全部碟盤及分區一概以 0 而不是 1 開始編號。
  3. 不論碟盤上有多少個主分區,擴展分區一概以 4 開始編號。
  4. 第一個數字表明碟盤;第二個數字(存在的話)表明分區。

樣例:vim

Grub 稱謂 意思 廣泛稱謂
(hd0) 第一個碟盤 /dev/sda(或/dev/hda)
(hd1) 第二個碟盤 /dev/sdb(或/dev/hdb)
(hd0,0) 第一個碟盤,第一個分區 /dev/sda1(或/dev/hda1)
(hd1,0) 第二個碟盤,第一個分區 /dev/sdb1(或/dev/hdb1)
(hd1,1) 第二個碟盤,第二個分區 /dev/sdb2(或/dev/hdb2)

grub.conf

建立或編輯 /boot/grub/grub.conf 配置文件windows

首先,你應該建立或編輯 /boot/grub/grub.conf 這個配置文件。 要是你的碟盤不曾安裝 Grub 開機程序,你應該先建立配置文件,而後才安裝開機程序。centos

在某些發行版本下,配置文件名爲 /boot/grub/menu.lst。在 CentOS 下,/boot/grub/menu.lst 是條連結,它指向正式配置文件 /boot/grub/grub.conf。數組

此文件含有如下信息:工具

  1. 缺省的開機分區。
  2. 等候多久才自動引導缺省的分區。
  3. 選擇性地提供一個開機劃面,在等候用戶輸入時顯示出來。
  4. 可供用戶選擇的各個開機分區。

樣例:ui

(請勿輸入行首的數字。它們索引樣例檔後的解釋。)this

1spa

2

3

4

5

6

7

8

9

10

11

12

13

1 default=0                                    # 缺省引導清單內的首個分區。請注意 Grub 的編號以 0 開始,而不是 1。

2 timeout=10                                   # 停頓 10 秒等候用戶輸入,而後引導缺省分區。

3 splashimage=(hd0,5)/boot/grub/splash.xpm.gz  # 等候用戶輸入時顯示開機劃面(選擇性的)。

4 title CentOS 5.6 i686                        # 第一個可用的開機分區。在此樣例中,它是缺省的分區(見行 1)。

5   root (hd0,5)                               # 按Grub 的命名方式指定主分區。

6   kernel /boot/vmlinuz-2.6.18-238.19.1.el5.centos.plusPAE ro root=/dev/sda6 rhgb noquiet # 內核位置、只讀掛載分區、主分區位置等5個部份

7   initrd /boot/initrd-2.6.18-238.19.1.el5.centos.plusPAE.img  #以慣用的命名方式指出初始化 ramdisk initrd 或 initramfs 的位置。

8 title Linux Mint 11                          # 第二個可用的開機分區。

9   root (hd0,9)                               # 按 Grub 的命名方式指定主分區。

10  kernel /boot/vmlinuz-2.6.32-26-generic-pae ro root=/dev/sda10 # 內核(vmlinuz)位置、只讀掛載分區、主分區位置

11  initrd /boot/initrd.img-2.6.32-26-generic-pae # 以慣用的命名方式指出初始化 ramdisk initrd 或 initramfs 的位置。

倘若你把 /boot 放在獨立的分區內,請參閱如下的備註。

XStar: 
    root (hd0,0)指令指向boot分區位置;
    kernel、initrd位置是以boot分區爲起點計算;
    kernel指令中root參數主分區應指向系統根分區。

解釋:

kernel行包含如下 5 部份:

kernel /boot/vmlinuz-2.6.18-238.19.1.el5.centos.plusPAE 以 慣用的命名方式 指出 內核(vmlinuz) 的位置。
ro 首先以 ro(只讀)方式掛載分區,以便在有須要時執行 fsck。
root=/dev/sda6 以 慣用的命名方式 指出 主分區 的位置。你也可經過文件系統的 UUID(通用惟一標識碼)來指定主分區,例如:root=UUID=134d2a24-2699-4b0c-823b-1e13633f3b07。CentOS 如今缺省採用 UUID。你能夠利用這個指命來找出一個文件系統的 UUID:tune2fs -l /dev/sda6,或lsblk,blkid。
rhgb 採用圖像式開機(Red Hat 圖像式開機)。須要文字模式開機時可刪除。
noquiet 輸出詳細信息。刪除後可減低詳細度。

grub-install

當可行時,安裝 Grub 的最簡易方法是利用 grub-install 這個指令。

此指令將會:

  • 在現有分區的 /boot/grub 內安裝所需文件。
  • 在經過傳統命名方式所指定的位置安裝開機程序。

樣例:

指令 含意
grub-install /dev/sda 在現有分區的 /boot/grub 目錄內安裝 Grub 的文件。在首個碟盤的主引導記錄(MBR)內安裝開機程序。這是安裝 Grub 的推薦方式。
grub-install /dev/sda1 在現有分區的 /boot/grub 目錄內安裝 Grub 的文件。在首個碟盤的第一個分區內安裝開機程序。
grub-install /dev/sda2 在現有分區的 /boot/grub 目錄內安裝 Grub 的文件。在首個碟盤的第二個分區內安裝開機程序。

1

2

3

4

5

6

7

8

9

grub-install /dev/sda

Installation finished. No error reported.

This is the contents of the device map /boot/grub/device.map.

Check if this is correct or not. If any of the lines is incorrect,

fix it and re-run the script 'grub-install'.

 

# this device map was generated by anaconda

(hd0)     /dev/sda

  • 關於新版grub2

新版的grub-install命令指定安裝目錄時再也不使用--root-directory選項,改成 --boot-directory選項,安裝文件不是安裝在指定目錄的/boot/grub下,而是安裝在指定目錄的/grub下,具體用法爲:

grub-install --boot-directory=DIR Install-Device

舉個例子說明,若是 /boot分區爲 sda7,/ 分區爲 sda8,在使用 livecd 模式修復grub2到mbr時使用的命令爲

1

2

3

4

5

6

7

8

9

10

11

12

# 若是是之前的grub2,必須先掛載系統的 / 分區,再把系統的 /boot分區掛載到系統 / 分區下

sudo mount /sda8 /mnt

sudo mount /sda7 /mnt/boot

sudo grub-install --boot-directory=/mnt/boot /dev/sda

 

# Ubuntu 11.04的版本能夠不用掛載系統的 / 分區,直接掛載 /boot分區

sudo mount /dev/sda7 /mnt

sudo grub-install --boot-directory=/mnt /dev/sda

 

# 而對於只有 / 分區(假設爲 /dev/sda7) ,沒有 /boot單獨分區的,使用命令爲

sudo mount /dev/sda7 /mnt

sudo grub-install --boot-directory=/mnt/boot /dev/sda

用grub安裝

你也可利用 grub 這個指令來安裝開機程序,它卻不會在 /boot/grub 內安裝 Grub 的文件。要是開機程序被蓋過或損壞了,此方法可修復 Grub 的安裝。

  1. 執行 grub。
  2. 你可選擇執行 find /boot/grub/stage1 尋找哪一個分區在 /boot/grub 內含有 Grub 所需的文件。若是你的 /boot 採用獨立分區,請執行 find /grub/stage1。
  3. 執行 root [按 Grub 方式命名的分區] 來指定哪一個分區的 /boot/grub 內含有 Grub 文件及備有 /boot/grub/grub.conf。
  4. 利用 setup [按 Grub 方式命名的開機程序位置] 來安裝開機程序。
  5. 執行 quit 來離開 Grub 程序。

樣例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

[root@localhost ~]# grub

Probing devices to guess BIOS drives. This may take a long time.

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB

   lists possible command completions.  Anywhere else TAB lists the possible

   completions of a device/filename.]

grub> find /boot/grub/stage1

 (hd0,5)

 (hd0,9)

grub> root (hd0,5)

 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0)

 Checking if "/boot/grub/stage1" exists... yes

 Checking if "/boot/grub/stage2" exists... yes

 Checking if "/boot/grub/e2fs_stage1_5" exists... yes

 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.

succeeded

 Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,5)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded

Done.

grub> quit

獨立boot分區

要是你的 /boot 放在獨立的分區內,/boot/grub/grub.conf 內以 root、kernel 及 initrd 起首的行必須有下列改動:

  1. 以 root 起首的那一行必須指定 /boot 的分區,而不是 / 的分區。
  2. 以 kernel 起首的那一行必須假設內核(vmlinuz)位於 /,而不是 /boot。然而,該行中 root 指令必須指定 / 的分區,而不是 /boot 的分區。
  3. 以 initrd 起首的那一行必須假設初始化 ramdisk(initrd 或 initramfs)位於 /,而不是 /boot。
XStar: 
    root (hd0,0)指令指向boot分區位置;
    kernel、initrd位置是以boot分區爲起點計算;
    kernel指令中root參數主分區應指向系統根分區。

樣例:

/boot 的分區是 /dev/sda1,或 hd(0,0)。/ 的分區是 /dev/sda2,或 hd(0,1)。/boot/grub/grub.conf 檔須含有下列設置:

title CentOS 5.6 i686
  root (hd0,0)
  kernel /vmlinuz-2.6.18-238.19.1.el5.centos.plusPAE ro root=/dev/sda2
  initrd /initrd-2.6.18-238.19.1.el5.centos.plusPAE.img

grub引導Windows

要使用 Grub 來引導一個 Windows 分區,請在 /boot/grub/grub.conf 加入相似如下的內容:

樣例:

title Windows
  rootnoverify (hd0,0)
  makeactive
  chainloader +1
  • grub2:ntldr命令

新版的grub2能夠用ntldr命令引導windows,對同時安裝有xp和win7的朋友能夠用自定菜單來分別引導xp和win7。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# windows 7

menuentry "Windows 7" {

        set root=(hd0,x)

        ntldr /bootmgr

        boot

}

 

# winxp

menuentry "Windows XP" {

        set root=(hd0,x)

        ntldr /ntldr

        boot

}

 

# ntldr 命令也能夠引導grldr進入grub4dos

menuentry "Grub4dos" {

        set root=(hd0,x)

        ntldr /grldr

        boot

}

從新安裝GRUB

Linux Rescue

倘若你曾經從備份磁帶修復你的系統(例如經過 dump 或 tar),或者安裝了一個好像來自 Redmond 般會蓋過主引導記錄(MBR)的操做系統,你便需要修復開機管理程序。

請執行下列步驟:

  1. 用 CentOS 安裝碟片開機(例如首張 CD 或 DVD)。
  2. CentOS-4 或 CentOS-5 請在 boot: 提示輸入 linux rescue。CentOS-6 請從開機選單選擇 Rescue installed system。
  3. 以讀寫模式掛載全部文件系統。
  4. chroot 到你硬盤內的真正根目錄('/')。

    1

    chroot /mnt/sysimage

  5. 從新安裝開機管理程序(GRUB)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    # 若果你要在 SCSI 硬盤或 SATA 硬盤的 MBR(/dev/sda)從新安裝 GRUB:

    grub-install /dev/sda

     

    # 若果你要在 SCSI 硬盤或 SATA 硬盤的第二個分區內的 PBR(/dev/sda2)從新安裝 GRUB:

    grub-install /dev/sda2

     

    # 若果你要在 IDE 硬盤的 MBR(/dev/hda)從新安裝 GRUB:

    grub-install /dev/hda

     

    # 若果你要在 HP Smart Array 磁盤數組的 MBR(/dev/c0d0)從新安裝 GRUB:

    grub-install /dev/cciss/c0d0

Super Grub Disk

Super Grub Disk 收錄了各類開源的開機修復程序。就 CentOS 的舊版 GRUB 而言,SuperGRUB 很是實用。

http://www.supergrubdisk.org/

http://www.supergrubdisk.org/wiki/SGD_Howto_make

  • Super Grub2 Disk
    Boots into many systems and GRUB2 ones!
        Loads Grub legacy confs (menu.lst)
        Optional LVM / RAID support
        ~ 7.00 MB Size
  • Rescatux
    Includes Super Grub2 Disk
        Fixes GRUB / GRUB2
        Check and fix filesystems
        Blank Windows password
        Change Gnu/Linux password
        Regenerate sudoers file
        And much more features…
        ~ 367 MB Size

Rescatux是debian系列系統 (Ubuntu, Linux Mint 等) 下的圖形化Grub/Grub2修復工具。Rescatux的最新版支持文件系統的檢測。

要想使用Rescatux,首先把它刻錄到CD或者USB啓動上,重啓,從 Live CD/USB 或啓動,會自動彈出Grub 恢復界面。

選擇「grub-install」,恢復Grub菜單,後運行「update-grub」.重啓計算機。

排除GRUB的問題

Grub命令行

你可在開機程序內直接輸入 Grub 的指令。在開機選單按 c,而後輸入那些出如今 /boot/grub/grub.conf 配置文件內的 Grub 指令。

當配置文件出錯時,這個功能頗有用。

樣例:

grub> find /boot/grub/stage1
 (hd0,5)

grub> root (hd0,5)
grub> kernel /boot/vmlinuz-2.6.18-238.19.1.el5.centos.plusPAE ro root=/dev/sda6
grub> initrd /boot/initrd-2.6.18-238.19.1.el5.centos.plusPAE.img
grub> boot

你也能夠經過 e 這個指令在 Grub 開機程序內編輯 /boot/grub/grub.conf 內的某行。

舉個例說,要令 Linux 以單一用戶模式(runlevel 1)引導,編輯含有 kernel 的那一行並在行末加入 1。按着按 b 來引導它。

操做技巧

在grub>狀態下輸入時,可以使用tab鍵自動被全來嘗試正確的參數。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

grub> <tab>         # 按tab鍵能夠查看全部可用命令

grub> root (hd0,    # 按tab鍵自動提示,會列出hd0上全部分區信息

grub> root (hd0,1)

 Filesystem type is ext2fs, partition type 0x83

grub> kernel /VM    # 按Tab補全

Error 15: File not found

grub> root (hd0,0)

 Filesystem type is ext2fs, partition type 0x83

grub> kernel /vmlinuz-2.6.32-279.e16.i686 ro root=/dev/sda4  # 一個個試根分區,出錯需重啓動、再試

    [Linux-bzImage, setup=0x3400, size=0x3aa5e0]

grub> initrd /initramfs-2.6.32=e16.i686.img   # 啓動內核所使用的臨時系統鏡像文件位置,也是先輸入initrd /in而後用tab補全

    [Linux-initrd @ 0x37198000, 0xe57fd6 bytes]

grub> boot

另外,在vim編輯grub.conf時,使用':.!'命令能夠方便地將命令內容追加至當前位置:

1

2

3

4

5

6

7

8

9

10

# vim中將外部命令執行結果添加到文件中

 

# 經過ls添加kernel信息

:.! ls /boot/vmlinuz-2.6.32-279.e16.i686

 

# 導入設備uuid信息

:.! blkid /dev/sda4

 

# 經過ls添加initrd信息

:.! ls /boot/initramfs-2.6.32-279.e16.i686.img

排錯範例

倘若一個系統的 GRUB 設置出現問題(成因包括:不正確地修改 GRUB 配置文件、安裝另外一個操做系統、硬件上或 BIOS 內的改動引致設置的排序不相同),致使 GRUB 不能找到它的配置文件,你可能會面對 grub 的開機提示符而無從着手。廣泛來講,第一步是要找出 GRUB 配置文件的位置。GRUB 的 find 指令能夠爲你效努。

find定位boot分區和主目錄

1

2

3

4

grub> find /grub/grub.conf # 查找grub配置所在分區,能夠查grub.conf(CentOS)、menu.lst(Ubuntu)

 (hd0,2)

 (hd1,2)

這裏告欣咱們有兩個 /boot 分區,有可能源自軟件 RAID 或不一樣操做系統。頭一個位於第一個硬盤的第三個分區,而另外一個位於第二個硬盤的第三個分區。

若是你安裝了其它 Linux 版本,例如 Ubuntu,它也設只有 menu.lst 檔而沒有 grub.conf,但因爲 CentOS 利用連結把 menu.lst 指向 grub.conf,所以在這兩款系統上尋找 menu.lst 亦可行:

1

2

3

4

grub> find /grub/menu.lst

 (hd0,0)

 (hd0,1)

這裏告欣咱們有兩個 /boot 分區,頭一個位於第一個硬盤的第一個分區,極可能正是 CentOS,而另外一個 Linux 的 /boot 位於第一個硬盤的第二個分區。

要是首輪嘗試找不到文件,極可能 /boot 分區並不存在,而 grub 被安裝在主目錄內。你可試用

1

2

3

grub> find /boot/grub/grub.conf

 (hd0,0)

 (hd1,4)

一樣地,這個例子裏有兩個 GRUB 安裝。頭一個在第一個硬盤的第一個分區,而另外一個在第二個硬盤的第五個分區 —— 亦即首個擴展分區。

若果要撤消第二個項目並將 GRUB 的開機程序安裝在第一個硬盤的 MBR 上:

1

2

grub> root (hd1,4)

grub> setup (hd0)

要是你不清楚主目錄的位置時,你能夠嘗試尋找 /etc 內的一個文件。譬如:

1

2

3

grub> root (hd1,4)

grub> find /etc/fstab

 (hd0,1)

由此咱們得知 / 位於第一個硬盤的第二個分區上 —— 採用 SCSI 或 SATA 等於 /dev/sda2,而採用 PATA 等於 /dev/hda2。

cat配置文件

要查看 grub.conf 及 menu.lst 檔的內容,可以使用 GRUB 的 cat 指令:

1

2

3

4

grub> cat (hd0,0)/grub/grub.conf

 ... 顯示文件內容 ...

grub> cat (hd0,1)/grub/menu.lst

 ... 顯示文件內容 ...

setup安裝至MBR

倘若要將第一個項目的 GRUB 設置從新安裝到 MBR:

1

2

grub> root (hd0,0)

grub> setup (hd0)

GRUB 的指令shell還有不少功能,而且在 GRUB 的 info 檔內有詳情記載,請利用 info grub 來訪問它們。

最新最先最熱

相關文章
相關標籤/搜索