久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

grub2詳解(翻譯和整理官方手冊)

 zhangzhmj 2019-07-08

本文原創(chuàng)地址在博客園:https://www.cnblogs.com/f-ck-need-u/archive/2017/06/29/7094693.html

翻譯了grub2官方手冊的絕大部分內容,,然后自己整理了一下。因為內容有點雜,,所以章節(jié)安排上可能不是太合理,敬請諒解,。

本人譯作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


本文主要介紹的是grub2,,在文末對傳統(tǒng)grub進行了簡述,但在grub2的內容部分中包含了很多grub2和傳統(tǒng)grub的對比,。

如果僅僅是想知道grub2中的boot.img/core.img/diskboot.img/kernel.img或者傳統(tǒng)grub中stage1/stage1_5/stage2文件的作用,,請直接跳至相關內容處閱讀。

1.1 基礎內容

1.1.1 grub2和grub的區(qū)別

官方手冊原文:https://www./software/grub/manual/html_node/Changes-from-GRUB-Legacy.html#Changes-from-GRUB-Legacy

只說明幾個主要的:

1.配置文件的名稱改變了,。在grub中,,配置文件為grub.conf或menu.lst(grub.conf的一個軟鏈接),在grub2中改名為grub.cfg,。

2.grub2增添了許多語法,,更接近于腳本語言了,例如支持變量,、條件判斷,、循環(huán)。

3.grub2中,,設備分區(qū)名稱從1開始,,而在grub中是從0開始的。

4.grub2使用img文件,,不再使用grub中的stage1、stage1.5和stage2,。

5.支持圖形界面配置grub,,但要安裝grub-customizer包,epel源提供該包,。

6.在已進入操作系統(tǒng)環(huán)境下,,不再提供grub命令,也就是不能進入grub交互式界面,,只有在開機時才能進入,,算是一大缺憾。

7.在grub2中沒有了好用的find命令,算是另一大缺憾,。

1.1.2 命名習慣和文件路徑表示方式

官方手冊原文:https://www./software/grub/manual/html_node/Naming-convention.html#Naming-convention

(fd0) :表示第一塊軟盤(hd0,msdos2) :表示第一塊硬盤的第二個mbr分區(qū),。grub2中分區(qū)從1開始編號,傳統(tǒng)的grub是從0開始編號的(hd0,msdos5) :表示第一塊硬盤的第一個邏輯分區(qū)(hd0,gpt1) :表示第一塊硬盤的第一個gpt分區(qū)/boot/vmlinuz :相對路徑,,基于根目錄,,表示根目錄下的boot目錄下的vmlinuz, :如果設置了根目錄變量root為(hd0,msdos1),,則表示(hd0,msdos1)/boot/vmlinuz(hd0,msdos1)/boot/vmlinuz:絕對路徑,,表示第一硬盤第一分區(qū)的boot目錄下的vmlinuz文件

1.1.3 grub2引導操作系統(tǒng)的方式

官方手冊原文:https://www./software/grub/manual/html_node/General-boot-methods.html#General-boot-methods

grub2支持兩種方式引導操作系統(tǒng):

  • 直接引導:(direct-load)直接通過默認的grub2 boot loader來引導寫在默認配置文件中的操作系統(tǒng)
  • 鏈式引導:(chain-load)使用默認grub2 boot loader鏈式引導另一個boot loader,該boot loader將引導對應的操作系統(tǒng)

一般只使用第一種方式,,只有想引導grub默認不支持的操作系統(tǒng)時才會使用第二種方式,。

1.1.4 grub2程序和傳統(tǒng)grub程序安裝后的文件分布

在傳統(tǒng)grub軟件安裝完后,在/usr/share/grub/RELEASE/目錄下會生成一些stage文件,。

[root@xuexi ~]# ls /usr/share/grub/x86_64-redhat/e2fs_stage1_5      ffs_stage1_5       jfs_stage1_5       reiserfs_stage1_5  stage2             ufs2_stage1_5      xfs_stage1_5fat_stage1_5       iso9660_stage1_5   minix_stage1_5     stage1             stage2_eltorito    vstafs_stage1_5

在grub2軟件安裝完后,,會在/usr/lib/grub/i386-pc/目錄下生成很多模塊文件和img文件,還包括一些lst列表文件,。

[root@server7 ~]# ls /usr/lib/grub/i386-pc/*.mod | wc -l257[root@server7 ~]# ls -lh /usr/lib/grub/i386-pc/*.lst -rw-r--r--. 1 root root 3.7K Nov 24 2015 /usr/lib/grub/i386-pc/command.lst-rw-r--r--. 1 root root 936 Nov 24 2015 /usr/lib/grub/i386-pc/crypto.lst-rw-r--r--. 1 root root 214 Nov 24 2015 /usr/lib/grub/i386-pc/fs.lst-rw-r--r--. 1 root root 5.1K Nov 24 2015 /usr/lib/grub/i386-pc/moddep.lst-rw-r--r--. 1 root root 111 Nov 24 2015 /usr/lib/grub/i386-pc/partmap.lst-rw-r--r--. 1 root root 17 Nov 24 2015 /usr/lib/grub/i386-pc/parttool.lst-rw-r--r--. 1 root root 202 Nov 24 2015 /usr/lib/grub/i386-pc/terminal.lst-rw-r--r--. 1 root root 33 Nov 24 2015 /usr/lib/grub/i386-pc/video.lst[root@server7 ~]# ls -lh /usr/lib/grub/i386-pc/*.img-rw-r--r--. 1 root root 512 Nov 24 2015 /usr/lib/grub/i386-pc/boot_hybrid.img-rw-r--r--. 1 root root 512 Nov 24 2015 /usr/lib/grub/i386-pc/boot.img-rw-r--r--. 1 root root 2.0K Nov 24 2015 /usr/lib/grub/i386-pc/cdboot.img-rw-r--r--. 1 root root 512 Nov 24 2015 /usr/lib/grub/i386-pc/diskboot.img-rw-r--r--. 1 root root 28K Nov 24 2015 /usr/lib/grub/i386-pc/kernel.img-rw-r--r--. 1 root root 1.0K Nov 24 2015 /usr/lib/grub/i386-pc/lnxboot.img-rw-r--r--. 1 root root 2.9K Nov 24 2015 /usr/lib/grub/i386-pc/lzma_decompress.img-rw-r--r--. 1 root root 1.0K Nov 24 2015 /usr/lib/grub/i386-pc/pxeboot.img

1.1.5 boot loader和grub的關系

