歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu下Grub配置詳解

Ubuntu下Grub配置詳解

日期:2017/2/28 13:48:20   编辑:Linux教程

1 Grub簡介


1.1 GNU GRUB


GNU GRUB(簡稱“GRUB”)是一個來自GNU項目的啟動引導程序. GRUB是多啟動規范的實現,它允許用戶可以在計算機內同時擁有多個操作系統,並在計算機啟動時選擇希望運行的操作系統。GRUB可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啟動參數.

GNU GRUB的前身為Grand Unified Bootloader。它主要用於類Unix系統;同大多Linux發行版一樣,GNU系統也采用GNU GRUB作為它的啟動器。Solaris從10 1/06版開始在x86系統上也采用GNU GRUB作為啟動器。

1.2 grub Legacy和grub 2


注意:目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本號是 0.9x 以及之前的版本都稱為 GRUB Legacy ,從 1.x 開始的就稱為 GRUB 2

  • 目前 GRUB Legacy 已經停止開發了,只是出於一個修復漏洞的狀態,不再增加新的功能了,所有的開發都轉移到 GURB 2 之上了

  • GRUB 2 是源自於一個名為 PUPA 的項目,目的是建立下一代的 boot loader

GRUB 2 幾乎是從零開始開始開發的,它和 GRUB Legacy 不同的地方有很多,例如支持 scripts、國際化語言、動態加載模塊、帶有 resuce 模式等等,這些都是 GRUB Legacy 所沒有的

雖然grub2是重寫的grub,但是他借鑒了grub的一些特征,grub2改進如下:

  1. 引導配置文件采用新名字grub.cfg,新的語法,加入許多新的命令

  2. grub.cfg 是用grub-mkconfig自動產生的,由update-grub維護,在執行update-grub之前修改的配置都不會 生效,這樣可以很容易的應對內核升級這樣情況。

  3. grub2中的分區號不再是以0開始,而是以1開始。

  4. 配置文件是不可寫的,而是修改文件後用命令自動更新

  5. grub2有更可靠的方法在磁盤上有多系統時發現文件和目標內核,可以用命令發現系統設備號或者UUID。

  6. 更多的文件系統支持,如ext4 hfs ntfs

  7. grub2可以直接從lvm和raid讀取文件

  8. 在grub中的stage1 stage1.5 stage2已經被取消

  9. grub2引入很多設備模塊,允許core鏡像更小

  10. 支持腳本,包括簡單的語法

  11. 在啟動時沒有選擇菜單的話,按住shift即可強制顯示菜單

可以使用grub-install -v來查看系統的grub版本

1.3 GRUB2與GRUB的區別


  1. GRUB2引導菜單啟動項是從/boot自動生成的,不是有menu.lst配置的

  2. 執行grub-update之後會自動更新啟動項列表,自動添加有效的操作系統項目

  3. 分區編號發生變化:第一個分區現在是1而不是0,但第一個設備仍然以0開始計數,如hd0

  4. 配置文件的不同更為明顯:

配置文件 /boot/grub/menu.lst - 已經被/boot/grub/grub.cfg代替 /boot/grub.cfg - 即使是root也不要編輯它,它在每次update-grub後自動生成 /etc/default/grub - 改變引導菜單外觀的主要配置文件 /etc/grub.d/ - 各種用於生成grub.cfg的腳本文件,每次update-grub時會執行裡面的文件

2 選項與文檔


2.1 啟動選項


如果您安裝了Ubuntu/linux操作系統和Windows 7/8/10系統組成雙系統.那麼您的Grub啟動選項應該為如下

Ubuntu GNU/Linux  Ubuntu操作系統的啟動項
Advabced options for Ubuntu GNU/Linux 高級選項,進入此處可以選擇啟動的內核版本.
memtest86 #內存測試,可以進入此模式運行行一些很耗系統資源的程序,測試系統在高負載的情況下主機是否運行穩定
Windows 7 (loader) (on /dev/sd**) ## /dev/sd**對應你Windows系統所在的分區

2.2 相關文檔


grub官方文檔

中文版 info grub

GRUB2配置文件”grub.cfg”詳解(GRUB2實戰手冊)–金步國作品

3 grub組件


grub2的組件為grub-pc, 同時grub-common也會默認被安裝,grub2是過渡期的虛擬組件,會被安全移除。

3.1 grub工具命令


