GRUB (簡體中文)

前言

  • 引導程序是計算機啓動時第一個運行的程序。它負責加載並將控制權轉移到Linux內核。內核做爲回報,將初始化操做系統剩餘部分
  • 官方所稱的GRUB表明的是本軟件的第二版,即GRUB2,請參考[2].若是你是在找有關Grub Legacy的文章,請參考GRUB Legacy .
  • GRUB2支持由zlib或者LZO壓縮過的Btrfs格式的根目錄,若是使用Btrfs,不須要單獨的/boot分區.
  • GRUB2 不支持F2FS格式的根目錄,因此你須要爲/boot分區單獨設置一個支持的文件系統.

BIOS 系統

GUID分區表(GPT)具體說明

BIOS/GPT配置中,一個 BIOS啓動分區是必需的。GRUB將core.img嵌入到這個分區。php

Note:
  • 在嘗試分區以前請記住不是全部的系統都可以支持這種分區方案, 關於更多請閱讀GUID分區表.
  • This additional partition is only needed on a GRUB, BIOS/GPT partitioning scheme. Previously, for a GRUB, BIOS/MBR partitioning scheme, GRUB used the Post-MBR gap for the embedding the core.img). GRUB for GPT, however, does not use the Post-GPT gap to conform to GPT specifications that require 1_megabyte/2048_sector disk boundaries.
  • For UEFI systems this extra partition is not required as no embedding of boot sectors takes place in that case.

Create a mebibyte partition (+1M with fdisk or gdisk) on the disk with no file system and type BIOS boot (BIOS boot in fdisk, ef02 in gdisk, bios_grub in parted). This partition can be in any position order but has to be on the first 2 TiB of the disk. This partition needs to be created before GRUB installation. When the partition is ready, install the bootloader as per the instructions below. The post-GPT gap can also be used as the BIOS boot partition though it will be out of GPT alignment specification. Since the partition will not be regularly accessed performance issues can be disregarded (though some disk utilities will display a warning about it). In fdisk or gdisk create a new partition starting at sector 34 and spanning to 2047 and set the type. To have the viewable partitions begin at the base consider adding this partition last.html

主引導記錄(MBR)具體說明