當使用grub來管理啟動菜單時,,那么boot loader都是grub程序安裝的。

傳統(tǒng)的grub將stage1轉換后的內容安裝到MBR(VBR或EBR)中的boot loader部分,,將stage1_5轉換后的內容安裝在緊跟在MBR后的扇區(qū)中,,將stage2轉換后的內容安裝在/boot分區(qū)中。

grub2將boot.img轉換后的內容安裝到MBR(VBR或EBR)中的boot loader部分,,將diskboot.img和kernel.img結合成為core.img,,同時還會嵌入一些模塊或加載模塊的代碼到core.img中,然后將core.img轉換后的內容安裝到磁盤的指定位置處,。

它們之間更具體的關系見下文,。

1.1.6 grub2的安裝位置

官方手冊原文:https://www./software/grub/manual/html_node/BIOS-installation.html#BIOS-installation

嚴格地說是core.img的安裝位置,因為boot.img的位置是固定在MBR或VBR或EBR上的,。

(1).MBR

MBR格式的分區(qū)表用于PC BIOS平臺,,這種格式允許四個主分區(qū)和額外的邏輯分區(qū)。使用這種格式的分區(qū)表,,有兩種方式安裝GURB:

  1. 嵌入到MBR和第一個分區(qū)中間的空間,,這部分就是大眾所稱的'boot track','MBR gap'或'embedding area',它們大致需要31kB的空間,;
  2. 將core.img安裝到某個文件系統(tǒng)中,,然后使用分區(qū)的第一個扇區(qū)(嚴格地說不是第一個扇區(qū),而是第一個block)存儲啟動它的代碼,。

這兩種方法有不同的問題,。

使用嵌入的方式安裝grub,,就沒有保留的空閑空間來保證安全性,例如有些專門的軟件就是使用這段空間來實現(xiàn)許可限制的,;另外分區(qū)的時候,,雖然會在MBR和第一個分區(qū)中間留下空閑空間,但可能留下的空間會比這更小,。

方法二安裝grub到文件系統(tǒng),,但這樣的grub是脆弱的。例如,,文件系統(tǒng)的某些特性需要做尾部包裝,,甚至某些fsck檢測,它們可能會移動這些block,。

GRUB開發(fā)團隊建議將GRUB嵌入到MBR和第一個分區(qū)之間,,除非有特殊需求,但仍必須要保證第一個分區(qū)至少是從第31kB(第63個扇區(qū))之后才開始創(chuàng)建的,。

現(xiàn)在的磁盤設備,,一般都會有分區(qū)邊界對齊的性能優(yōu)化提醒,所以第一個分區(qū)可能會自動從第1MB處開始創(chuàng)建,。

(2).GPT

一些新的系統(tǒng)使用GUID分區(qū)表(GPT)格式,,這種格式是EFI固件所指定的一部分。但如果操作系統(tǒng)支持的話,,GPT也可以用于BIOS平臺(即MBR風格結合GPT格式的磁盤),,使用這種格式,需要使用獨立的BIOS boot分區(qū)來保存GRUB,,GRUB被嵌入到此分區(qū),,不會有任何風險。

當在gpt磁盤上創(chuàng)建一個BIOS boot分區(qū)時,,需要保證兩件事:(1)它最小是31kB大小,,但一般都會為此分區(qū)劃分1MB的空間用于可擴展性;(2)必須要有合理的分區(qū)類型標識(flag type),。

例如使用gun parted工具時,,可以設置為bios_grub標識:

1
2
# parted /dev/sda toggle partition_num bios_grub
# parted /dev/sda set partiton_num bios_grub on

如果使用gdisk分區(qū)工具時,則分類類型設置為'EF02',。

如果使用其他的分區(qū)工具,,可能需要指定guid,則可以指定其guid為'21686148-6449-6e6f-744e656564454649',。

下圖是某個bios/gpt格式的bios boot分區(qū)信息,從中可見,,它大小為1M,,沒有文件系統(tǒng),分區(qū)表示為bios_grub。

下圖為gpt磁盤在圖形界面下安裝操作系統(tǒng)時創(chuàng)建的Bios boot分區(qū),。

1.1.7 進入grub命令行

在傳統(tǒng)的grub上,,可以直接在bash下敲入grub命令進入命令交互模式,但grub2只能在系統(tǒng)啟動前進入grub交互命令行,。

按下e見可以編輯所選菜單對應的grub菜單配置項,,按下c鍵可以進入grub命令行交互模式。

1.2 安裝grub2

官方手冊原文:https://www./software/grub/manual/html_node/Installing-GRUB-using-grub_002dinstall.html#Installing-GRUB-using-grub_002dinstall

這里的安裝指的不是安裝grub程序,,而是安裝Boot loader,,但一般都稱之為安裝grub,且后文都是這個意思,。

1.2.1 grub安裝命令

安裝方式非常簡單,,只需調用grub2-install,然后給定安裝到的設備名即可,。

shell> grub2-install /dev/sda

這樣的安裝方式,,默認會將img文件放入到/boot目錄下,如果想自定義放置位置,,則使用--boot-directory選項指定,,可用于測試練習grub的時候使用,但在真實的grub環(huán)境下不建議做任何改動,。

shell> grub2-install --boot-director=/mnt/boot /dev/fd0

如果是EFI固件平臺,,則必須掛載好efi系統(tǒng)分區(qū),一般會掛在/boot/efi下,,這是默認的,,此時可直接使用grub2-install安裝。

shell> grub2-install

如果不是掛載在/boot/efi下,,則使用--efi-directory指定efi系統(tǒng)分區(qū)路徑,。

shell> grub2-install --efi-directory=/mnt/efi

grub2-install實際上是一個shell腳本,用于調用其他工具,,真正的功能都是其他工具去完成的,,所以如果非常熟悉grub內部命令和機制,完全可以不用grub2-install,。

對應傳統(tǒng)的grub安裝命令為grub-install,,用法和grub2-install一樣。

1.2.2 各種img和stage文件的說明

官方手冊原文:https://www./software/grub/manual/html_node/Images.html#Images

img文件是grub2生成的,,stage文件是傳統(tǒng)grub生成的,。下面是各種文件的說明。

1.2.2.1 grub2中的img文件

grub2生成了好幾個img文件,,有些分布在/usr/lib/grub/i386-pc目錄下,,有些分布在/boot/grub2/i386-pc目錄下,,它們之間的關系,相信看了下文之后就會明白了,。