工具包功能 grub-install 一個完整的grub配置腳本 update-grub update-grub主要是在每次配置文件有更新後生成新的grub.cfg, 其實update-grub是調用grub-mkconfig,在系統中還有一個update-grub2,發現他是調用update-grub grub-mkconfig 調用grub-mkdevicemap和grub-probe生成grub.cfg grub-set-default 設置在下次進入系統時從哪個內核選項進去 grub-mkdevicemap 為grub自動產生新的device.map,grub-mkdevicemap程序可以創建device.map文件,在執行grub-install時會自動執行他以創建映像關系,如果文件不存在,則會讀取/boot/grub/devicd.map這個文件,如果映像文件存在,則grub讀取他創建BIOS drives to OS drives grub-setup 被grub_install調用,安裝grub grub-probe 從給定的設備上探測設備信息

其中grub-install完成如下工作

  1. 安裝grub到設備中,如果需要會創建/boot/grub目錄

  2. 他會把.mod、.lst、*.img從 /usr/lib/grub/i386-pc/ 目錄復制到/boot/grub目錄下,他會覆蓋已有文件

  3. 然後會調用grub_probe掃描計算機並收集磁盤和分區信息

  4. 接著調用grub_mkimage構建一個新的new.img

  5. 最後調用grub_setup把grub的boot.img寫入MBR中,把core.img寫進設備的第一個扇區。

注意

grub_install並不運行grub_mkconfig

示例

grub-install -v

顯示版本號

grub-install /dev/sda

這表示你希望把grub安裝進/dev/sda(把boot.img寫進第一塊硬盤的MBR),如果由於某些原因你想把grub安裝到單獨的boot分區,可以使用/dev/sdaX,grub2不建議這樣,因為他會減小grub的可靠性,或者其他用戶用grub-install把grub裝進了錯誤的分區導致操作系統的危險性。

grub-install –root-directory=/media/grub2 /dev/sda

創建一個大約60M的分區,用文件系統格式化分區,把他掛載到/media/grub2,/dev/sda是指把stage1寫入MBR

mke2fs /dev/fd0
mount -t ext2 /dev/fd0 /mnt
mkdir /mnt/boot
grub-install --boot-directory=/mnt/boot /dev/fd0
umount /dev/fd0

創建一個軟驅啟動盤

注意

grub-install只是一個腳本,內部真正執行工作的是grub-mkimage和grub-setup,因此你也可以直接用著兩個命令安裝grub,建議還是用grub-install,除非你非常熟悉grub內部

grub2有兩中不同的引導方法,一個是直接加載操作系統,一個是連鎖(chain-load)到另一個boot load,然後再從另一個boot load加載系統,一般來說第一個更常用,但是假如grub不支持所有的操作系統就需要這種方法

3.2 Grub鏡像


grub2的鏡像文件包括

鏡像描述 boot.img 在PC BIOS系統中,boot.img在grub啟動的第一部分,他被寫入MBR或者boot分區,因為PC的boot扇區只有512bytes,所以此文件精確到只有512bytes,他唯一的功能是從本地磁盤讀取內核鏡像第一個扇區位置然後跳到內核鏡像,因為文件大小的限制,boot.img不能識別任何文件系統,所以當安裝grub時,grub-setup把內核鏡像第一個扇區的位置硬編碼進boot.img中 diskboot.img 當從硬盤引導時此鏡像作為內核鏡像的第一個扇區的內容,他把剩余的內核鏡像讀入內存中然後啟動內核 cdboot.img 原理同上 pxeboot.img 當從網絡用PXE引導時用次鏡像啟動內核鏡像 kernel.img 此鏡像包含grub運行時包含的基本工具,框架驅動、文件句柄、環境變量、安全模式命令行解析器等,他可以直接使用,但是編譯進所有的內核鏡像中了 core.img 這是grub的內核鏡像,他被grub-mkimage程序從kernel.img和一些模塊動態編譯而成,一般情況下他已經包含足夠的模塊去訪問/boot/grub,模塊機制可以使得內核鏡像保持很小 *.mod 其余的一切是可以動態加載的一些模塊,當需要他們時,他們是被自動加載編譯進內核鏡像的,但也可以使用insmod手動加載

grub legacy的鏡像文件

鏡像描述 stage1 他非常像grub2中的boot.img,他們有一樣的功能 *_stage1_5 在grub legacy中,stage1_5的作用是包含足夠的系統代碼從而可以使更大的stage2從普通系統上讀入,他有點像grub2中的core.img但是core.img比他功能強多了,grub legacy可以只使用stage1和stage2在一些受限制的情況下工作,但是grub2沒有core.img就不能工作 stage2 grub2沒有stage2鏡像,代替的是他運行時從/boot/grub加載模塊

4 配置Grub


在早期的Ubuntu版本中,使用grub1作為默認的啟動引導程序,如果想要修改系統啟動菜單,直接編輯/boot/grub/menu.lst即可。

從9.10開始, Ubuntu使用grub2作為默認啟動引導程序, 相對於grub的第一個版本,grub2改動很大。 grub2的新特性主要有:支持圖形化界面,支持主題,模塊化加載,跨平台兼容等,總而言之,功能的加強也使得grub2的配置變得更加復雜了

