速讀原著-GRUB_多系統引導(通過GRUB命令行來啟動Linux操作系統)

  • 2020 年 2 月 14 日
  • 筆記

五、通過GRUB命令行來啟動Linux操作系統;

GRUB的命令行才是王道,如果知道怎麼用命令行來啟動操作系統,那理解menu.lst的寫法也不難;也就是說在開機的時候,不用GRUB的菜單,通過GRUB的命令也是一樣能把操作系統引導起來。

因為menu.lst的內容就是GRUB的一個一個的指令集合;是不是Linux這玩意很神奇?

1、為什麼需要學習GRUB的命令行;

當我們把GRUB的menu.lst寫錯的時候,或者丟掉了menu.lst的時,比如在開機的時候,GRUB會出現grub>類似的命令提示符,這時需要我們用命令行啟動系統;當然您可以不用定義GRUB的菜單 ,直接用命令行來啟動系統,比如我現在就是,為了寫GRUB的文檔,就把menu.lst 刪除了,直接用命令來啟動系統;

2、用命令行來引導Linux操作系統的步驟;

通過命令行來引導操作系統的流程,也沒有什麼難的;無非是把指令手工輸入到grub>提示符的後面;在這個過程中,tab鍵的命令補齊功能就顯得很重要了。如果您不知道有哪些命令,可以輸入help;

1)進入GRUB的命令行模式 grub>

如果開機時,GRUB出現的是grub>,說明你沒有/etc/grub/menu.lst ,您需要自己寫一個才會GRUB的菜單,讓我們來選擇進入哪個系統。如果有GRUB的菜單,您可以按Ctrl+c組合鍵進入GRUB的命令行模式,會出現grub> 提示符; grub>

2)獲取幫助GRUB的 help

只要您在grub>提示符的後面輸入help 就能得到GRUB所有的命令提示;