下圖描述了各個img文件之間的關系,。其中core.img是動態(tài)生成的,路徑為/boot/grub2/i386-pc/core.img,,而其他的img則存在于/usr/lib/grub/i386-pc目錄下,。當然,在安裝grub時,,boot.img會被拷貝到/boot/grub2/i386-pc目錄下,。

(1)boot.img

在BIOS平臺下,boot.img是grub啟動的第一個img文件,,它被寫入到MBR中或分區(qū)的boot sector中,,因為boot sector的大小是512字節(jié),所以該img文件的大小也是512字節(jié),。

boot.img唯一的作用是讀取屬于core.img的第一個扇區(qū)并跳轉到它身上,,將控制權交給該扇區(qū)的img。由于體積大小的限制,,boot.img無法理解文件系統(tǒng)的結構,,因此grub2-install將會把core.img的位置硬編碼到boot.img中,這樣就一定能找到core.img的位置,。

(2)core.img

core.img根據(jù)diskboot.img,、kernel.img和一系列的模塊被grub2-mkimage程序動態(tài)創(chuàng)建。core.img中嵌入了足夠多的功能模塊以保證grub能訪問/boot/grub,,并且可以加載相關的模塊實現(xiàn)相關的功能,,例如加載啟動菜單、加載目標操作系統(tǒng)的信息等,,由于grub2大量使用了動態(tài)功能模塊,,使得core.img體積變得足夠小。

core.img中包含了多個img文件的內容,,包括diskboot.img/kernel.img等,。

core.img的安裝位置隨MBR磁盤和GPT磁盤而不同,這在上文中已經(jīng)說明過了,。

(3)diskboot.img

如果啟動設備是硬盤,,即從硬盤啟動時,core.img中的第一個扇區(qū)的內容就是diskboot.img,。diskboo.img的作用是讀取core.img中剩余的部分到內存中,,并將控制權交給kernel.img,由于此時還不識別文件系統(tǒng),,所以將core.img的全部位置以block列表的方式編碼,,使得diskboot.img能夠找到剩余的內容,。

該img文件因為占用一個扇區(qū),所以體積為512字節(jié),。

(4)cdboot.img

如果啟動設備是光驅(cd-rom),即從光驅啟動時,,core.img中的第一個扇區(qū)的的內容就是cdboo.img,。它的作用和diskboot.img是一樣的。

(5)pexboot.img

如果是從網(wǎng)絡的PXE環(huán)境啟動,,core.img中的第一個扇區(qū)的內容就是pxeboot.img,。

(6)kernel.img

kernel.img文件包含了grub的基本運行時環(huán)境:設備框架、文件句柄,、環(huán)境變量,、救援模式下的命令行解析器等等。很少直接使用它,,因為它們已經(jīng)整個嵌入到了core.img中了,。注意,kernel.img是grub的kernel,,和操作系統(tǒng)的內核無關,。

如果細心的話,會發(fā)現(xiàn)kernel.img本身就占用28KB空間,,但嵌入到了core.img中后,,core.img文件才只有26KB大小。這是因為core.img中的kernel.img是被壓縮過的,。

(7)lnxboot.img

該img文件放在core.img的最前部位,,使得grub像是linux的內核一樣,這樣core.img就可以被LILO的'image='識別,。當然,,這是配合LILO來使用的,但現(xiàn)在誰還適用LILO呢,?

(8)*.mod

各種功能模塊,,部分模塊已經(jīng)嵌入到core.img中,或者會被grub自動加載,,但有時也需要使用insmod命令手動加載,。

1.2.2.2 傳統(tǒng)grub中的stage文件

grub2的設計方式和傳統(tǒng)grub大不相同,因此和stage之間的對比關系其實沒那么標準,,但是將它們拿來比較也有助于理解img和stage文件的作用,。

stage文件也分布在兩個地方:/usr/share/grub/RELEASE目錄下和/boot/grub目錄下,/boot/grub目錄下的stage文件是安裝grub時從/usr/share/grub/RELEASE目錄下拷貝過來的,。

(1)stage1

stage1文件在功能上等價于boot.img文件,。目的是跳轉到stage1_5或stage2的第一個扇區(qū)上,。

(2)*_stage1_5

*stage1_5文件包含了各種識別文件系統(tǒng)的代碼,使得grub可以從文件系統(tǒng)中讀取體積更大功能更復雜的stage2文件,。從這一方面考慮,,它類似于core.img中加載對應文件系統(tǒng)模塊的代碼部分,但是core.img的功能遠比stage1_5多,。

stage1_5一般安裝在MBR后,、第一個分區(qū)前的那段空閑空間中,也就是MBR gap空間,,它的作用是跳轉到stage2的第一個扇區(qū),。

其實傳統(tǒng)的grub在某些環(huán)境下是可以不用stage1_5文件就能正常運行的,但是grub2則不能缺少core.img,。

(3)stage2

stage2的作用是加載各種環(huán)境和加載內核,,在grub2中沒有完全與之相對應的img文件,但是core.img中包含了stage2的所有功能,。

當跳轉到stage2的第一個扇區(qū)后,,該扇區(qū)的代碼負責加載stage2剩余的內容。

注意,,stage2是存放在磁盤上的,,并沒有像core.img一樣嵌入到磁盤上。

(4)stage2_eltorito

功能上等價于grub2中的core.img中的cdboot.img部分,。一般在制作救援模式的grub時才會使用到cd-rom相關文件,。

(5)pxegrub

功能上等價于grub2中的core.img中的pxeboot.img部分。

1.2.3 安裝grub涉及的過程

安裝grub2的過程大體分兩步:一是根據(jù)/usr/lib/grub/i386-pc/目錄下的文件生成core.img,,并拷貝boot.img和core.img涉及的某些模塊文件到/boot/grub2/i386-pc/目錄下,;二是根據(jù)/boot/grub2/i386-pc目錄下的文件向磁盤上寫boot loader。

當然,,到底是先拷貝,,還是先寫boot loader,沒必要去搞清楚,,只要/boot/grub2/i386-pc下的img文件一定能通過grub2相關程序再次生成boot loader,。所以,既可以認為/boot/grub2/i386-pc目錄下的img文件是boot loader的特殊備份文件,,也可以認為是boot loader的源文件,。

不過,img文件和boot loader的內容是不一致的,,因為img文件還要通過grub2相關程序來轉換才是真正的boot loader,。

對于傳統(tǒng)的grub而言,拷貝的不是img文件,而是stage文件,。