4.1 grub配置文件組成


grub2包含一個完全修改過的配置文件及目錄,menu.list不再使用

grub2采用模塊化的設計,主要配置文件是/boot/grub/grub.cfg,但是這個文件的權限是444,連root也不讓修改,這是刻意為之的,不要修改文件權限,grub.cfg的內容更新由update-grub命令來更新,其實就是執行grub-mkconfig -o /boot/grub/grub.cfg來更新,此文件會在更新內核自動更新, 在/boot/grub目錄下有很多模塊文件,以在按需時自動加載模塊每段模塊配置的加載以### BEGIN xxx ###開始,以### END xxx ###結尾。

grub2主要有三部分組成:

配置文件描述 /etc/default/grub grub的默認配置文件,可以修改一些常見的參數 /etc/grub.d 這個文件夾下面是一些生成grub.cfg文件的可執行腳本,可以修改 /boot/grub/grub.cfg 系統引導時讀取的文件之一,由其他文件生成的,一般不在這裡修改

4.2 /etc/default/grub


此文件包含menu.list的前半部分內容,以及每行內核配置後面追加的配置, 在更新時會合並到grub.cfg中

/etc/default/grub控制grub-mkconfig的操作,grub裡面是以鍵值對存在的選項,如果值有空格或者其他字符需要用引號引起來,參數如下

參數描述 GRUB_DEFAULT 默認的菜單選擇項,值可以是數字,默認從0開始,值也可以是title後面的字符串,當值是‘saved’時有特殊含義:默認的菜單選則項會被保存在GRUB_SAVEDEFAULT中,下次啟動時會從這個值啟動。當值為saved是可以用grub-set-default和grub-reboot來設置默認啟動項,grub-set-default直到下次修改前都有效,grub-reboot下次啟動時生效 GRUB_SAVEDEFAULT 只有這個值是true,GRUB_DEFAULT是saved時才會起作用 GRUB_TIMEOUT 選擇菜單的顯示時間,默認是5,值是0表示不顯示菜單選項,值是-1表示無限期的等待做出選擇 GRUB_HIDDEN_TIMEOUT grub2第一次執行時會尋找其他操作系統,如果沒有檢測到則會將菜單隱藏,如果有其他操作系統才會顯示菜單,如果參數大於0,則會等待響應的秒數,但是不會顯示菜單,可以按住shift顯示菜單 GRUB_DISTRIBUTOR 菜單中的描述名稱,采用命令lsb_release判斷,應該是紅帽系列的,如果不是就歸為Debian GRUB_CMDLINE_LINUX 此行將追加到所有的linux 定義內核行的後面,不論是救援模式還是一般模式 GRUB_CMDLINE_LINUX_DEFAULT 次選項只會追加在一般模式後面,同上 GRUB_TERMINAL=console 啟用console,默認注釋狀態 GRUB_DISABLE_LINUX_UUID=true 在grub中指定root時可以使用UUID,默認注釋 GRUB_GFXMODE=640x480 圖形化菜單的分辨率,默認注釋 GRUB_DISABLE_LINUX_RECOVERY=true 禁止顯示救援模式

定制自己的/etc/default/grub配置文件, 如下所示

# If you change this file, run 'update-grub' afterwards to update


GRUB_DEFAULT=0
#設置默認啟動項,按menuentry順序如果要默認從第四個菜單項啟動,數字改為3,若改為 saved,則默認為上次啟動項