通常來講,若是使用兼容DOS的分區對齊模式,MBR後面空間(post-MBR gap)的大小都是31KiB(MBR和第一個分區之間的空間).不過,爲了提供足夠的空間嵌入GRUB的core.img文件(FS#24103),建議將這個空間設置到1到2Mib.最好使用支持1MiB分區對齊的分區軟件來分區,由於這樣也能知足非512B扇區磁盤分區的需求.node

安裝

可使用pacman官方倉庫安裝grub包.安裝完成後它會代替grub-legacyAUR.linux

Note: 簡單的安裝Grub包並不會更新 /boot/grub/i386-pc/core.img/boot/grub/i386-pc裏的GRUB模組.須要使用下面介紹的 grub-install來手動更新它們.

安裝Boot文件

有三種方式安裝GRUB Boot文件:ios

安裝到磁盤上
Note: 這種方法只限於將GRUB安裝到可分區磁盤(MBR或GPT),GRUB 文件會被安裝到 /boot/grub,1st stage code會被安裝到MBR的啓動代碼區域(以便和MBR分區表分開).對於無分區磁盤,請參考 #安裝到分區上或者無分區磁盤上

如下命令會將grub安裝到MBR的啓動代碼區域,填充/boot/grub文件夾,生成/boot/grub/i386-pc/core.img,將其嵌入post-MBR gap或者放入BIOS boot partition中(分別對應MBR分區表和GPT分區表):git

# grub-install --target=i386-pc --recheck --debug /dev/sda
Note:
  • /dev/sda 只是示例.
  • --target=i386-pc指示grub-install是爲使用BIOS的系統安裝. 推薦一直標明這點以防混淆.

若是你使用LVM來進行啓動,你能夠將GRUB安裝在多個物理磁盤上. 執行grub-install並不會生成GRUB配置文件,請移至#生成GRUB配置文件一節redis

安裝到U盤

假設你的U盤第一個分區是FAT32,其分區是/dev/sdy1shell

# mkdir -p /mnt/usb ; mount /dev/sdy1 /mnt/usb
# grub-install --target=i386-pc --recheck --debug --boot-directory=/mnt/usb/boot /dev/sdy
# grub-mkconfig -o /mnt/usb/boot/grub/grub.cfg
# optional, backup config files of grub.cfg
# mkdir -p /mnt/usb/etc/default
# cp /etc/default/grub /mnt/usb/etc/default
# cp -a /etc/grub.d /mnt/usb/etc
#  sync ; umount /mnt/usb
安裝到分區上或者無分區磁盤上
Note: GRUB並不推薦將其安裝到分區啓動扇區或者無分區磁盤上(Grub Legacy和syslinux相反).這種安裝方式不安全,當升級時可能會損壞.Arch開發人員也不支持這種方式

下面的命令將會將GRUB2安裝到分區扇區或者無分區磁盤上(好比閃存上):ubuntu

# chattr -i /boot/grub/i386-pc/core.img
# grub-install --target=i386-pc --recheck --debug --force /dev/sdaX
# chattr +i /boot/grub/i386-pc/core.img
Note:
  • /dev/sda 只是示例.
  • --target=i386-pc指示grub-install是爲使用BIOS的系統安裝. 推薦一直標明這點以防混淆.


必須使用--force選項來啓用對blocklists(塊列表)的支持,不該使用--grub-setup=/bin/true(這個選項的效果相似於只生成core.img). grub-install會生成如下警告,你能夠經過這些警告判斷髮生了什麼問題:windows

/sbin/grub-setup: warn: Attempting to install GRUB to a partitionless disk or to a partition. This is a BAD idea.
/sbin/grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. 
                        However, blocklists are UNRELIABLE and their use is discouraged.

若是不指定--force選項,會出現如下錯誤,而且不會將啓動代碼安裝到啓動扇區上:

/sbin/grub-setup: error: will not proceed with blocklists

而指定了--force,會出現:

Installation finished. No error reported.

grub-setup不默認容許這種狀況的緣由是,在分區或者無分區磁盤上,grub依賴於嵌入分區引導扇區的塊列表(blocklists)來定位/boot/grub/i386-pc/core.img/boot/grub.而core.img在分區上的扇區位置頗有可能隨着分區文件系統的更改而變化(複製文件,刪除文件等).詳情請參考https://bugzilla.redhat.com/show_bug.cgi?id=728742 和 https://bugzilla.redhat.com/show_bug.cgi?id=730915.

臨時解決方案是給/boot/grub/i386-pc/core.img文件加"不可變"(immutable)標誌.只有當將grub安裝到分區啓動扇區或者無分區磁盤上時才須要給core.img加"不可變"標誌. 執行grub-install並不會生成GRUB配置文件,請移至#生成GRUB配置文件一節

只生成core.img

經過添加--grub-setup=/bin/true選項,grub-install命令會填充/boot/grub文件夾並生成/boot/grub/i386-pc/core.img,可是不會將grub啓動引導代碼嵌入到MBR,post-MBR gap和分區引導扇區中:

# grub-install --target=i386-pc --grub-setup=/bin/true --recheck --debug /dev/sda
Note:
  • /dev/sda 只是示例.
  • --target=i386-pc指示grub-install是爲使用BIOS的系統安裝. 推薦一直標明這點以防混淆.

生成後,Grub Legacy或者syslinux就能夠經過鏈式加載GRUB2的core.img來間接加載Linux內核或者多啓動內核了.

生成GRUB配置文件

最後,生成GRUB2所需的配置文件(在配置章節會詳述):

# grub-mkconfig -o /boot/grub/grub.cfg
Note: 文件路徑是 /boot/grub/grub.cfg, 而不是 /boot/grub/i386-pc/grub.cfg.

若是GRUB在啓動時報錯"no suitable mode found",請參考#"No suitable mode found" error.

若是grub-mkconfig執行失敗,能夠經過以下方式將/boot/grub/menu.lst文件轉化爲/boot/grub/grub.cfg

Note: 這種方法只適合BIOS,不適合UEFI
# grub-menulst2cfg /boot/grub/menu.lst /boot/grub/grub.cfg

示例以下:

/boot/grub/menu.lst
default=0
timeout=5

title  Arch Linux Stock Kernel
root   (hd0,0)
kernel /vmlinuz-linux root=/dev/sda2 ro
initrd /initramfs-linux.img

title  Arch Linux Stock Kernel Fallback
root   (hd0,0)
kernel /vmlinuz-linux root=/dev/sda2 ro
initrd /initramfs-linux-fallback.img
/boot/grub/grub.cfg
set default='0'; if [ x"$default" = xsaved ]; then load_env; set default="$saved_entry"; fi
set timeout=5

menuentry 'Arch Linux Stock Kernel' {
  set root='(hd0,1)'; set legacy_hdbias='0'
  legacy_kernel   '/vmlinuz-linux' '/vmlinuz-linux' 'root=/dev/sda2' 'ro'
  legacy_initrd '/initramfs-linux.img' '/initramfs-linux.img'
  
}

menuentry 'Arch Linux Stock Kernel Fallback' {
  set root='(hd0,1)'; set legacy_hdbias='0'
  legacy_kernel   '/vmlinuz-linux' '/vmlinuz-linux' 'root=/dev/sda2' 'ro'
  legacy_initrd '/initramfs-linux-fallback.img' '/initramfs-linux-fallback.img'
}

若是你忘記建立GRUB配置文件/boot/grub/grub.cfg,而後直接重啓到了GRUB命令行界面,輸入如下命令:

sh:grub> insmod legacycfg
sh:grub> legacy_configfile ${prefix}/menu.lst

選擇啓動到Arch下而後再從新建立合適的GRUB配置文件/boot/grub/grub.cfg

多系統啓動

爲了實現多系統啓動,須要安裝os-prober.安裝後,再執行grub-mkconfig -o /boot/grub/grub.cfg.若是執行失敗,可能就須要手動添加啓動條目了.(後面有指導)

Note: 若是找不到Windows,能夠將其boot partition掛載後再試
在BIOS-MBR模式下安裝的Microsoft Windows
Note: GRUB支持直接從 bootmgr啓動,如今再也不須要鏈式加載分區啓動扇區了
Warning:  bootmgr位於 系統分區( system partition),而不是Windows系統所在的分區(好比C盤).在uuid-卷名列表中,系統分區是那個名爲 LABEL="SYSTEM RESERVED" 或  LABEL="SYSTEM"的項,並且這個分區通常只有100到200MB大(和Arch的啓動分區差很少).請參考 Wikipedia:System partition and boot partition

本節假設你的Windows分區是/dev/sda1.首先,找到Windows系統分區的UUID(Windows's SYSTEM PARTITION,bootmgr存放其上).若是Windows bootmgr的位置是/media/SYSTEM_RESERVED/bootmgr,對於 Windows Vista/7/8,執行:

# grub-probe --target=fs_uuid /media/SYSTEM_RESERVED/bootmgr
69B235F6749E84CE
# grub-probe --target=hints_string /media/SYSTEM_RESERVED/bootmgr
--hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1
Note: 對於Windows XP, 請在上面的命令中用 NTLDR替代 bootmgr. 注意,可能 NTLDR不是在名爲"SYSTEM_RESERVED"的分區上,請在XP系統所在的分區上尋找  NTLDR

接着,將下面的代碼添加到/etc/grub.d/40_custom 或者/boot/grub/custom.cfg中.而後,使用grub-mkconfig從新生成grub.cfg,這樣就能在BIOS-MBR配置下使用GRUB2引導啓動Windows系統了:

對於 Windows Vista/7/8

if [ "${grub_platform}" == "pc" ]; then
  menuentry "Microsoft Windows Vista/7/8 BIOS-MBR" {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod ntldr     
    search --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 69B235F6749E84CE
    ntldr /bootmgr
  }
fi

對於Windows XP

if [ "${grub_platform}" == "pc" ]; then
  menuentry "Microsoft Windows XP" {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod ntldr     
    search --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 69B235F6749E84CE
    ntldr /bootmgr
  }
fi

 

Note: 在某些狀況下,可能在安裝Windows 8以前就已經安裝了GRUB.啓動Windows時可能會 \boot\bcd報錯(錯誤代碼爲 0xc000000f).能夠經過Wondows Recovery Console來修復這個錯誤:
x:\> "bootrec.exe /fixboot" 
x:\> "bootrec.exe /RebuildBcd".

不要使用bootrec.exe /Fixmbr,由於那會將GRUB清除掉

/etc/grub.d/40_custom能夠作爲建立/etc/grub.d/nn_custom的模板.nn定義了腳本執行的優先級.腳本執行的順序又決定了grub引導啓動目錄的內容.

Note:  nn 應該比06大,這樣才能確保必要的腳本被優先執行

UEFI 系統

注意:
  • 建議閱讀並理解UEFIGPT and UEFI Bootloaders
  • 使用UEFI安裝時,重要的是從開始安裝時您的機器就在 UEFI 模式。Arch Linux的安裝介質必須是UEFI啓動。

檢查你是否使用GPT且有ESP分區

若是想要使用EFI在某個磁盤上進行啓動,那麼就須要使用EFI系統分區(EFI System Partition,即ESP),GPT倒不是必須的,不過咱們仍是高度建議使用GTP,而且這也是本篇文章當前支持的方法.若是你在一個支持EFI,而且已經有操做系統的電腦上安裝Arch(好比Windows 8),那麼你已經有了ESP了.能夠經過parted來列出啓動磁盤上的分區表以檢查其是否支持GPT和ESP(假設這個啓動磁盤是/dev/sda)

# parted /dev/sda print

若是使用GPT,那麼會出現"分區表:GPT".若是使用EFI,那麼會有一個文件系統爲vfat的小分區(通常小於512MiB)而且被標誌爲啓動分區.在這個小分區上,應該有一個名爲EFI的文件夾.若是這些條件都知足,那麼這就是ESP了.注意分區序號,由於以後安裝GRUB2時你須要mount它.

創建ESP

若是你沒有ESP,請參考EFI System Partition的引導來建立它

安裝

注意: 衆所周知,不一樣的主板廠商的UEFI實現方式也不同.咱們鼓勵用戶將其配置過程當中遇到的問題及其細節分享出來.爲了保證 GRUB頁面的簡潔,請參考 GRUB/EFI examples (簡體中文)

本節假設您正在安裝GRUB的x86_64系統下(x86_64-EFI)。對於 i686 系統,在適當狀況下替換爲 x86_64-efi 和 i386-efi。 請確保您在 bash shell 中。例如,當從Arch ISO引導時:

# arch-chroot /mnt /bin/bash

安裝grub efibootmgr包。"GRUB"是引導程序, efibootmgr creates bootable .efi stub entries used by the GRUB installation script. 接下來的步驟將安裝GRUB UEFI 程序到 $esp/EFI/grub中, 安裝其模塊到/boot/grub/x86_64-efi, and place the bootable grubx64.efi stub in $esp/EFI/grub.

首先,告訴GRUB使用UEFI,設置引導目錄,並設置引導程序ID,將$esp 修改成你的 efi 分區 (一般爲 /boot)

# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --recheck

The --bootloader-id is what appears in the boot options to identity the GRUB EFI boot option; make sure this is something you will recognize later. The install will create a directory of the same name under $esp/EFI/ where the EFI binary bootloader will be placed. 上述安裝完成後 GRUB 的主目錄將位於 /boot/grub/

注意:
  • 雖然一些發行版須要 /boot/efi/boot/EFI目錄,但 Arch沒有。
  • --efi-directory 和 --bootloader-id是特定於GRUB UEFI的. --efi-directory 指定了 ESP分區的掛載點。--root-directory已經廢棄了並被取代。
  • 您可能注意到在 grub-install命令中沒有一個<device_path>選項(例如: /dev/sda)。In fact any <device_path> provided will be ignored by the GRUB install script, as UEFI bootloaders do not use a MBR or partition boot sector at all.

如今GRUB已經安裝好了.請移至配置一節繼續.

延伸閱讀

下面是關於經過UEFI安裝Arch的相關信息

其餘方法

若是你想將全部的GRUB boot 文件放在ESP中,請給grub-install命令添加--boot-directory=$esp/EFI選項:

# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --boot-directory=$esp/EFI --recheck --debug

下面的命令會將GRUB模組文件放在$esp/EFI/grub中.使用這個方法,grub.cfg也會被放在ESP中,因此請確保grub-mkconfig指向了正確的地方:

# grub-mkconfig -o $esp/EFI/grub/grub.cfg

配置檔和BIOS-GRUB是同樣的.

在固件啓動管理器中建立GRUB條目

grub-install會自動嘗試在啓動管理器中建立GRUB條目.若是沒有成功,請參考Beginners' guide#GRUB,裏面有關於使用efibootmgr建立啓動目錄條目的介紹.通常來講,這個問題都是由於你沒有以UEFI模式啓動CD/USB形成的.請參考UEFI#Create UEFI bootable USB from ISO.

建立GRUB Standalone模式的UEFI應用程序

能夠創建一個grubx64_standalone.efi,這個應用將全部的模組嵌入自身的memdisk中,因此就不須要使用單獨的目錄來存放GRUB UEFI模組和其餘相關文件了,使用grub包裏的grub-mkstandalone能夠實現這個功能.

最簡單的的方法就是使用grub-mkstandalone,不過,咱們還能夠指定嵌入哪些模組:

# grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi/" --format="x86_64-efi" --compression="xz" \
--output="$esp/EFI/grub/grubx64_standalone.efi" <你想嵌入的模組>

grubx64_standalone.efi文件要求將grub.cfg放置到(memdisk)/boot/grub中,而這個memdisk是嵌入到EFI應用當中的.grub-mkstandlone腳本容許傳遞將要嵌入memdisk的文件列表.(上面命令裏的"<你想嵌入的模組>")

若是你的grub.cfg的路徑是/home/user/Desktop/grub.cfg,那麼須要建立一個臨時的/home/user/Desktop/boot/grub/目錄,而後將grub.cfg複製到其中並進入這個目錄並運行:

# grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi/" --format="x86_64-efi" --compression="xz" \
--output="$esp/EFI/grub/grubx64_standalone.efi" "boot/grub/grub.cfg"

進入/home/user/Desktop/boot/grub/可是傳遞boot/grub/grub.cfg參數(請注意是boot/而不是/boot/)的緣由是grub-mkstandalone會自動將boot/grub/grub.cfg處理爲/(memdisk)/boot/grub/grub.cfg

若是你傳遞/home/user/Desktop/grub.cfg,那麼處理後的結果會是(memdisk)/home/user/Desktop/grub.cfg.若是傳遞/home/user/Desktop/boot/grub/grub.cfg,那麼結果就是(memdisk)/home/user/Desktop/boot/grub/grub.cfg.因此須要進入/home/user/Desktop/boot/grub/並傳遞boot/grub/grub.cfg參數,由於這樣才能生成grub.efi須要的(memdisk)/boot/grub/grub.cfg.

若是須要爲$esp/EFI/arch_grub/grubx64_standalone.efi建立一個UEFI啓動器條目,使用efibootmgr.#Create GRUB entry in the Firmware Boot Manager裏有介紹

配置

能夠自動生成配置檔,也能夠手動編輯grub.cfg.

Note:
  • 對於EFI系統,若是在安裝GRUB時使用 --boot-directory=$esp/EFI了選項,grub.cfg文件必須和grubx64.efi放在同一文件夾.若是沒有使用這個選項,那麼grub.cfg應當在/boot/grub/下,和GRUB BIOS系統同樣.
  • 這裏能夠找到關於如何配置GRUB的完整描述.

使用grub-mkconfig自動生成配置檔

和GRUB Legacy配置文件menu.lst對應的GRUB配置文件是/etc/default/grub 和/etc/grub.d/*.grub-mkconfig使用這些文件來生成grub.cfg.grub-mkconfig默認輸出至stdout.如下命令能夠生成一個grub.cfg文件:

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

/etc/grub.d/10_linux會自動爲Arch Linux設置啓動項.其餘操做系統的話,可能須要手動在/etc/grub.d/40_custom/boot/grub/custom.cfg中設置.

Note: 若是你在一個chroot環境中或者systemd-nspawn容器裏執行這些操做,可能徹底不會成功,由於grub-probe不能獲取'/dev/sdaX'這樣的典型路徑.這種狀況下,能夠嘗試使用 arch-chroot.

額外的參數

/etc/default/grub中設置GRUB_CMDLINE_LINUXGRUB_CMDLINE_LINUX_DEFAULT變量能夠實現將向Linux鏡像傳遞額外的參數.生成grub.cfg時,若是遇到普通啓動項,這兩個參數會一塊兒使用,遇到recovery啓動項,就只使用GRUB_CMDLINE_LINUX參數.

沒有必要二者一塊兒使用.這兩個參數頗有用.好比,若是要系統支持休眠後恢復,須要使用GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sdaX quiet" (sdaX是交換分區).這個選項會生成一個recovery啓動項,這個啓動項沒有resume和quiet參數.其餘的普通啓動項也可能使用它們.(GRUB會爲每一個內核生成兩個啓動項,一個默認的一個recovery的,GRUB_CMDLINE_LINUX指定的參數會傳遞給這兩個啓動項.GRUB_CMDLINE_LINUX_DEFAULT指定的參數只會傳遞給默認啓動項)

當生成GRUB recovery啓動項時,你必須在/etc/default/grub中將#GRUB_DISABLE_RECOVERY=true 註釋掉.

你也可使用GRUB_CMDLINE_LINUX="resume=/dev/disk/by-uuid/${swap_uuid}"${swap_uuid} 是交換分區的UUID

不一樣的啓動項使用雙引號引發來並用空格隔開.因此,對於即想使用resume又想使用systemd的用戶來講,這個參數的設置多是: GRUB_CMDLINE_LINUX="resume=/dev/sdaX init=/usr/lib/systemd/systemd" 更多信息請參考Kernel parameters.

手動建立 grub.cfg

Warning:  不推薦編輯這個文件.這個文件由 grub-mkconfig生成,最好編輯 /etc/default/grub/etc/grub.d文件夾下的腳本以實現修改.

基本的GRUB配置文件使用以下選項:

  • (hdX,Y) 是X磁盤的Y分區,分區從1開始計數,磁盤從0開始計數.
  • set default=N設定用戶選擇超時時間事後的默認啓動項
  • set timeout=M設定用戶選擇超時時間(秒).
  • menuentry "title" {entry options}設置一個名爲title的啓動項
  • set root=(hdX,Y)設定啓動分區(kernel和GRUB模組所在磁盤),/boot沒被要求獨佔一個分區,有可能就是root分區下的一個文件夾

示例配置以下:

/boot/grub/grub.cfg
# Config file for GRUB - The GNU GRand Unified Bootloader
# /boot/grub/grub.cfg

# DEVICE NAME CONVERSIONS
#
#  Linux           Grub
# -------------------------
#  /dev/fd0        (fd0)
#  /dev/sda        (hd0)
#  /dev/sdb2       (hd1,2)
#  /dev/sda3       (hd0,3)
#

# Timeout for menu
set timeout=5

# Set default boot entry as Entry 0
set default=0

# (0) Arch Linux
menuentry "Arch Linux" {
  set root=(hd0,1)
  linux /vmlinuz-linux root=/dev/sda3 ro
  initrd /initramfs-linux.img
}

## (1) Windows
#menuentry "Windows" {
#  set root=(hd0,3)
#  chainloader +1
#}

雙啓動

Note: 若是你但願GRUB自動搜尋其餘系統, 能夠安裝 os-prober.

使用/etc/grub.d/40_custom 和 grub-mkconfig自動生成

添加其餘啓動項的最好方法是編輯/etc/grub.d/40_custom/boot/grub/custom.cfg.運行grub-mkconfig後,這些文件中的啓動項會被自動添加到grub.cfg中. 更新了這些文件後,運行:

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

在UEFI-GPT模式下,運行:

# grub-mkconfig -o /boot/efi/EFI/GRUB/grub.cfg

這樣會更新grub.cfg


一個典型/etc/grub.d/40_custom文件相似於下面這個爲HP Pavilion 15-e056sl Notebook PC|預裝WIN8的HP Pavilion 15-e056sl Notebook PC而做的配置.每一個啓動項的結構都應該和下面的相似.請注意UEFI分區/dev/sda2 被命名爲hd0,gpt2 和ahci0,gpt2(請參考here獲取更多信息)

/etc/grub.d/40_custom:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry "HP / Microsoft Windows 8.1" {
	echo "Loading HP / Microsoft Windows 8.1..."
	insmod part_gpt
	insmod fat
	insmod search_fs_uuid
	insmod chain
	search --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 763A-9CB6
	chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}

menuentry "HP / Microsoft Control Center" {
	echo "Loading HP / Microsoft Control Center..."
	insmod part_gpt
	insmod fat
	insmod search_fs_uuid
	insmod chain
	search --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 763A-9CB6
	chainloader (${root})/EFI/HP/boot/bootmgfw.efi
}

menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}

menuentry "System restart" {
	echo "System rebooting..."
	reboot
}
GNU/Linux 啓動項

假設另外一個發行版位於sda2:

menuentry "Other Linux" {
	set root=(hd0,2)
	linux /boot/vmlinuz (add other options here as required)
	initrd /boot/initrd.img (if the other kernel uses/needs one)
}
FreeBSD 啓動項

要求FreeBSD以UFS格式被安裝在單獨的分區上,假設安裝在sda4上:

menuentry "FreeBSD" {
	set root=(hd0,4)
	chainloader +1
}
Windows XP 啓動項

假設Windows分區是sda3.請記住須要將root設置到Windows安裝時創建的啓動分區上,而後鏈式加載它,而不是Windows系統所在分區.下面的例子就是假設啓動分區就是sda3.

# (2) Windows XP
menuentry "Windows XP" {
	set root="(hd0,3)"
	chainloader +1
}

若是Windows的bootloader和GRUB不在一個硬盤上,那麼須要讓Windows認爲它是在第一硬盤上.使用drivemap能夠實現這點.假設GRUB在hd0而windows在hd2上,須要在設定root後執行:

drivemap -s hd0 hd2
UEFI-GPT 模式下安裝的Windows的啓動項
if [ "${grub_platform}" == "efi" ]; then
	menuentry "Microsoft Windows Vista/7/8 x86_64 UEFI-GPT" {
		insmod part_gpt
		insmod fat
		insmod search_fs_uuid
		insmod chain
		search --fs-uuid --set=root $hints_string $uuid
		chainloader /EFI/Microsoft/Boot/bootmgfw.efi
	}
fi

$hints_string 和 $uuid能夠經過如下命令獲取:

$uuid:

# grub-probe --target=fs_uuid $esp/EFI/Microsoft/Boot/bootmgfw.efi
1ce5-7f28

$hints_string:

# grub-probe --target=hints_string $esp/EFI/Microsoft/Boot/bootmgfw.efi
 --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1

這兩個命令都是假設ESP掛載在$esp上.固然,Windows的EFI文件路徑可能有變,由於這就是Windows....

"Shutdown" 啓動項
menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}
"Restart" 啓動項
menuentry "System restart" {
	echo "System rebooting..."
	reboot
}

經過EasyBCD NeoGRUB 和Windows共存

如今EasyBCD的NeoGRUB還不能識別GRUB的目錄格式,在 C:\NST\menu.lst 中添加以下行以鏈式加載到GRUB:

default 0
timeout 1
title       Chainload into GRUB v2
root        (hd0,7)
kernel      /boot/grub/i386-pc/core.img

最後,使用grub-mkconfig重建grub.cfg

可視化配置

GRUB默認就支持定製啓動目錄的外觀.不過要確保使用合適的視頻模式初始化GRUB的圖形化終端gfxterm.在#"No suitable mode found" error一節中有介紹.GRUB經過'gfxpayload'來將視頻模式傳遞給linux內核,因此任何可視化配置都須要這個模式的信息以正確工做.

設定幀緩衝的分辨率

GRUB既能夠爲本身,也能夠爲內核設定幀緩衝.如今已經不使用老的vga=配置了.推薦方法是在/etc/default/grub進行以下編輯:

GRUB_GFXMODE=1024x768x32
GRUB_GFXPAYLOAD_LINUX=keep

運行如下命令使配置生效:

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

gfxpayload屬性會確保內核也保持這個分辨率

 

Note:
  • 若是示例不起做用,請嘗試用vbemode="0x105"代替gfxmode="1024x768x32".請使用適合你屏幕的分辨率.
  • 能夠經過# hwinfo --framebuffer命令來顯示全部可使用的分辨率模式(hwinfo在community裏),在GRUB命令行下,可使用vbeinfo 命令

這種方法無論用的話,能夠試試老的vga=方法.將它添加到"GRUB_CMDLINE_LINUX_DEFAULT="裏面就好了,好比 "GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792" 這會將系統的分辨率設定爲1024*768

能夠選擇如下分辨率中的一種:640×480800×6001024×7681280×10241600×12001920×1200

915resolution hack

有些時候,Intel顯卡沒法經過# hwinfo --framebuffer 或vbeinfo顯示你須要的分辨率.這種狀況下,你可使用915resolution hack.915resolution hack會臨時性的修改顯卡BIOS來添加所需的分辨率.詳情請參考915resolution's home page

首先,找一個你想要替代的視頻模式.例如在GRUB命令行模式下運行:

sh:grub> 915resolution -l
Intel 800/900 Series VBIOS Hack : version 0.5.3
[...]
Mode 30 : 640x480, 8 bits/pixel
[...]

而後,使用1440x900 分辨率覆蓋Mode 30

/etc/grub.d/00_header
[...]
915resolution 30 1440 900  # Inserted line
set gfxmode=${GRUB_GFXMODE}
[...]

最後,設置GRUB_GFXMODE,從新生成GRUB配置文件,重啓並測試是否生效:

# grub-mkconfig -o /boot/grub/grub.cfg
# reboot

背景圖像和點陣字體

GRUB原生支持設置背景圖像和點陣字體(以pf2格式).grub包含unifont字體,名爲unicode.pf2.(也有可能只包含名爲ascii.pf2的ASCII字符字體)

GRUB支持的圖像格式有tga,png,jpeg.所支持的最大圖像分辨率跟硬件有關.

Make sure you have set up the proper framebuffer resolution. 請確保你已經設定了合適的幀緩衝分辨率

編輯/etc/default/grub:

GRUB_BACKGROUND="/boot/grub/myimage"
#GRUB_THEME="/path/to/gfxtheme"
GRUB_FONT="/path/to/font.pf2"
Note: 若是你將GRUB安裝在單獨的分區上,  /boot/grub/myimage 應該改成  /grub/myimage.

從新生成配置文件:

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

若是成功的添加了背景圖片,那麼用戶會在命令行中看到"Found background image...". 若是沒有看到"Found background image...",圖像信息就可能沒有嵌入grub.cfg中了.

若是圖像沒有正確顯示,執行以下檢查:

  • /etc/default/grub裏,圖像的路徑和名字是否正確
  • 圖像的大小和格式是否合適(tga,png,8-bit jpg)
  • 圖像是否是以RGB模式存儲,是否是沒有索引
  • /etc/default/grub裏面是否是沒有開啓console模式
  • 是否執行grub-mkconfig以從新生成配置文件

主題

下面的例子將展現如何使用GRUB包重的starfield主題:

編輯 /etc/default/grub

GRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"

重生成配置:

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

配置成功的話,在重生成配置過程當中,會出現Found theme: /usr/share/grub/themes/starfield/theme.txt.使用主題就不會使用以前的背景圖像

目錄顏色

GRUB支持設置目錄顏色.可以使用的顏色能從the GRUB Manual裏面找到.示例以下:

編輯/etc/default/grub:

GRUB_COLOR_NORMAL="light-blue/black"
GRUB_COLOR_HIGHLIGHT="light-cyan/blue"

重建配置檔:

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

隱藏目錄

GRUB特性之一就是支持隱藏/跳過目錄,同時支持按Esc來打斷隱藏/跳過.同時還支持設置是否顯示timeout計時器 下面的例子設置5s鍾內沒有按Esc鍵就啓動默認的啓動項,而且在屏幕上顯示倒計時:

編輯/etc/default/grub:

GRUB_HIDDEN_TIMEOUT=5
GRUB_HIDDEN_TIMEOUT_QUIET=false

重建配置檔:

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

禁用framebuffer

Users who use NVIDIA proprietary driver might wish to disable GRUB's framebuffer as it can cause problems with the binary driver. 使用NVIDIA私有驅動的用戶可能但願禁用GRUB的framebuffer,由於會致使驅動錯誤.

/etc/default/grub中添加(若是已經有背註釋掉的這行,就取消註釋):

GRUB_TERMINAL_OUTPUT=console

重建配置檔:

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

若是你想保留GRUB的framebuffer,解決方法是在GRUB載入內核前進入文字模式.能夠經過在/etc/default/grub設置以下:

GRUB_GFXPAYLOAD_LINUX=text

而後重建配置檔.

其餘選項

LVM

若是使用LVM作爲啓動設備,那麼在啓動項裏添加:

insmod lvm

而後在啓動項裏指定root:

set root=lvm/lvm_group_name-lvm_logical_boot_partition_name

示例以下:

# (0) Arch Linux
menuentry "Arch Linux" {
  insmod lvm
  set root=lvm/VolumeGroup-lv_boot
  # you can only set following two lines
  linux /vmlinuz-linux root=/dev/mapper/VolumeGroup-root ro
  initrd /initramfs-linux.img
}

陣列

經過添加insmod mdraid,GRUB可以很方便的處理磁盤陣列.好比/dev/md0:

set root=(md0)

陣列上的分區(好比/dev/md0p1)則爲:

set root=(md0,1)

若是啓動分區在raid1上,想要安裝grub,只須要在兩個磁盤上分別運行grub-install便可:

grub-install --target=i386-pc --recheck --debug /dev/sda && grub-install --target=i386-pc --recheck --debug /dev/sdb

這時/dev/sda和/dev/sdb就都有了raid1的啓動文件夾/boot了

持久塊設備命名法

持久塊設備命名法(Persistent block device naming)的一個目的是使用全局的UUID來區分分區,而不是用老的/dev/sd*表示法.好處顯而易見.

GRUB默認使用持久塊設備命名法

Note: 每次文件系統調整事後,就須要用新的UUID來更新 /boot/grub.cfg.經過Live-CD調整分區和文件系統後要特別注意這點

是否使用UUID由/etc/default/grub裏的這個選項控制:

# GRUB_DISABLE_LINUX_UUID=true

不管如何,變動配置後請重建配置檔:

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

使用卷標

GRUB支持以卷標識別文件系統(經過search命令的--label參數).

首先,給文件系統設置一個卷標:

# tune2fs -L LABEL PARTITION

而後在啓動項中使用這個卷標:

menuentry "Arch Linux, session texte" {
  search --label --set=root archroot
  linux /boot/vmlinuz-linux root=/dev/disk/by-label/archroot ro
  initrd /boot/initramfs-linux.img
}

調用以前的啓動項

GRUB可以記住你當前使用的啓動項而且在下次啓動時將其做爲默認項.當你使用多個內核或操做系統時,這個特性頗有用. 編輯/etc/default/grub中的GRUB_DEFAULT選項:

GRUB_DEFAULT=saved

上面的命令會告訴GRUB使用記住的啓動項爲默認啓動項. 將下面的行添加到/etc/default/grub會讓GRUB記住當前的啓動項:

GRUB_SAVEDEFAULT=true
Note: 手動添加啓動項到 /etc/grub.d/40_custom/boot/grub/custom.cfg中,好比Windows啓動項,須要添加 savedefault

請記住重建配置檔.

改變默認啓動項

能夠經過修改/etc/default/grub中的GRUB_DEFAULT值來改變默認啓動項

GRUB_DEFAULT=0

GRUB啓動項序號從0開始計數.0表明第一個啓動項.

除了使用啓動項序號,也可使用啓動項名:

GRUB_DEFAULT='Arch Linux, with Linux core repo kernel'
Note: 請記住重建配置檔

安全

若是你想禁止其餘人改變啓動參數或者使用GRUB命令行,能夠給GRUB配置添加用戶名/密碼. 運行 grub-mkpasswd-pbkdf2,輸入密碼:

grub-mkpasswd-pbkdf2
[...]
Your PBKDF2 is grub.pbkdf2.sha512.10000.C8ABD3E93C4DFC83138B0C7A3D719BC650E6234310DA069E6FDB0DD4156313DA3D0D9BFFC2846C21D5A2DDA515114CF6378F8A064C94198D0618E70D23717E82.509BFA8A4217EAD0B33C87432524C0B6B64B34FBAD22D3E6E6874D9B101996C5F98AB1746FE7C7199147ECF4ABD8661C222EEEDB7D14A843261FFF2C07B1269A

而後將下面的內容添加到/etc/grub.d/00_header:

/etc/grub.d/00_header
cat << EOF

set superusers="username"
password_pbkdf2 username <password>

EOF
Note: 不能直接將

set superusers="username" password_pbkdf2 username <password> 添加到/etc/grub.d/00_header中去,而必須使用上述方法.不然會報錯 password_pbkdf2: not found

<password>grub-mkpasswd_pbkdf2生成的那個加密事後密碼.

而後重建配置檔.其餘用戶沒有密碼就不能變動GRUB配置或者使用GRUB命令行了.

能夠參考the GRUB manual中的"Security"部分來進行更多的客製化安全設定

root加密

cryptdevice=/dev/yourdevice:label添加到/etc/default/grub中的GRUB_CMDLINE_LINUX配置項,可讓GRUB傳遞參數給內核,讓內核對root加密:

Tip: 若是你使用從GRUB Legacy升級而來,檢查 /boot/grub/menu.lst.pacsave以獲取正確的device/label. 在 kernel /vmlinuz-linux後去找label.

將root映射到/dev/mapper/root:

GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda2:root"

固然,須要在rootfs上禁用UUID:

GRUB_DISABLE_LINUX_UUID=true

Regenerate the configuration.

設定下次啓動的啓動項(一次性,非持久)

命令grub-reboot能夠設置下次啓動時啓動哪一個啓動項而沒必要修改配置文件或者在啓動時手動選擇.這個設置是一次性的,即不會改變GRUB的默認啓動項.

Note: 須要在 /etc/default/grub中設定  GRUB_DEFAULT=saved,而後重建配置檔.在手動生成的  grub.cfg中, 使用  set default="${saved_entry}".

啓動時隱藏GRUB界面,除非按着SHIFT鍵

爲了獲取更快的啓動速度,而不用等GRUB倒計時,能夠命令GRUB在啓動時隱藏目錄,除非SHIFT被按着. 將以下行添加到/etc/default/grub:

 GRUB_FORCE_HIDDEN_MENU="true"

而後建立以下文件:

/etc/grub.d/31_hold_shift
#! /bin/sh
set -e

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="/usr"
exec_prefix="${prefix}"
datarootdir="${prefix}/share"

export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
source "${datarootdir}/grub/grub-mkconfig_lib"

found_other_os=

make_timeout () {

  if [ "x${GRUB_FORCE_HIDDEN_MENU}" = "xtrue" ] ; then 
    if [ "x${1}" != "x" ] ; then
      if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
    verbose=
      else
    verbose=" --verbose"
      fi

      if [ "x${1}" = "x0" ] ; then
    cat <<EOF
if [ "x\${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep$verbose --interruptible 3 ; then
      set timeout=0
    fi
  fi
fi
EOF
      else
    cat << EOF
if [ "x\${timeout}" != "x-1" ]; then
  if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then
    set timeout=0
  fi
fi
EOF
      fi
    fi
  fi
}

adjust_timeout () {
  if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
    cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
EOF
    make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}"
    echo else
    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
    echo fi
  else
    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
  fi
}

  adjust_timeout

    cat <<EOF
if [ "x\${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep$verbose --interruptible 3 ; then
      set timeout=0
    fi
  fi
fi
EOF

在GRUB中直接從ISO啓動

編輯/etc/grub.d/40_custom 或 /boot/grub/custom.cfg,給目標ISO添加一個啓動項.而後使用grub-mkconfig -o /boot/grub/grub.cfg更新配置檔

Arch ISO

Note: 下面的例子都是假設ISO文件位於 hd0,6分區上的 /archives文件夾裏
Tip: For thumbdrives, use something like  (hd1,$partition) and either  /dev/sdbY for the  img_dev parameter or  a persistent name, e.g.  img_dev=/dev/disk/by-label/CORSAIR.
Tip: 對於閃存,使用 (hd1,$partition)/dev/sdbY做爲 img_dev參數的值,或者使用持久塊設備命名法命名的設備,好比 img_dev=/dev/disk/by-label/CORSAIR.
x86_64
menuentry "Archlinux-2013.05.01-dual.iso" --class iso {
  set isofile="/archives/archlinux-2013.05.01-dual.iso"
  set partition="6"
  loopback loop (hd0,$partition)/$isofile
  linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201305 img_dev=/dev/sda$partition img_loop=$isofile earlymodules=loop
  initrd (loop)/arch/boot/x86_64/archiso.img
}
i686
menuentry "Archlinux-2013.05.01-dual.iso" --class iso {
  set isofile="/archives/archlinux-2013.05.01-dual.iso"
  set partition="6"
  loopback loop (hd0,$partition)/$isofile
  linux (loop)/arch/boot/i686/vmlinuz archisolabel=ARCH_201305 img_dev=/dev/sda$partition img_loop=$isofile earlymodules=loop
  initrd (loop)/arch/boot/i686/archiso.img
}

Ubuntu ISO

Note: 下面的例子都是假設ISO文件位於 hd0,6分區上的 /archives文件夾裏. 用戶須要根據本身系統的實際狀況調整.
menuentry "ubuntu-13.04-desktop-amd64.iso" {
  set isofile="/archives/ubuntu-13.04-desktop-amd64.iso"
  loopback loop (hd0,6)/$isofile
  linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash --
  initrd (loop)/casper/initrd.lz
}
menuentry "ubuntu-12.04-desktop-amd64.iso" {
  set isofile="/archives/ubuntu-12.04-desktop-amd64.iso"
  loopback loop (hd0,6)/$isofile
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash --
  initrd (loop)/casper/initrd.lz
}

Other ISOs

可從這裏獲取其餘ISO的配置.

使用GRUB命令行

MBR過小,因此不足以存儲全部的GRUB模組.MBR裏面只有啓動目錄配置和一些很基本的命令.GRUB的主要功能經過/boot/grub裏的模組實現,並且能夠按需加載.出現錯誤時,GRUB可能不能引導啓動(好比,磁盤分區發生了變化).這時候,通常會出現命令行界面.

GRUB不止提供一個shell.若是GRUB不能讀取到啓動目錄配置,可是能找到磁盤,你極可能須要進入"normal" shell:

sh:grub>

若是有更嚴重的問題(好比,GRUB找不到必須的文件了),你就可能須要進入"rescue" shell:

grub rescue>

"rescue" shell是"normal" shell的一個子集,其支持的功能更少.若是不幸進入了"rescue" shell裏,首先記載"normal"模組,而後啓動"normal" shell:

grub rescue> set prefix=(hdX,Y)/boot/grub
grub rescue> insmod (hdX,Y)/boot/grub/i386-pc/normal.mod
rescue:grub> normal

分頁支持

GRUB支持對長輸出進行分頁(好比運行help的輸出).不過只有normal shell支持分頁,而rescue shell不支持.開啓分頁支持的方法以下:

sh:grub> set pager=1

使用命令行引導操做系統

grub> 

可使用GRUB命令行引導操做系統,一個典型的應用場景是經過chainloading來引導另外一個Windows或Linux

ChainLoading的意思是用當前的bootloader去載入另外一個bootloader,因此叫作鏈式加載.這個bootloader可能位於MBR,也可能在另外一個分區的引導扇區上.

鏈式加載一個分區

set root=(hdX,Y)
chainloader +1
boot

X=0,1,2... Y=1,2,3...

好比鏈式加載一個位於首磁盤,首分區上的Windows:

set root=(hd0,1)
chainloader +1
boot

也可使用GRUB鏈式加載另外一個分區引導扇區上的GRUB.

鏈式加載磁盤

set root=hdX
chainloader +1
boot

正常載入

請參考#使用應急命令行

圖形化配置工具

  • grub-customizer — 定製bootloader(GRUB or BURG)
https://launchpad.net/grub-customizer ||  grub-customizerAUR
  • grub2-editor — KDE4上配置GRUB的控制模組
http://kde-apps.org/content/show.php?content=139643 ||  grub2-editorAUR[broken link: archived in aur-mirror]
  • kcm-grub2 — 能夠管理大部分經常使用GRUB配置的kcm模組
http://kde-apps.org/content/show.php?content=137886 ||  kcm-grub2AUR[broken link: archived in aur-mirror]
  • startupmanager — GRUB Legacy, GRUB, Usplash and Splashy的圖形化配置工具(abandonned)
http://sourceforge.net/projects/startup-manager/ ||  startupmanagerAUR

parttool

若是你安裝了Windows 9x系列操做系統,而它們隱藏了磁盤(好比C盤),GRUB可以使用parttool來設置是否隱藏.好比,想從三個Windows 9x系統的第三個啓動,能夠這樣:

parttool hd0,1 hidden+ boot-
parttool hd0,2 hidden+ boot-
parttool hd0,3 hidden- boot+
set root=hd0,3
chainloader +1
boot

使用應急命令行

請先閱讀#使用GRUB命令行.若是沒法進入命令行,請嘗試使用Live CD或者其餘rescue磁盤引導,而後修正錯誤.不過有些時候咱們手上沒有此類rescue磁盤,這時,應急命令行(rescue console)就能夠派上用場了.

GRUB應急命令行裏可用的命令有insmodlssetunset.可使用set/unset修改變量,使用insmod來載入模組.

首先,用戶必須知道啓動分區(/boot所在位置而後設置:

grub rescue> set prefix=(hdX,Y)/boot/grub

經過加載linux模組來擴展命令行的功能:

grub rescue> insmod (hdX,Y)/boot/grub/linux.mod
Note: 若是/boot是在單獨的分區上,請從路徑中移除/boot.(即. 輸入  set prefix=(hdX,Y)/grub 而後 insmod (hdX,Y)/grub/linux.mod)

這個模組會啓動對咱們熟悉的linux 和 initrd 命令的支持 (請參考#配置).

好比:

set root=(hd0,5)
linux /boot/vmlinuz-linux root=/dev/sda5
initrd /boot/initramfs-linux.img
boot

若是/boot在單獨分區上:

set root=(hd0,5)
linux /vmlinuz-linux root=/dev/sda6
initrd /initramfs-linux.img
boot

成功啓動Arch後,用戶能夠修正配置的錯誤或者從新安裝GRUB.

關於修正配置和從新安裝GRUB,請參考#配置#安裝章節.

使用UUID的基礎腳本

若是你想要使用UUID來避免不可靠的BIOS設備命名或者正在研究GRUB語法,這裏有個使用UUID的示例性的啓動項配置腳本.若是你想要將其移植到本身的系統上,只須要修改UUID就好了.這個例子假設系統的boot和root文件系統是在不一樣的分區上.若是你還有其餘分區,請作相應修改.

 menuentry "Arch Linux 64" {
         # Set the UUIDs for your boot and root partition respectively
         set the_boot_uuid=ece0448f-bb08-486d-9864-ac3271bd8d07
         set the_root_uuid=c55da16f-e2af-4603-9e0b-03f5f565ec4a
   
         # (Note: This may be the same as your boot partition)
   
         # Get the boot/root devices and set them in the root and grub_boot variables
         search --fs-uuid $the_root_uuid --set=root
         search --fs-uuid $the_boot_uuid --set=grub_boot
   
         # Check to see if boot and root are equal.
         # If they are, then append /boot to $grub_boot (Since $grub_boot is actually the root partition)
         if [ $the_boot_uuid == $the_root_uuid ] ; then
             set grub_boot=($grub_boot)/boot
         else
             set grub_boot=($grub_boot)
         fi
   
         # $grub_boot now points to the correct location, so the following will properly find the kernel and initrd
         linux $grub_boot/vmlinuz-linux root=/dev/disk/by-uuid/$the_root_uuid ro
         initrd $grub_boot/initramfs-linux.img
 }

異常處理

Intel BIOS不能引導GPT

一些Intel的BIOS要求至少要一個可啓動的分區(MBR方案下的),致使GTP方案下的分區GRUB沒法啓動.

能夠經過fdisk來將一個GPT分區標誌爲'boot'((最好就設在你爲GRUB建立的那個1007KiB分區上)),這樣就能夠繞過這個問題了:

1.對目標磁盤(好比/dev/sda)運行fdisk
2.按鍵,而後選擇想要設置'boot'標誌的分區
3.最後按鍵,將變動寫入磁盤
 
aw
Note: 必須使用fdisk或者相似於它的工具來設置'boot flag',不能用Gparted等,由於它們不會在MBR裏面設置'boot flag'.

請參考 http://www.rodsbooks.com/gdisk/bios.html

啓用調試信息

grub.cfg裏添加:

set pager=1
set debug=all

"No suitable mode found" error

啓動時可能出現以下提示信息:  

error: no suitable mode found
Booting however

而後你須要以合適的視頻模式(gfxmode)啓動 GRUB 圖形化終端(gfxterm).視頻模式由GRUB經過'gfxpayload'變量傳遞給linux內核.在UEFI系統下,若是沒有初始化視頻模式的值,終端上就不會顯示內核啓動消息(至少直到KMS開始運行)

/usr/share/grub/unicode.pf2複製到 ${GRUB_PREFIX_DIR}(/boot/grub/ .若是GRUB UEFI安裝時設定了--boot-directory=$esp/EFI,那麼複製的目的文件夾是$esp/EFI/grub/:

# cp /usr/share/grub/unicode.pf2 ${GRUB_PREFIX_DIR}

若是/usr/share/grub/unicode.pf2 不存在, 安裝bdf-unifont, 建立 unifont.pf2 文件而後將其複製到 ${GRUB_PREFIX_DIR}:

# grub-mkfont -o unicode.pf2 /usr/share/fonts/misc/unifont.bdf

而後,在grub.cfg文件中添加以下行: (會給linux內核傳遞合適的視頻模式,不然你只會獲得一個黑屏,雖然系統仍是會啓動成功) BIOS 系統:

insmod vbe

UEFI 系統:

insmod efi_gop
insmod efi_uga

在這些行後添加(BIOS&&UEFI):

insmod font
if loadfont ${prefix}/fonts/unicode.pf2
then
    insmod gfxterm
    set gfxmode=auto
    set gfxpayload=keep
    terminal_output gfxterm
fi

若是要gfxterm(圖形化終端)工做正常,${GRUB_PREFIX_DIR}文件夾裏面應該要有unicode.pf2 .

出現"msdos-style"錯誤消息

如下錯誤可能出如今你將GRUB安裝到VMware上時.請閱讀相關連接.這種狀況是由於首分區直接從MBR後開始(即第64個扇區),而不是和正常的那樣有1到2M post-MBR gap.請參閱#MBR專用指令

grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding will not be possible!
grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists.
            However, blocklists are UNRELIABLE and its use is discouraged.
grub-setup: error: If you really want blocklists, use --force.

GRUB UEFI 啓動到了rescue shell下

若是GRUB直接就啓動到了rescue shell下,並且沒報錯,這多是由於grub.cfg丟失或者位置不對.若是GRUB UEFI 安裝時設定了--boot-directory參數,而grub.cfg文件丟失,會出現這個問題.若是啓動分區的分區號發生了變化(這個分區號會被直接編碼到grubx64.efi文件中),也會出現這個問題.

GRUB UEFI 沒法被載入

下面是一個EFI啓動項信息示例:

# efibootmgr -v
BootCurrent: 0000
Timeout: 3 seconds
BootOrder: 0000,0001,0002
Boot0000* Grub	HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\efi\grub\grub.efi)
Boot0001* Shell	HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\EfiShell.efi)
Boot0002* Festplatte	BIOS(2,0,00)P0: SAMSUNG HD204UI

若是啓動後,屏幕直接變黑,幾秒後就跳到了下一個啓動項,根據相關連接的說法是,將GRUB移動到root分區上可能會解決這個問題.必須先刪除啓動項,而後重建,變化以下:

Boot0000* Grub	HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(\grub.efi)

"Invalid signature"錯誤

若是在啓動Windows時出現了"invalid signature"錯誤(好比在從新分區或者添加了新硬盤後),刪除GRUB的磁盤mapping,而後重建:

# mv /boot/grub/device.map /boot/grub/device.map-old
# grub-mkconfig -o /boot/grub/grub.cfg

grub-mkconfig此時就應該生成了新的啓動項了,包括Windows.確認能啓動成功後,再將備份文件/boot/grub/device.map-old刪除.

引導過程卡死

若是在GRUB載入內核並初始化ramdisk後引導過程卡死了,請嘗試移除add_efi_memmap這個內核參數

回滾到 GRUB Legacy

  • 將GRUB2相關文件更名覺得備份:
# mv /boot/grub /boot/grub.nonfunctional
  • 將GRUB Legacy 移回/boot:
# cp -af /boot/grub-legacy /boot/grub
  • 恢復備份的MBR
Warning: 這個命令同時會恢復分區表,因此請要很是注意.
# dd if=/path/to/backup/first-sectors of=/dev/sdX bs=512 count=1

安全的方法是隻恢復MBR中的啓動代碼:

# dd if=/path/to/backup/mbr-boot-code of=/dev/sdX bs=446 count=1

其餘系統不能自動發現Arch Linux

有人發現有些發行版不能使用os-prober自動發現Arch Linux.據稱先使用/etc/lsb-release可能會解決這個問題.相關文件和工具能夠在 官方倉庫lsb-release包中找到

參閱

相關文章
相關標籤/搜索