以下是安裝傳統(tǒng)grub時,,grub做的工作。很不幸,,grub2上沒有該命令,,也沒有與之等價的命令。

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,0)/boot/grub/stage2 /boot/grub/menu.lst'... succeededDone.

首先檢測各stage文件是否存在于/boot/grub目錄下,,隨后嵌入stage1_5到磁盤上,,該文件系統(tǒng)類型的stage1_5占用了15個扇區(qū),最后安裝stage1,,并告知stage1 stage1_5的位置是第1到第15個扇區(qū),之所以先嵌入stage1_5再嵌入stage1就是為了讓stage1知道stage1_5的位置,,最后還告知了stage1 stage2和配置文件menu.lst的路徑,。

1.3 grub2配置文件

grub2的默認配置文件為/boot/grub2/grub.cfg,該配置文件的寫法彈性非常大,,但絕大多數(shù)需要修改該配置文件時,,都只需修改其中一小部分內容就可以達成目標。

grub2-mkconfig程序可用來生成符合絕大多數(shù)情況的grub.cfg文件,,默認它會自動嘗試探測有效的操作系統(tǒng)內核,,并生成對應的操作系統(tǒng)菜單項。使用方法非常簡單,,只需一個選項'-o'指定輸出文件即可,。

shell> grub2-mkconfig -o /boot/grub2/grub.cfg

1.3.1 通過/etc/default/grub文件生成grub.cfg

官方手冊原文:https://www./software/grub/manual/html_node/Simple-configuration.html#Simple-configuration

grub2-mkconfig是根據(jù)/etc/default/grub文件來創(chuàng)建配置文件的該文件中定義的是grub的全局宏,,修改內置的宏可以快速生成grub配置文件,。實際上在/etc/grub.d/目錄下還有一些grub配置腳本,這些shell腳本讀取一些腳本配置文件(如/etc/default/grub),,根據(jù)指定的邏輯生成grub配置文件,。若有興趣,不放讀一讀/etc/grub.d/10_linux文件,,它指導了創(chuàng)建grub.cfg的細節(jié),,例如如何生成啟動菜單。

[root@xuexi ~]# ls /etc/grub.d/00_header  00_tuned  01_users  10_linux  20_linux_xen  20_ppc_terminfo  30_os-prober  40_custom  41_custom  README

在/etc/default/grub中,,使用'key=vaule'的格式,,key全部為大小字母,如果vaule部分包含了空格或其他特殊字符,,則需要使用引號包圍,。

例如,下面是一個/etc/default/grub文件的示例:

[root@xuexi ~]# cat /etc/default/grubGRUB_TIMEOUT=5GRUB_DISTRIBUTOR='$(sed 's, release .*$,,g' /etc/system-release)'GRUB_DEFAULT=savedGRUB_DISABLE_SUBMENU=trueGRUB_TERMINAL_OUTPUT='console'GRUB_CMDLINE_LINUX='crashkernel=auto biosdevname=0 net.ifnames=0 rhgb quiet'GRUB_DISABLE_RECOVERY='true'

雖然可用的宏較多,,但可能用的上的就幾個:GRUB_DEFAULT,、GRUB_TIMEOUT,、GRUB_CMDLINE_LINUX和GRUB_CMDLINE_LINUX_DEFAULT。

以下列出了部分key,。

(1).GRUB_DEFAULT

默認的菜單項,,默認值為0。其值可為數(shù)值N,,表示從0開始計算的第N項是默認菜單,,也可以指定對應的title表示該項為默認的菜單項。使用數(shù)值比較好,,因為使用的title可能包含了容易改變的設備名,。例如有如下菜單項:

1
2
3
menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
    ...
}

如果想將此菜單設為默認菜單,則可設置'GRUB_DEFAULT=example-gnu-linux',。

如果GRUB_DEFAULT的值設置為'saved',,則表示默認的菜單項是'GRUB_SAVEDEFAULT'或'grub-set-default'所指定的菜單項。

(2).GRUB_SAVEDEFAULT

默認該key的值未設置,。如果該key的值設置為true時,,如果選定了某菜單項,則該菜單項將被認為是新的默認菜單項,。該key只有在設置了'GRUB_DEFAULT=saved'時才有效,。

不建議使用該key,因為GRUB_DEFAULT配合grub-set-default更方便,。

(3).GRUB_TIMEOUT

在開機選擇菜單項的超時時間,,超過該時間將使用默認的菜單項來引導對應的操作系統(tǒng)。默認值為5秒,。等待過程中,,按下任意按鍵都可以中斷等待。

設置為0時,,將不列出菜單直接使用默認的菜單項引導與之對應的操作系統(tǒng),,設置為'-1'時將永久等待選擇。

是否顯示菜單,,和'GRUB_TIMEOUT_STYLE'的設置有關,。

(4).GRUB_TIMEOUT_STYLE

如果該key未設置值或者設置的值為'menu',則列出啟動菜單項,,并等待'GRUB_TIMEOUT'指定的超時時間,。

如果設置為'countdown'和'hidden',則不顯示啟動菜單項,,而是直接等待'GRUB_TIMEOUT'指定的超時時間,,如果超時了則啟動默認菜單項并引導對應的操作系統(tǒng)。在等待過程中,按下'ESC'鍵可以列出啟動菜單,。設置為countdown和hidden的區(qū)別是countdown會顯示超時時間的剩余時間,,而hidden則完全隱藏超時時間。

(5).GRUB_DISTRIBUTOR

設置發(fā)行版的標識名稱,,一般該名稱用來作為菜單的一部分,,以便區(qū)分不同的操作系統(tǒng)。

(6).GRUB_CMDLINE_LINUX

添加到菜單中的內核啟動參數(shù),。例如:

GRUB_CMDLINE_LINUX='crashkernel=ro root=/dev/sda3 biosdevname=0 net.ifnames=0 rhgb quiet'

(7).GRUB_CMDLINE_LINUX_DEFAULT

除非'GRUB_DISABLE_RECOVERY'設置為'true',,否則該key指定的默認內核啟動參數(shù)將生成兩份,一份是用于默認啟動參數(shù),,一份用于恢復模式(recovery mode)的啟動參數(shù),。

該key生成的默認內核啟動參數(shù)將添加在'GRUB_CMDLINE_LINUX'所指定的啟動參數(shù)之后。

(8).GRUB_DISABLE_RECOVERY

該項設置為true時,,將不會生成恢復模式的菜單項,。

(9).GRUB_DISABLE_LINUX_UUID