GRUB_TIMEOUT="10"
#設置進入默認啟動項的等候時間,默認值10秒,按自己需要修改,單位為秒改改為零和負值為無限等待操作

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` #獲得發行版名稱(比如Ubuntu, Debian

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
#選擇啟動的環境,“quiet splash”為圖像界面,“text”為文本界面

#GRUB_CMDLINE_LINUX="noresume" 
#手動添加內核啟動參數,比如 acpi=off noapic 等可在這裡添加
# 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將傳遞參數 "root=UUID=xxx" 傳遞給 Linux內核

# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"
#定是否創建修復模式菜單項,前面有#注釋(建立修復模式).前面沒有#注釋(不建立修復模式

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1" #當GRUB菜單出現時發出鳴音提醒,戶無法看到屏幕特別有用,默認關閉

4.3 /etc/grub.d/目錄


update-grub命令執行時會讀取此目錄下的文件,並將配置合並至grub.cfg中,grub.cfg中的菜單順序是由此目錄中的文件順序決定的,文件開頭數字較小的會先執行,全英文名字的文件將會在最後執行,自定義選項在40_custom中定義,或者建立一個新文件,此目錄下的文件必須有執行權限才會被update-grub讀取,並把配置合並到grub.cfg中。

配置文件描述 00_header 配置初始的顯示項目,如默認選項,時間限制等,一般由/etc/default/grub導入,一般不需要配置 05_debian_theme 配置引導畫面,文字顏色等主題 10_linux 定位當前操作系統使用中的root設備內核的位置 30_os-prober 用來搜索linux和其他系統,此腳本中的變量用來指定在/boot/grub/grub.cfg 和 grub2菜單中的名稱顯示方式,可以修改/etc/default/grub光比這個腳本 40_custom 用來加入用戶自定義的菜單樣板,將會在執行update-grub時更新至grub.cfg中 41_custom 判斷custom.cfg此配置文件是否存在,如果存在就加載它

4.4 /boot/grub/grub.cfg


主要配置文件是/boot/grub/grub.cfg

但是這個文件的權限是444,連root也不讓修改,這是刻意為之的,不要修改文件權限

grub.cfg的內容更新由update-grub命令來更新, 我們從下圖中看到系統中/boot中安裝了4.2.0-42版本的內核, 而我們update-grub就會發現他們

grub.cfg的內容更新由update-grub命令來更新, 其實就是執行如下操作

  1. 備份/boot/grub/menu.lst文件到/boot/grub/menu.lst~, 以防止出錯後無法恢復

  2. 讀取系統中安裝的所有內核(一般在/boot目錄下), 然後生成.lst文件

  3. 生成grub.cfg, 其實就是執行grub-mkconfig -o /boot/grub/grub.cfg來更新

    • 首先讀取/etc/default/grub設置基本的設置信息
    • /boot/grub.d目錄下有很多模塊文件,以在按需時自動加載模塊. 依照/etc/grub.d中的各段生成grub.cfg的基本信息, 每段模塊配置的加載以### BEGIN xxx ###開始,以### END xxx ###結尾
    • 讀取menu.lst設置加載的內核的信息

在更新內核時會調用update-grub自動更新grub.cfg文件

5 常見問題


5.1 修改等待時間


sudo gedit /etc/default/grub

修改文件中的:GRUB_TIMEOUT=10 (默認是為10秒的)

修改為:GRUB_TIMEOUT=X (X表示你要設置的秒數,設置為負數為一直等待操作) 修改後保存。終端輸入:

5.2 生成grub.cfg


一般來說, update-grub會更新grub並生成grub.cfg

sudo update-grub

當然也可以

sudo grub-mkconfig -o /boot/grub/grub.cfg

5.3 修改默認啟動系統


sudo gedit /etc/default/grub

修改文件中的GRUB_DEFAULT=0

GRUB_DEFAULT=0 (0默認啟動第1項,如果你的win是第5項,把這個0改為4) 保存文件後終端輸入:

5.4 修改默認分辨率


sudo gedit /etc/default/grub

修改文件中的 #GRUB_GFXMODE=640x480
把前面#去掉,把分辨率改為800x600或1024x768(或者修改為你屏幕的分辨率,但前提是分辨率為常見分辨率

補充:深度操作系統2014下還需要同時修改 /var/cache/deepin/grub2.json 文件中的分辨率值,如 “Resolution”:”1024x768”

5.5 修復損壞的grub引導


方法一

建議事先備份sda 的grub:

dd if=/dev/sda of=./mbr.bak bs=512 count=1 

這樣子是把你現有的分區跟引導信息保存下來了。找個linux的live進入linux,然後把剛才的mbr.bak還原回去。

dd if=./mbr.bak of=/dev/sda  bs=446 count=1

方法二
重裝Grub

5.6 GRUB2降級到Grub legacy


備份主要的 Grub2 目錄及文件。

sudo cp /etc/default/grub /etc/default/grub.old
sudo cp -R /etc/grub.d /etc/grub.d.old
sudo cp -R /boot/grub /boot/grub.old

移除 Grub2

sudo apt-get purge grub2 grub-pc

此時,系統在另一啟動裝載程序前將無法啟動。 當這些軟件包被移除後,許多文件還會殘留在“/boot/grub”目錄下。
安裝 Grub Legacy

sudo apt-get install grub

Grub 安裝後,用戶仍需通過運行以下命令來創建 menu.lst 和 stage1/stage2 文件:

sudo update-grub

這一步可以生成 menu.lst 文件。

sudo grub-install /dev/sdX

選擇正確的設備(sda、sdb、sdc),通常為你的深度操作系統所在的磁盤。在 /boot/grub 目錄下創建 stage1 和 stage2 文件並寫入 MBR。運行這一命令來阻止其自動升級:

echo "grub hold" | sudo dpkg --set-selections

更多Ubuntu相關信息見Ubuntu 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=2

Copyright © Linux教程網 All Rights Reserved