grub> help  blocklist FILE                         boot  cat FILE                               chainloader [--force] FILE  clear                                  color NORMAL [HIGHLIGHT]  configfile FILE                        device DRIVE DEVICE  displayapm                             displaymem  find FILENAME                          geometry DRIVE [CYLINDER HEAD SECTOR [  halt [--no-apm]                        help [--all] [PATTERN ...]  hide PARTITION                         initrd FILE [ARG ...]  kernel [--no-mem-option] [--type=TYPE] makeactive  map TO_DRIVE FROM_DRIVE                md5crypt  module FILE [ARG ...]                  modulenounzip FILE [ARG ...]  pager [FLAG]                           partnew PART TYPE START LEN  parttype PART TYPE                     quit  reboot                                 root [DEVICE [HDBIAS]]  rootnoverify [DEVICE [HDBIAS]]         serial [--unit=UNIT] [--port=PORT] [--  setkey [TO_KEY FROM_KEY]               setup [--prefix=DIR] [--stage2=STAGE2_  terminal [--dumb] [--no-echo] [--no-ed terminfo [--name=NAME --cursor-address  testvbe MODE                           unhide PARTITION  uppermem KBYTES                        vbeprobe [MODE]

如果需要得到某個指令的幫助,就在 help 後面空一格,然後輸入指令,比如;

grub>help kernel 

3)cat的用法;

cat指令是用來查看文件內容的,有時我們不知道Linux的/boot分區,以及/根分區所在的位置,要查看/etc/fstab的內容來得知,這時,我們就要用到cat (hd[0-n],y)/etc/fstab 來獲得這些內容;注意要學會用tab鍵命令補齊的功能;

grub> cat (     按tab 鍵會出來hd0或hd1之類的;  grub> cat (hd0, 註:輸入hd0,然後再按tab鍵;會出來分區之類的;  grub> cat (hd0,6)  Possible partitions are:     Partition num: 0,  Filesystem type unknown, partition type 0x7     Partition num: 4,  Filesystem type is fat, partition type 0xb     Partition num: 5,  Filesystem type is reiserfs, partition type 0x83     Partition num: 6,  Filesystem type is ext2fs, partition type 0x83     Partition num: 7,  Filesystem type unknown, partition type 0x83     Partition num: 8,  Filesystem type is reiserfs, partition type 0x83     Partition num: 9,  Filesystem type unknown, partition type 0x82
grub> cat (hd0,6)/etc/fstab 註:比如我想查看一下 (hd0,6)/etc/fstab的內容就這樣輸入;    LABEL=/                 /                       ext3    defaults        1 1  /dev/devpts             /dev/pts                devpts  gid=5,mode=620  0 0  /dev/shm                /dev/shm                tmpfs   defaults        0 0  /dev/proc               /proc                   proc    defaults        0 0  /dev/sys                /sys                    sysfs   defaults        0 0  LABEL=SWAP-hda1         swap                    swap    defaults        0 0  /dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,  managed 0 0

有的弟兄可能會說,我不知道Linux安裝在了哪個分區。那根據文件系統來判斷一個一個的嘗試總可以吧我;只要能cat出/etc/fstab就能為以後引導帶來方便;

主要查看/etc/fstab中的內容,主要是Linux的/分區及/boot是否是獨立的分區;如果沒有/boot類似的行,證明/boot和 Linux的/處於同一個硬盤分區;比如上面的例子中LABEL=/ 這行是極為重要的;說明Linux系統就安在標籤為LABEL=/的分區中;

如果您的Linux系統/boot和/沒有位於同一個分區,可能cat (hd[a-n],y) 查到的是類似下面的;

LABEL=/                 /                       ext3    defaults        1 1  LABEL=/boot             /boot                   ext3    defaults        1 2

4) root (hd[0-n,y) 指令來指定/boot所在的分區;

其實這個root (hd[0,n],y)是可以省略的,如果省略了,我們要在kerenl 命令中指定;我們前面已經說過 (hd[0-n],y) 硬盤分區的表示方法的用途;主要是用來指定 /boot所在的分區;

比如我們確認/boot和 (hd0,6),所以就可以這樣來輸入root (hd0,6)

grub> root (hd0,6)

如果發現不對,可以重新來過;沒有什麼大不了的;

5) kernel 指令,用來指定Linux的內核,及/所在的分區;

kernel 這個指令可能初學者有點怕,不知道內核在哪個分區,及內核文件名的全稱是什麼。不要忘記tab鍵的命令補齊的應用;

如果我們已經通過root (hd[0-n],y) 指定了/boot所在的分區,語法有兩個:

如果/boot和Linux的/位於同一個分區,應該是下面的一種格式;

kernel /boot/vmlinuz在這裡按tab鍵來補齊,就看到內核全稱了 ro root=/dev/hd[a-z]X

如果/boot有自己獨立的分區,應該是;

kernel /vmlinuz在這裡按tab鍵來補齊,就看到內核全稱了 ro root=/dev/hd[a-z]X

在這裡 root=/dev/hd[a-z]X 是Linux 的/根所位於的分區,如果不知道是哪個分區,就用tab出來的來計算,一個一個的嘗試;或用cat (hd[0-n],y)/etc/fstab 中得到Linux的/所在的分區或分區的標籤;

grub> kernel /boot/在這裡按tab鍵;這樣就列出/boot中的文件了;  Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369  _FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK memtest86+-1.55  .1 xen-syms xen.gz    grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/     [Linux-bzImage, setup=0x1e00, size=0x18e473]

註解: root=LABEL=/ 是Linux的/所在的分區的文件系統的標籤;如果您知道Linux的/在哪個具體的分區,用root=/dev/hd[a-z]X來指定也行。比如下面的一行也是可以的;

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7

也可以把/boot所在的分區的指定 root (hd[0-n],y)這行省掉,直接在kernel 中指定/boot所在的分區;所以就在下面的語法;

如果是/boot和Linux的根同處一個分區;

kernel (hd[0-n],y)/boot/vmlinuz ro root=/dev/hd[a-z]X

比如:

grub>kernel

如果是/boot和Linux所在的根不在一個分區;則是;

kernel (hd[0-n],y)/vmlinuz  ro root=/dev/hd[a-z]X    grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7     [Linux-bzImage, setup=0x1e00, size=0x18e473]

或下面的輸入,以cat 出/etc/fstab內容為準;

grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/     [Linux-bzImage, setup=0x1e00, size=0x18e473]

6)initrd 命令行來指定initrd文件;

grub> initrd /boot/initrd在這裡tab 來補齊;  grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img     [Linux-initrd @ 0x2e1000, 0x10e685 bytes]

如果/boot是獨立的一個分區,應該是如下樣子的語法;比如下面的;

grub> initrd /initrd在這裡tab 來補齊;  grub> initrd /initrd-2.6.11-1.1369_FC4.img     [Linux-initrd @ 0x2e1000, 0x10e685 bytes]

7)boot 引導系統;

grub>boot

前面的幾個步驟都弄好 。就進入引導;嘗試一下就知道了。。

8)引導Linux系統實例全程回放;

實例:/boot和Linux的/處於同一個硬盤分區;

grub> cat (hd0,6)/etc/fstab  # This file is edited by fstab-sync - see 'man fstab-sync' for details  LABEL=/                 /                       ext3    defaults        1 1  /dev/devpts             /dev/pts                devpts  gid=5,mode=620  0 0  /dev/shm                /dev/shm                tmpfs   defaults        0 0  /dev/proc               /proc                   proc    defaults        0 0  /dev/sys                /sys                    sysfs   defaults        0 0  LABEL=SWAP-hda1         swap                    swap    defaults        0 0  /dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,managed 0 0    grub> root (hd0,6)  Filesystem type is ext2fs, partition type 0x83    grub> kernel /boot/在這裡按tab補齊,全列出/boot所有的文件;  Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4  memtest86+-1.55.1 xen-syms xen.gz    grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7  註:輸入     [Linux-bzImage, setup=0x1e00, size=0x18e473]    grub> initrd /boot/在這裡按tab補齊  Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4  memtest86+-1.55.1 xen-syms xen.gz    grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;輸入intrd文件名的全名;     [Linux-initrd @ 0x2e1000, 0x10e685 bytes]    grub> boot

我們指定Linux的根時,可以用cat出來的fstab的內容中Linux的/分區文件系統標籤來替代;也就是

kernel 那行中 root=/dev/hd[a-z]X;    grub> cat (hd0,6)/etc/fstab  # This file is edited by fstab-sync - see 'man fstab-sync' for details  LABEL=/                 /                       ext3    defaults        1 1  /dev/devpts             /dev/pts                devpts  gid=5,mode=620  0 0  /dev/shm                /dev/shm                tmpfs   defaults        0 0  /dev/proc               /proc                   proc    defaults        0 0  /dev/sys                /sys                    sysfs   defaults        0 0  LABEL=SWAP-hda1         swap                    swap    defaults        0 0    /dev/hdc                /media/cdrecorder       auto    pamconsole,exec,noauto,managed 0 0    grub> root (hd0,6)  Filesystem type is ext2fs, partition type 0x83    grub> kernel /boot/在這裡按tab補齊,全列出/boot所有的文件;  Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4  memtest86+-1.55.1 xen-syms xen.gz    grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/     [Linux-bzImage, setup=0x1e00, size=0x18e473]    grub> initrd /boot/在這裡按tab補齊  Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK  memtest86+-1.55.1 xen-syms xen.gz    grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img 注;輸入intrd文件名的全名;     [Linux-initrd @ 0x2e1000, 0x10e685 bytes]    grub> boot

如果是/boot和Linux的根分區不在同一個分區,要把kernel和initrd 指令中的/boot去掉,也就是/vmlinuzMMMMMM/initrdNNNN

也可以不用root (hd[0-n]來指定/boot所在分區,要在kernel 和initrd 中指定;比如Linux的/根所位於的分區和/boot所位於的分區都是(hd0,6),並且我們cat出來的/etc/fstab是Linux的/根分區的文件系統的標籤為LABEL=/,引導操作系統的例子如下;

grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/  grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img  grub>boot

grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7  grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img  grub>boot

如果/boot位於 /dev/hda6,也就是(hd0,5),Linux的根/位於分區/dev/hda7,並且我們cat 出來的/etc/fstab 中/分區的標籤為 LABEL=/。下面的兩種方法都可以引導;

grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/  grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img  grub>boot

grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7  grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img  grub>boot