默認情況下,grub2-mkconfig在生產菜單項的時候將使用uuid來標識Linux 內核的根文件系統(tǒng),,即'root=UUID=...'。

例如,,下面是/boot/grub2/grub.cfg中某菜單項的部分內容,。

menuentry 'CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8' {

        ......

        linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto biosdevname=0 net.ifnames=0 quiet LANG=en_US.UTF-8

        initrd16 /initramfs-3.10.0-327.el7.x86_64.img

}

雖然使用UUID的方式更可靠,但有時候不太方便,,所以可以設置該key為true來禁用,。

(10).GRUB_BACKGROUND

設置背景圖片,背景圖片必須是grub可讀的,,圖片文件名后綴必須是'.png',、'.tga'、'.jpg',、'.jpeg',,在需要的時候,grub會按比例縮小圖片的大小以適配屏幕大小,。

(11).GRUB_THEME

設置grub菜單的主題,。

(12).GRUB_GFXPAYLOAD_LINUX

設置為'text'時,將強制使用文本模式啟動Linux,。在某些情況下,,可能不支持圖形模式。

(13).GRUB_DISABLE_OS_PROBER

默認情況下,,grub2-mkconfig會嘗試使用os-prober程序(如果已經(jīng)安裝的話,,默認應該都裝了)探測其他可用的操作系統(tǒng)內核,并為其生成對應的啟動菜單項。設置為'true'將禁用自動探測功能,。

(14).GRUB_DISABLE_SUBMENU

默認情況下,,grub2-mkconfig如果發(fā)現(xiàn)有多個同版本的或低版本的內核時,將只為最高版本的內核生成頂級菜單,,其他所有的低版本內核菜單都放入子菜單中,,設置為'y'將全部生成為頂級菜單。

(15).GRUB_HIDDEN_TIMEOUT(已廢棄,,但為了向后兼容,,仍有效)

使用'GRUB_TIMEOUT_STYLE={countdown|hidden}'替代該項

(16).GRUB_HIDDEN_TIMEOUT_QUIET(已廢棄,但為了向后兼容,,仍有效)

配合GRUB_HIDDEN_TIMEOUT使用,,可以使用GRUB_TIMEOUT_STYLE=countdown來替代這兩項。

1.3.2 腳本方式直接編寫grub.cfg文件

官方手冊原文:https://www./software/grub/manual/html_node/Shell_002dlike-scripting.html#Shell_002dlike-scripting

  • 注釋符:從#開始的字符都被認為是注釋,,所以grub支持行中注釋
  • 連接操作符:{ } | & $ ; < >
  • 保留關鍵字和符號:! [[ ]] { } case do done elif else esac fi for function if in menuentry select then time until while,。并非所有的關鍵字都有用,只是為了日后的功能擴展而提前提供的,。
  • 引號和轉義符

對于特殊的字符需要轉義,。有三種方式轉義:使用反斜線、使用單引號,、使用雙引號,。

反斜線轉義方式和shell一樣。

單引號中的所有字符串都是字面意思,,沒有任何特殊意義,,即使單引號中的轉義符也被認為是純粹的字符。所以'\''是無法保留單引號的,。單引號需要使用雙引號來轉移,,所以應該寫'''。

雙引號和單引號作用一樣,,但它不能轉義某幾個特殊字符,,包括'$'和'\'。對于雙引號中的'$'符號,,它任何時候都保留本意,。對于'\',只有反斜線后的字符是'$',、''',、'\'時才表示轉義的意思,另外 ,,某行若以反斜線結尾,,則表示續(xù)行,,但官方不建議在grub.cfg中使用續(xù)行符。

  • 變量擴展

使用$符號引用變量,,也可以使用${var}的方式引用var變量,。

支持位置變量,例如$1引用的是第一個參數(shù),。

還支持特殊的變量,,如$?表示上一次命令的退出狀態(tài)碼。如果使用了位置變量,,則還支持$*,、$@和$#,$*代表的所有參數(shù)整體,,各參數(shù)之間是不可分割的,,$@也代表所有變量,但$@的各參數(shù)是可以被分割的,,$#表示參數(shù)的個數(shù),。

  • 簡單的命令

可以在grub.cfg中使用簡單的命令。各命令之間使用換行符或分號表示該命令結束,。

如果在命令前使用了'!',,則表示邏輯取反。

  • 循環(huán)結構:for name in word …; do list; done
  • 循環(huán)結構:while cond; do list; done
  • 循環(huán)結構:until cond; do list; done
  • 條件判斷結構:if list; then list; [elif list; then list;] … [else list;] fi
  • 函數(shù)結構:function name { command; … }
  • 菜單項命令:menuentry title [--class=class …] [--users=users] [--unrestricted] [--hotkey=key] [--id=id] { command; … }

這是grub.cfg中最重要的項,,官方原文:https://www./software/grub/manual/html_node/menuentry.html#menuentry

該命令定義了一個名為title的grub菜單項,。當開機時選中該菜單項時,grub會將chosen環(huán)境變量的值賦給'--id'(如果給定了'--id'的話),,執(zhí)行大括號中的命令列表,如果直到最后一個命令都全部執(zhí)行成功,,且成功加載了對應的內核后,,將執(zhí)行boot命令。隨后grub就將控制權交給了操作系統(tǒng)內核,。

--class:該選項用于將菜單分組,,從而使得grub可以通過主題樣式為不同組的菜單顯示不同的樣式風格。一個menuentry中,,可以使用多次class表示將該菜單分到多個組中去,。

--users:該選項限定只有此處列出的用戶才能訪問該菜單項,不指定該選項時將表示所有用戶都能訪問該菜單,。

--unrestricted:該選項表示所有用戶都有權訪問該菜單項,。

--hotkey:該選項為該菜單項關聯(lián)一個熱鍵,也就是快捷鍵,,關聯(lián)熱鍵后只要按下該鍵就會選中該菜單,。熱鍵只能是字母鍵,、backspace鍵、tab鍵或del鍵,。

--id:該選項為該菜單關聯(lián)一個唯一的數(shù)值,。id的值可以由ASCII字母、數(shù)字//下劃線組成,,且不得以數(shù)字開頭,。

所有其他的參數(shù)包括title都被當作位置參數(shù)傳遞給大括號中的命令,但title總是$1,,除title外的其余參數(shù),,位置值從前向后類推。

  • break [n]:強制退出for/while/until循環(huán)
  • continue [n]:跳到下一次迭代,,即進入下一次循環(huán)
  • return [n]:指定返回狀態(tài)碼
  • setparams [arg] …:從$1開始替換位置參數(shù)
  • shift [n]:踢掉前n個參數(shù),,使得第n+1個參數(shù)變?yōu)?1,但和shell中不一樣的是,,踢掉了前n個參數(shù)后,,從$#-n+1到$#這些參數(shù)的位置不變

