速讀原著-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