具體如何編寫grub.cfg文件,繼續(xù)看下文的命令和變量,。

1.4 命令行和菜單項中的命令

官方手冊原文:https://www./software/grub/manual/html_node/Commands.html#Commands

grub2支持很多命令,,有些命令只能在交互式命令行下使用,有些命令可用在配置文件中,。在救援模式下,,只有insmod、ls,、set和unset命令可用,。

無需掌握所有的命令,掌握用的上的幾個命令即可,。

1.4.1 help命令

1
help [pattern]

顯示能匹配到pattern的所有命令的說明信息和usage信息,,如果不指定patttern,將顯示所有命令的簡短信息,。

例如'help cmos',。

1.4.2 boot命令

用于啟動已加載的操作系統(tǒng)。

只在交互式命令行下可用,。其實在menuentry命令的結尾就隱含了boot命令,。

1.4.3 set和unset命令

1
2
set [envvar=value]
unset envvar

前者設置環(huán)境變量envvar的值,如果不給定參數(shù),,則列出當前環(huán)境變量,。

后者釋放環(huán)境變量envvar。

1.4.4 lsmod命令和insmod命令

分別用于列出已加載的模塊和調用指定的模塊,。

注意,,若要導入支持ext文件系統(tǒng)的模塊時,,只需導入ext2.mod即可,實際上也沒有ext3和ext4對應的模塊,。

1.4.5 linux和linux16命令

1
2
linux file [kernel_args]
linux16 file [kernel_args]

都表示裝載指定的內核文件,,并傳遞內核啟動參數(shù)。linux16表示以傳統(tǒng)的16位啟動協(xié)議啟動內核,,linux表示以32位啟動協(xié)議啟動內核,,但linux命令比linux16有一些限制。但絕大多數(shù)時候,,它們是可以通用的,。

在linux或linux16命令之后,必須緊跟著使用init或init16命令裝載init ramdisk文件,。

一般為/boot分區(qū)下的vmlinuz-RELEASE_NUM文件,。

但在grub環(huán)境下,boot分區(qū)被當作root分區(qū),,即根分區(qū),,假如boot分區(qū)為第一塊磁盤的第一個分區(qū),則應該寫成:

linux (hd0,msdos1)/vmlinuz-XXX

或者相對路徑的:

set root='hd0,msdos1'

linux /vmlinuz-XXX

在grub階段可以傳遞內核的啟動參數(shù)(內核的參數(shù)包括3類:編譯內核時參數(shù),,啟動時參數(shù)和運行時參數(shù)),,可以傳遞的啟動參數(shù)非常非常多,完整的啟動參數(shù)列表見:http:///linux-kernel-boot-parameters,。這里只列出幾個常用的:

init=   :指定Linux啟動的第一個進程init的替代程序,。root=   :指定根文件系統(tǒng)所在分區(qū),在grub中,,該選項必須給定,。ro,rw   :啟動時,根分區(qū)以只讀還是可讀寫方式掛載,。不指定時默認為ro,。initrd  :指定init ramdisk的路徑。在grub中因為使用了initrd或initrd16命令,,所以不需要指定該啟動參數(shù)。rhgb    :以圖形界面方式啟動系統(tǒng),。quiet   :以文本方式啟動系統(tǒng),,且禁止輸出大多數(shù)的log message。net.ifnames=0:用于CentOS 7,,禁止網(wǎng)絡設備使用一致性命名方式,。biosdevname=0:用于CentOS 7,也是禁止網(wǎng)絡設備采用一致性命名方式,。             :只有net.ifnames和biosdevname同時設置為0時,,才能完全禁止一致性命名,,得到eth0-N的設備名。

例如:

linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=edb1bf15-9590-4195-aa11-6dac45c7f6f3 ro rhgb quiet LANG=en_US.UTF-8

另外,,root啟動參數(shù)有多種定義方式,,可以使用UUID的方式指定,也可以直接指定根文件系統(tǒng)所在分區(qū),,如'root=/dev/sda2',,

1.4.6 initrd和initrd16命令

1
initrd file

只能緊跟在linux或linux16命令之后使用,用于為即將啟動的內核傳遞init ramdisk路徑,。

同樣,,基于根分區(qū),可以使用絕對路徑,,也可以使用相對路徑,。路徑的表示方法和linux或linux16命令相同。例如:

linux16 /vmlinuz-0-rescue-d13bce5e247540a5b5886f2bf8aabb35 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto quiet

initrd16 /initramfs-0-rescue-d13bce5e247540a5b5886f2bf8aabb35.img

1.4.7 search命令

1
search [--file|--label|--fs-uuid] [--set [var]] [--no-floppy] [--hint args] name

通過文件[--file],、卷標[--label]、文件系統(tǒng)UUID[--fs-uuid]來搜索設備,。

如果使用了'--set'選項,,則會將第一個找到的設備設置為環(huán)境變量'var'的值,,默認的變量'var'為'root',。

搜索時可使用'--no-floppy'選項來禁止搜索軟盤,,因為軟盤速度非常慢,,已經(jīng)被淘汰了。

有時候還會指定'--hint=XXX',,表示優(yōu)先選擇滿足提示條件的設備,若指定了多個hint條件,,則優(yōu)先匹配第一個hint,,然后匹配第二個,,依次類推,。

例如:

if [ x$feature_platform_search_hint = xy ]; then

  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  367d6a77-033b-4037-bbcb-416705ead095

else

  search --no-floppy --fs-uuid --set=root 367d6a77-033b-4037-bbcb-416705ead095

fi

linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto quiet LANG=en_US.UTF-8

initrd16 /initramfs-3.10.0-327.el7.x86_64.img

上述if語句中的第一個search中搜索uuid為'367d6a77-033b-4037-bbcb-416705ead095'的設備,但使用了多個hint選項,,表示先匹配bios平臺下/boot分區(qū)為(hd0,msdos1)的設備,,之后還指定了幾個hint,,但因為search使用的是uuid搜索方式,,所以這些hint選項是多余的,,因為單磁盤上分區(qū)的uuid是唯一的,。

再舉個例子,,如果某啟動設備上有兩個boot分區(qū)(如多系統(tǒng)共存時),,分別是(hd0,msdos1)和(hd0,msdos5),,如果此時不使用uuid搜索,,而是使用label方式搜索:

search --no-floppy --fs-label=boot --set=root --hint=hd0,msdos5

則此時將會選中(hd0,msdos5)這個boot分區(qū),,若不使用hint,,將選中(hd0,msdos1)這個boot分區(qū),。

1.4.8 true和false命令

直接返回true或false布爾值,。

1.4.9 test expression和[ expression ]

計算'expression'的結果是否為真,為真時返回0,,否則返回非0,,主要用于if、while或until結構中,。

string1 == string2

string1與string2相同

string1 != string2

string1與string2不相同

string1 < string2

string1在字母順序上小于string2

string1 <= string2

string1在字母順序上小于等于string2

string1 > string2

string1在字母順序上大于string2

string1 >= string2

string1在字母順序上大于等于string2

integer1 -eq integer2

integer1等于integer2

integer1 -ge integer2

integer1大于或等于integer2

integer1 -gt integer2

integer1大于integer2

integer1 -le integer2

integer1小于或等于integer2

integer1 -lt integer2

integer1小于integer2

integer1 -ne integer2

integer1不等于integer2

prefixinteger1 -pgt prefixinteger2

剔除非數(shù)字字符串prefix部分之后,,integer1大于integer2

prefixinteger1 -plt prefixinteger2

剔除非數(shù)字字符串prefix部分之后,integer1小于integer2

file1 -nt file2

file1的修改時間比file2新

file1 -ot file2

file1的修改時間比file2舊

-d file

file存在且是目錄

-e file

file存在

-f file

file存在并且不是一個目錄

-s file

file存在并且文件占用空間大于零

-n string

string的長度大于零

string   

string的長度大于零,,等價于-n string

-z string

string的長度等于零

( expression )

將expression作為一個整體

! expression  

非(NOT)

expression1 -a expression2

與(AND),也可以使用expression1 expression2,,但不推薦

expression1 -o expression2

或(OR)

1.4.10 cat命令

讀取文件內容,借此可以幫助判斷哪個是boot分區(qū),,哪個是根分區(qū),。

交互式命令行下使用。

1.4.11 clear命令

清屏,。

1.4.12 configfile命令

立即裝載一個指定的文件作為grub的配置文件,。但注意,,導入的文件中的環(huán)境變量不在當前生效,。

在grub.cfg丟失時,,該命令將排上用場。

1.4.13 echo命令

1
echo [-n] [-e] string

'-n'和'-e'用法同shell中echo,。如果要引用變量,,使用${var}的方式。

1.4.14 export命令

導出環(huán)境變量,,若在configfile的file中導出環(huán)境變量,,將會在當前環(huán)境也生效。

1.4.15 halt和reboot命令

關機或重啟

1.4.16 ls命令

1
ls [args]

如果不給定任何參數(shù),,則列出grub可見的設備,。

如果給定的參數(shù)是一個分區(qū),則顯示該分區(qū)的文件系統(tǒng)信息,。

如果給定的參數(shù)是一個絕對路徑表示的目錄,,則顯示該目錄下的所有文件。

例如:

1.4.17 probe命令

1
probe [--set var] --partmap|--fs|--fs-uuid|--label device

探測分區(qū)或磁盤的屬性信息,。如果未指定--set,,則顯示指定設備對應的信息。如果指定了--set,,則將對應信息的值賦給變量var,。

--partmap:顯示是gpt還是mbr格式的磁盤。

--fs:顯示分區(qū)的文件系統(tǒng),。

--fs-uuid:顯示分區(qū)的uuid值,。

--label:顯示分區(qū)的label值,。

1.4.18 save_env和list_env命令

將環(huán)境變量保存到環(huán)境變量塊中,以及列出當前的環(huán)境變量塊中的變量,。

1.4.19 loopback命令

1
loopback [-d] device file

將file映射為回環(huán)設備,。使用-d選項則是刪除映射。

例如:

loopback loop0 /path/to/imagels (loop0)/

1.4.20 normal和normal_exit命令

進入和退出normal模式,,normal是相對于救援模式而言的,,只要不是在救援模式下,就是在normal模式下,。

救援模式下,,只能使用非常少的命令,而normal模式下則可以使用非常多的命令,。

1.4.21 password和password_pbkdf2命令

1
2
password user clear-password
password_pbkdf2 user hashed-password

前者使用明文密碼定義一個名為user的用戶。不建議使用此命令,。

后者使用哈希加密后的密碼定義一個名為user的用戶,,加密的密碼通過'grub-mkpasswd-pbkdf2'工具生成。建議使用該命令,。

1.5 幾個常設置的內置變量

1.5.1 chosen變量

當開機時選中某個菜單項啟動時,,該菜單的title將被賦值給chosen變量。該變量一般只用于引用,,而不用于修改,。

1.5.2 cmdpath變量

grub2加載的core.img的目錄路徑,是絕對路徑,,即包括了設備名的路徑,,如(hd0,gpt1)/boot/grub2/。該變量值不應該修改,。

1.5.3 default變量

指定默認的菜單項,,一般其后都會跟隨timeout變量。

default指定默認菜單時,,可使用菜單的title,,也可以使用菜單的id,或者數(shù)值順序,,當使用數(shù)值順序指定default時,,從0開始計算。

1.5.4 timeout變量

設置菜單等待超時時間,,設置為0時將直接啟動默認菜單項而不顯示菜單,,設置為'-1'時將永久等待手動選擇。

1.5.5 fallback變量

當默認菜單項啟動失敗,,則使用該變量指定的菜單項啟動,,指定方式同default,,可使用數(shù)值(從0開始計算)、title或id指定,。

1.5.6 grub_platform變量

指定該平臺是'pc'還是'efi',,pc表示的就是傳統(tǒng)的bios平臺。

該變量不應該被修改,,而應該被引用,,例如用于if判斷語句中。

1.5.7 prefix變量

在grub啟動的時候,,grub自動將/boot/grub2目錄的絕對路徑賦值給該變量,,使得以后可以直接從該變量所代表的目錄下加載各文件或模塊。

例如,,可能自動設置為:

set prefix = (hd0,gpt1)/boot/grub2/

所以可以使用'$prefix/grubN.cfg'來引用/boot/grub2/grubN.cfg文件,。

該變量不應該修改,且若手動設置,,則必須設置正確,,否則牽一發(fā)而動全身。

1.5.8 root變量

該變量指定根設備的名稱,,使得后續(xù)使用從'/'開始的相對路徑引用文件時將從該root變量指定的路徑開始,。一般該變量是grub啟動的時候由grub根據(jù)prefix變量設置而來的。

例如prefix=(hd0,gpt1)/boot/grub2,,則root=(hd0,gpt1),,后續(xù)就可以使用相對路徑/vmlinuz-XXX表示(hd0,gpt1)/vmlinuz-XXX文件。

注意:在Linux中,,從根'/'開始的路徑表示絕對路徑,,如/etc/fstab。但grub中,,從'/'開始的表示相對路徑,,其相對的基準是root變量設置的值,而使用'(dev_name)/'開始的路徑才表示絕對路徑,。

一般root變量都表示/boot所在的分區(qū),,但這不是絕對的,如果設置為根文件系統(tǒng)所在分區(qū),,如root=(hd0,gpt2),,則后續(xù)可以使用/etc/fstab來引用'(hd0,gpt2)/etc/fstab'文件。

該變量在grub2中一般不用修改,,但若修改則必須指定正確,。

另外,root變量還應該于linux或linux16命令所指定的內核啟動參數(shù)'root='區(qū)分開來,,內核啟動參數(shù)中的'root='的意義是固定的,,其指定的是根文件系統(tǒng)所在分區(qū),。例如:

set root='hd0,msdos1'

linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro crashkernel=auto quiet LANG=en_US.UTF-8

initrd16 /initramfs-3.10.0-327.el7.x86_64.img

一般情況下,/boot都會單獨分區(qū),,所以root變量指定的根設備和root啟動參數(shù)所指定的根分區(qū)不是同一個分區(qū),,除非/boot不是單獨的分區(qū),而是在根分區(qū)下的一個目錄,。

1.6 grub配置和安裝示例

首先寫一個grub.cfg,。例如此處,在msdos磁盤上安裝了兩個操作系統(tǒng),,CentOS 7和CentOS 6,。

# 設置一些全局環(huán)境變量set default=0set fallback=1set timeout=3# 將可能使用到的模塊一次性裝載完# 支持msdos的模塊insmod part_msdos# 支持各種文件系統(tǒng)的模塊insmod exfatinsmod ext2insmod xfsinsmod fatinsmod iso9660# 定義菜單menuentry 'CentOS 7' --unrestricted {        search --no-floppy --fs-uuid --set=root 367d6a77-033b-4037-bbcb-416705ead095        linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 ro biosdevname=0 net.ifnames=0 quiet        initrd16 /initramfs-3.10.0-327.el7.x86_64.img}menuentry 'CentOS 6' --unrestricted {        search --no-floppy --fs-uuid --set=root f5d8939c-4a04-4f47-a1bc-1b8cbabc4d32        linux16 /vmlinuz-2.6.32-504.el6.x86_64 root=UUID=edb1bf15-9590-4195-aa11-6dac45c7f6f3 ro quiet        initrd16 /initramfs-2.6.32-504.el6.x86_64.img}

然后執(zhí)行grub安裝操作。

shell> grub2-install /dev/sda

1.7 傳統(tǒng)grub簡述

因為本文主要介紹grub2,,所以傳統(tǒng)的grub只簡單介紹下,,其實前面已經(jīng)提及了很多傳統(tǒng)grub和grub2的比較了。另外,,傳統(tǒng)grub已足夠強大,,足夠應付一般的需求。

1.7.1 grub安裝

例如安裝到/dev/sda上,。

shell> grub-install /dev/sda

1.7.2 grub.conf配置

default=0 # 默認啟動第一個系統(tǒng)timeout=5 # 等待超時時間5秒splashimage=(hd0,0)/grub/splash.xpm.gz # 背景圖片hiddenmenu # 隱藏菜單,若要顯式,,在啟動時按下ESCtitle Red Hat Enterprise Linux AS (2.6.18-92.el5) # 定義操作系統(tǒng)的說明信息 root (hd0,0) kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/sda2 rhgb quiet initrd /initrd-2.6.18-92.el5.img

在說明配置方法之前,,需要說明一個關鍵點,boot是否是一個獨立的分區(qū),,它影響后面路徑的配置,。

在一個正常的操作系統(tǒng)中查看/boot/grub/grub.conf文件,可以在NOTICE段看到提示,,說你是否擁有一個獨立的boot分區(qū),?如果有則意味著kernel和initrd的路徑是從/開始的而不是/boot開始的,如/vmlinuz-xxx,,如果沒有獨立的boot分區(qū),,則kernel和initrd的路徑中需要指明boot路徑,例如Boot沒有分區(qū)而是在/文件系統(tǒng)下的一個目錄,,則/boot/vmlinuz-xxx,。

root (hd0,0)定義grub識別的根。一般定義的都是boot所在的分區(qū),,grub只能識別hd,,所以這里只能使用hd,hd0表示在第一塊磁盤上,,hd0,0的第二個0表示boot在第一個分區(qū)上,,grub2在分區(qū)的計算上是從1開始的,,這是傳統(tǒng)grub和grub2不同的地方,。

kernel定義內核文件的路徑和啟動參數(shù),等價于grub2的linux命令或linux16命令,。首先說明參數(shù),ro表示只讀,,root=/dev/sda[N]或者root=UUID='device_uuid_num'指定根文件系統(tǒng)所在的分區(qū),,這是必須的參數(shù)。rhgb表示在操作系統(tǒng)啟動過程中使用圖形界面輸出一些信息,,將其省略可以加快啟動速度,,quiet表示啟動操作系統(tǒng)時靜默輸出信息。再說明路徑,,如果是boot是獨立分區(qū)的,,則kernel的路徑定義方式為/vmlinuz-xxx,如果沒有獨立分區(qū),,則指明其絕對路徑,,一般都是在根文件系統(tǒng)下的目錄,所以一般為/boot/vmlinuz-xxx,。

initrd定義init ramdisk的路徑,,路徑的定義方式同kernel。除了路徑之外沒有任何參數(shù),。

或者使用下圖的UUID的方式,。

如果沒有指定root=的選項,將報錯“no or empty root …… dracut…kernel panic”的錯誤,。如下圖,。

本文原創(chuàng)地址在博客園:https://www.cnblogs.com/f-ck-need-u/archive/2017/06/29/7094693.html

如果覺得文章不錯,不妨給個打賞,,寫作不易,,各位的支持,能激發(fā)和鼓勵我更大的寫作熱情,。謝謝,!

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多