GRUB (正體中文)

From ArchWiki
Jump to navigation Jump to search

Tango-preferences-desktop-locale-modified.pngThe translation of this article or section does not reflect the original text.Tango-preferences-desktop-locale-modified.png

Reason: Last updated 2012 (Discuss in Talk:GRUB (正體中文)#)

GRUB2 是新一代的 GRand Unified Bootloader (GRUB/開機引導程式). GRUB2 來自於 PUPA 這個探討下一代 GRUB 的研究專案 。GRUB 2 被重新編寫,擁有模組化和可移植性。[1]

簡單地說,開機引導程式 是當電腦開機時第一個執行的程式(在此請自動忽略BIOS)。它負責載入並移交控制權給 Linux 核心。而核心載入後,則反過來啟動作業系統內的其它部份。



  • The name GRUB officially refers to version 2 of the software, see [2]. If you are looking for the article on the legacy version, see GRUB Legacy.
  • GRUB Legacy (i.e. version 0.9x) 已被開發者們認為是舊作,在 Arch Linux已經被GRUB2取代 . 參閱最新消息 here. Upstream recommends GRUB2 >=1.99 over GRUB Legacy, even for current GRUB Legacy users.
  • 從 1.99-6版起, GRUB2 支援 Btrfs as root (without a separate /boot filesystem) compressed with either zlib or LZO.
  • For GRUB2 UEFI info, it is recommended to read the UEFI, GPT and Boot loader pages before reading this page.

給 GRUB 舊版的使用者

  • GRUB 舊版將從您的系統中移除, 您可以考慮將 GRUB更新到版本 2.x, 或者其他開機程式.
  • GRUB and GRUB2 的指令是有差別的. 請在進行下一步之前自己熟悉一下 GRUB2 commands (例如, "find" 就被更換為 "search").
  • GRUB2 現在己經 模組化 且不再需要 "stage 1.5"。因此,引導程式本身是有限的 - 當需要擴充功能時模組才從硬碟內被載入(例如,LVM 或 RAID支援)
  • GRUB2 設備命名也改得和 GRUB 不同。磁區 Partitions 由數字 1 起算,而硬碟仍然由 0 起算,舉例來說,/dev/sda1 被 GRUB2 指引為 (hd0,1)等 。

Preliminary Requirements for GRUB2


GPT specific instructions

GRUB2 in BIOS-GPT configuration requires a BIOS Boot Partition to embed its core.img in the absence of post-MBR gap in GPT partitioned systems (which is taken over by the GPT Primary Header and Primary Partition table). This partition is used by GRUB2 only in BIOS-GPT setups. No such partition type exists in case of MBR partitioning (at least not for GRUB2). This partition is also not required if the system is UEFI based, as no embedding of bootsectors takes place in that case. Syslinux does not require this partition.

For a BIOS-GPT configuration, create a 2 MiB partition using cgdisk or GNU Parted with no filesystem. The location of the partition in the partition table does not matter but it should be within the first 2 TiB region of the disk. It is advisable to put it somewhere in the beginning of the disk before the /boot partition. Set the partition type to "EF02" in cgdisk or set <BOOT_PART_NUM> bios_grub on in GNU Parted.

Note: This partition should be created before grub-install or grub-setup is run or before the Install Bootloader step of the Archlinux installer (if GRUB2 BIOS is selected as bootloader).
MBR aka msdos partitioning specific instructions

Usually the post-MBR gap (after the 512 byte MBR region and before the start of the 1st partition) in many MBR (or msdos disklabel) partitioned systems is 31 KiB when DOS compatibility cylinder alignment issues are satisfied in the partition table. However a post-MBR gap of about 1 to 2 MiB is recommended to provide sufficient room for embedding GRUB2's core.img (FS#24103). It is advisable to use a partitioner which supports 1 MiB partition alignment to obtain this space as well as satisfy other non-512 byte sector issues (which are unrelated to embedding of core.img).

如果你沒有在BIOS系統中雙啟動到MS Windows (any version), 轉換到 GPT partitioning - GUID Partition Table#Convert_from_MBR_to_GPT[broken link: invalid section]是很適合的。

Warning: Create the 2MiB partition mentioned above BEFORE you convert to GPT. If you do not, gparted will not resize your boot partition to allow its creation, and when you reboot GRUB2 will not know where to look.


創建並掛載到UEFI系統分割區(Create and Mount the UEFI SYSTEM PARTITION)
注意: 建議先閱讀 UEFI, GPT and Boot loader 頁面

遵循 Unified Extensible Firmware Interface#Create_an_UEFI_System_Partition_in_Linux[broken link: invalid section] 中創建 UEFI SYSTEM PARTITION的指引. 接在將 UEFI SYSTEM PARTITION(也就是ESP分割區) 掛載在 /boot/efi. 如果您已經將 UEFI System Partition 掛載在其他掛載點, 以此掛載點置換在下面指引中的 {ic|/boot/efi}} :

# mkdir -p /boot/efi
# mount -t vfat <UEFISYS_PART_DEVICE> /boot/efi


# mkdir -p /boot/efi/EFI



備份重要資料(Backup Important Data)

雖然 GRUB(2) 的安裝應該會是相當平穩的,仍然強烈建議安裝 grub-bios[broken link: replaced by grub]前保留舊版的 GRUB資料。

# mv /boot/grub /boot/grub-legacy

備份內含啟動碼(boot code)跟分區對映表(partition table)的 MBR (根據您的實際硬碟分割情形,置換 /dev/sdX )

# dd if=/dev/sdX of=/path/to/backup/mbr_backup bs=512 count=1

只有 MBR中的446 位元組包含啟動碼, 接者的 64 位元組包含分區對映表. 如果您不想在將來回存到MBR時覆蓋掉你新設置的分區對映表,強烈建議此時只備份MBR啟動碼就好:

# dd if=/dev/sdX of=/path/to/backup/bootcode_backup bs=446 count=1

如果無法正確安裝 GRUB2 , 參閱 GRUB2#Restore_GRUB_Legacy[broken link: invalid section].

安裝grub-bios套件(Install grub-bios package)

GRUB(2)套件可以用pacman安裝 (安裝完將會取代 grub-legacyAUR or grub):

# pacman -S grub-bios
Note: 僅安裝套件並不會更新 /boot/grub/i386-pc/core.img 檔案和 GRUB(2) 在 /boot/grub/i386-pc的模組. 你必須如下解釋般使用 grub-install來更新他們

安裝grub-bios啟動檔案(Install grub-bios boot files)

要達到BIOS啟動有三種安裝 GRUB(2)方法:

安裝到440位元組MBR啟動區(Install to 440-byte MBR boot code region)

To setup grub-bios in the 440-byte Master Boot Record boot code region, populate the /boot/grub directory, generate the /boot/grub/i386-pc/core.img file, and embed it in the 31 KiB (minimum size - varies depending on partition alignment) post-MBR gap (MBR disks) or in BIOS Boot Partition (GPT disks), run:

# modprobe dm-mod
# grub-install --target=i386-pc --recheck --debug /dev/sda
# mkdir -p /boot/grub/locale
# cp /usr/share/locale/en\@quot/LC_MESSAGES/ /boot/grub/locale/

where /dev/sda is the destination of the installation (in this case the MBR of the first SATA disk). If you use LVM for your /boot, you can install GRUB2 on multiple physical disks.

Note: Without --target or --directory option, grub-install cannot determine for which firmware grub(2) is being installed. In such cases grub-install will show source_dir does not exist. Please specify --target or --directory message.

The --no-floppy tells grub-bios utilities not to search for any floppy devices which reduces the overall execution time of grub-install on many systems (it will also prevent the issue below from occurring). Otherwise you get an error that looks like this:

grub-probe: error: Cannot get the real path of '/dev/fd0'
Auto-detection of a filesystem module failed.
Please specify the module with the option '--modules' explicitly.
Note: --no-floppy has been removed from grub-install in 2.00~beta2 upstream release, and replaced with --allow-floppy.
Warning: Make sure to check the /boot directory if you use the latter. Sometimes the boot-directory parameter creates another /boot folder inside of /boot. A wrong install would look like: /boot/boot/grub/.
Install to Partition or Partitionless Disk
Note: grub-bios (any version - including upstream Bazaar repo) does not encourage installation to a partition boot sector or a partitionless disk like GRUB Legacy or syslinux does. This kind of setup is prone to breakage, especially during updates, and is not supported by Arch devs.

To set up grub-bios to a partition boot sector, to a partitionless disk (also called superfloppy) or to a floppy disk, run (using for example /dev/sdaX as the /boot partition):

# modprobe dm-mod 
# chattr -i /boot/grub/i386-pc/core.img
# grub-install --target=i386-pc --recheck --debug --force /dev/sdaX
# mkdir -p /boot/grub/locale
# cp /usr/share/locale/en@quot/LC_MESSAGES/ /boot/grub/locale/
# chattr +i /boot/grub/i386-pc/core.img

You need to use the --force option to allow usage of blocklists and should not use --grub-setup=/bin/true (which is similar to simply generating core.img).

grub-install will give out warnings like which should give you the idea of what might go wrong with this approach:

/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.

Without --force you may get the below error and grub-setup will not setup its boot code in the partition boot sector:

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

With --force you should get:

Installation finished. No error reported.

The reason why grub-setup does not by default allow this is because in case of partition or a partitionless disk is that grub-bios relies on embedded blocklists in the partition bootsector to locate the /boot/grub/i386-pc/core.img file and the prefix dir /boot/grub. The sector locations of core.img may change whenever the filesystem in the partition is being altered (files copied, deleted etc.). For more info see and

The workaround for this is to set the immutable flag on /boot/grub/i386-pc/core.img (using chattr command as mentioned above) so that the sector locations of the core.img file in the disk is not altered. The immutable flag on /boot/grub/i386-pc/core.img needs to be set only if grub-bios is installed to a partition boot sector or a partitionless disk, not in case of installation to MBR or simple generation of core.img without embedding any bootsector (mentioned above).

單獨產生core.img(Generate core.img alone)

To populate the /boot/grub directory and generate a /boot/grub/i386-pc/core.img file without embedding any grub-bios bootsector code in the MBR, post-MBR region, or the partition bootsector, add --grub-setup=/bin/true to grub-install:

# modprobe dm-mod
# grub-install --target=i386-pc --grub-setup=/bin/true --recheck --debug /dev/sda
# mkdir -p /boot/grub/locale
# cp /usr/share/locale/en@quot/LC_MESSAGES/ /boot/grub/locale/

You can then chainload GRUB2's core.img from GRUB Legacy or syslinux as a Linux kernel or a multiboot kernel.

產生GRUB2 BOIS設置檔案(Generate GRUB2 BIOS Config file)

最後產生一個GRUB2的設定檔 (this is explained in greater detail in the Configuration section):

# grub-mkconfig -o /boot/grub/grub.cfg
注意: 檔案路徑是 /boot/grub/grub.cfg, 不是 /boot/grub/i386-pc/grub.cfg.

如果 grub(2) 在啟動是出現 "no suitable mode found" 訊息, 前往到 #Correct GRUB2 No Suitable Mode Found Error. 如果 grub-mkconfig 失敗了, 使用下列指令將你的 /boot/grub/menu.lst 轉換成 /boot/grub/grub.cfg :

# grub-menulst2cfg /boot/grub/menu.lst /boot/grub/grub.cfg



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
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'

如果你忘了創建 /boot/grub/grub.cfg 這個GRUB2的設定檔,那麼重啟到 GRUB2 選單,按C進入命令列, 輸入:

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

啟動到Archlinux且重新創建正確的 /boot/grub/grub.cfg

注意: 這個選項只有在 BIOS 系統管用, 在 UEFI 系統不行.

在BIOS多重啟動(Multiboot in BIOS)

在BIOS-MBR模式中啟動已安裝的Microsoft Windows(Boot Microsoft Windows installed in BIOS-MBR mode)
注意: GRUB(2) 支援直接啟動 bootmgr檔案和分割區啟動區的連鎖載入 (chainload of partition boot sector),因此不需要BIOS-MBR設定來啟動Windows
警告: 需要注意是具有bootmgr檔案的系統分割區, 而不一定是安裝有Windows的分割區, 也就是說:當你用blkid這個指令顯示出所有UUID's,他將是有著 LABEL="SYSTEM RESERVED" 且大小約為 100 mb-200 mb,更像是Arch的 /boot 分割區. 觀看 wikipedia:System_partition_and_boot_partition for some more info.

找到放置著bootmgr的NTFS格式Windows系統分割區的UUID . 舉例來說, 如果 Windows bootmgr 置放在 /media/Windows/bootmgr:

# grub-probe --target=fs_uuid /media/Windows/bootmgr

然後, 把下面的幾行敘述加到 /etc/grub.d/40_custom/boot/grub/custom.cfg 接者用前述的grub-mkconfig產生 grub.cfg來啟動安裝在BIOS-MBR模式的 Windows (Vista, 7 or 8):

menuentry "Microsoft Windows 7 BIOS-MBR" {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod ntldr     
    search --fs-uuid --no-floppy --set=root 69B235F6749E84CE
    ntldr /bootmgr

For Windows XP:

menuentry "Microsoft Windows XP" {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod ntldr     
    search --fs-uuid --no-floppy --set=root 69B235F6749E84CE
    ntldr /ntldr

UEFI系統(UEFI systems)

Note: 在閱讀這個部份前,建議先閱讀 UEFI, GPT and Boot loader 頁面

安裝grub-uefi套件(Install grub-uefi package)

Note: Unless specified as EFI 1.x , EFI and UEFI terms are used interchangeably to denote UEFI 2.x firmware. Also unless stated explicitely, the instructions are general and not Mac specific. Some of them may not work or may be different in Macs. Apple's EFI implementation is neither a EFI 1.x version nor UEFI 2.x version but mixes up both. This kind of firmware does not fall under any one UEFI Specification version and is therefore not a standard UEFI firmware.

GRUB(2) UEFI bootloader is available in Arch Linux only from version 1.99~rc1. To install, first detect which UEFI firmware arch[broken link: invalid section] you have (either x86_64 or i386).

Depending on that, install the appropriate package

For 64-bit aka x86_64 UEFI firmware:

# pacman -S grub-efi-x86_64

For 32-bit aka i386 UEFI firmware:

# pacman -S grub-efi-i386
Note: Simply installing the package will not update the core.efi file and the GRUB(2) modules in the UEFI System Partition. You need to do this manually using grub-install as explained below.

安裝grub-uefi啟動檔案(Install grub-uefi boot files)

Note: The below commands assume you are using grub-efi-x86_64 (for grub-efi-i386 replace x86_64 with i386 in the below commands).
Note: To do this, you need to boot using UEFI and not the BIOS. If you booted by just copying the ISO file to the USB drive, you will need to follow this guide or grub-install will show errors.

The UEFI system partition will need to be mounted at /boot/efi/ for the GRUB(2) install script to detect it:

# mkdir -p /boot/efi
# mount -t vfat /dev/sdXY /boot/efi

Install GRUB UEFI application to /boot/efi/EFI/arch_grub and its modules to /boot/grub/x86_64-efi (recommended) using:

# modprobe dm-mod
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck --debug
# mkdir -p /boot/grub/locale
# cp /usr/share/locale/en\@quot/LC_MESSAGES/ /boot/grub/locale/
Note: Without --target or --directory option, grub-install cannot determine for which firmware grub(2) is being installed. In such cases grub-install will show source_dir does not exist. Please specify --target or --directory message.

If you want to install grub(2) modules and grub.cfg at the directory /boot/efi/EFI/grub and the grubx64.efi application at /boot/efi/EFI/arch_grub (ie. all the grub(2) uefi files inside the UEFISYS partition itself) use:

# modprobe dm-mod 
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --boot-directory=/boot/efi/EFI --recheck --debug
# mkdir -p /boot/efi/EFI/grub/locale
# cp /usr/share/locale/en\@quot/LC_MESSAGES/ /boot/efi/EFI/grub/locale/

The --efi-directory option mentions the mountpoint of UEFI SYSTEM PARTITION , --bootloader-id mentions the name of the directory used to store the grubx64.efi file and --boot-directory mentions the directory wherein the actual modules will be installed (and into which grub.cfg should be created).

The actual paths are:

<efi-directory>/<EFI or efi>/<bootloader-id>/grubx64.efi
<boot-directory>/grub/x86_64-efi/<all modules, grub.efi, core.efi, grub.cfg>
Note: the --bootloader-id option does not change <boot-directory>/grub, i.e. you cannot install the modules to <boot-directory>/<bootloader-id>, the path is hard-coded to be <boot-directory>/grub.

In --efi-directory=/boot/efi --boot-directory=/boot/efi/EFI --bootloader-id=grub:

<efi-directory>/<EFI or efi>/<bootloader-id> == <boot-directory>/grub == /boot/efi/EFI/grub

In --efi-directory=/boot/efi --boot-directory=/boot/efi/EFI --bootloader-id=arch_grub:

<efi-directory>/<EFI or efi>/<bootloader-id> == /boot/efi/EFI/arch_grub
<boot-directory>/grub == /boot/efi/EFI/grub

In --efi-directory=/boot/efi --boot-directory=/boot --bootloader-id=arch_grub:

<efi-directory>/<EFI or efi>/<bootloader-id> == /boot/efi/EFI/arch_grub
<boot-directory>/grub == /boot/grub

In --efi-directory=/boot/efi --boot-directory=/boot --bootloader-id=grub:

<efi-directory>/<EFI or efi>/<bootloader-id> == /boot/efi/EFI/grub
<boot-directory>/grub == /boot/grub

The <efi-directory>/<EFI or efi>/<bootloader-id>/grubx64.efi is an exact copy of <boot-directory>/grub/x86_64-efi/core.efi.

Note: In GRUB2 2.00~beta4, the grub-install option --efi-directory replaces --root-directory and the latter is deprecated.
Note: The options --efi-directory and --bootloader-id are specific to GRUB(2) UEFI.

In all the cases the UEFI SYSTEM PARTITION should be mounted for grub-install to install grubx64.efi in it, which will be launched by the firmware (using the efibootmgr created boot entry in non-Mac systems).

If you notice carefully, there is no <device_path> option (Eg: /dev/sda) at the end of the grub-install command unlike the case of setting up GRUB(2) for BIOS systems. Any <device_path> provided will be ignored by the install script as UEFI bootloaders do not use MBR or Partition boot sectors at all.

You may now be able to UEFI boot your system by creating a grub.cfg file by following #Generate_GRUB2_UEFI_Config_file[broken link: invalid section] and #Create GRUB2 entry in the Firmware Boot Manager.

Create GRUB2 entry in the Firmware Boot Manager

Non-Mac UEFI systems

grub-install will ensure that /boot/efi/EFI/arch_grub/grubx64.efi is launched by default if it detects efibootmgr and if it is able to access UEFI Runtime Services. Follow Unified Extensible Firmware Interface#efibootmgr for more info.(Before trying these steps, be sure to create a grub.cfg (Grub2#Generate_GRUB2_UEFI_Config_file[broken link: invalid section]) because you will need it to boot into Arch after grub is loaded)

If you have problems running GRUB2 in UEFI mode you can try the following (worked on an ASUS Z68 mainboard):

# cp /boot/efi/EFI/arch_grub/grubx64.efi /boot/efi/shellx64.efi


# cp /boot/efi/EFI/arch_grub/grubx64.efi /boot/efi/EFI/shellx64.efi


# cp /boot/efi/EFI/arch_grub/grubx64.efi /boot/efi/EFI/tools/shellx64.efi

After this launch the UEFI Shell from the UEFI setup/menu (in ASUS UEFI BIOS, switch to advanced mode, press Exit in the top right corner and choose "Launch EFI shell from filesystem device"). The GRUB2 menu will show up and you can boot into your system. Afterwards you can use efibootmgr to setup a menu entry (see above).

If your motherboard has no such option (or even if it does), you can use UEFI shell (Unified Extensible Firmware Interface#UEFI Shell) to create a UEFI boot option for the Arch partition temporarily.

Once you boot into the EFI shell, add a UEFI boot menu entry:

Shell> bcfg boot add 0 fs1:\EFI\arch_grub\grubx64.efi "Arch Linux (GRUB2)"

where fs1 is the mapping corresponding to the UEFI System Partition and \EFI\arch_grub\grubx64.efi is the the from the --bootloader-id from the grub-install command above.

This will temporarily add a UEFI boot option for the next boot to get into Arch.

Once in Arch, modprobe efivars and confirm that efibootmgr creates no errors (no errors meaning you successfully booted in UEFI mode).

Then Grub2#Install_to_UEFI_SYSTEM_PARTITION[broken link: invalid section] can be performed again and should successfully permanently add a boot entry in the UEFI menu.

Apple Mac EFI systems
Note: TODO: GRUB upstream Bazaar mactel branch[dead link 2020-08-02 ⓘ]. No further update from grub developers.
Note: TODO: Experimental "bless" utility for Linux by Fedora developers - mactel-bootAUR. Requires more testing.

Use bless command from within Mac OS X to set grubx64.efi as the default boot option. You can also boot from the Mac OS X install disc and launch a Terminal there if you only have Linux installed. In the Terminal, create a directory and mount the EFI System Partition:

# cd /Volumes
# mkdir efi
# mount -t msdos /dev/disk0s1 /Volumes/efi

Then run bless on grub.efi and on the EFI partition to set them as the default boot options.

# bless --folder=/Volumes/efi --file=/Volumes/efi/efi/arch_grub/grubx64.efi --setBoot
# bless --mount=/Volumes/efi --file=/Volumes/efi/efi/arch_grub/grubx64.efi --setBoot

More info at

產生GRUB2 UEFI設置檔案(Generate GRUB2 UEFI Config file)

Finally, generate a configuration for GRUB(2) (this is explained in greater detail in the Configuration section):

# grub-mkconfig -o <boot-directory>/grub/grub.cfg
Note: The file path is <boot-directory>/grub/grub.cfg, NOT <boot-directory>/grub/x86_64-efi/grub.cfg.

If you used --boot-directory=/boot:

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

If you used --boot-directory=/boot/efi/EFI:

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

This is independent of the value of --bootloader-id option.

If GRUB2 complains about "no suitable mode found" while booting, try #Correct GRUB2 No Suitable Mode Found Error.

Create GRUB2 Standalone UEFI Application

It is possible to create a grubx64_standalone.efi application which has all the modules embeddded in a memdisk within the uefi application, thus removing the need for having a separate directory populated with all the GRUB2 uefi modules and other related files. This is done using the grub-mkstandalone command which is included in grub-common[broken link: replaced by grub] >= 1:1.99-6 package.

The easiest way to do this would be with the install command already mentioned before, but specifying the modules to include. For example:

# grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi/" --format="x86_64-efi" --compression="xz" \
--output="/boot/efi/EFI/arch_grub/grubx64_standalone.efi" <any extra files you want to include>

The grubx64_standalone.efi file expects grub.cfg to be within its $prefix which is (memdisk)/boot/grub. The memdisk is embedded within the efi app. The grub-mkstandlone script allow passing files to be included in the memdisk image to be as the arguments to the script (in <any extra files you want to include>).

If you have the grub.cfg at /home/user/Desktop/grub.cfg, then create a temporary /home/user/Desktop/boot/grub/ directory, copy the /home/user/Desktop/grub.cfg to /home/user/Desktop/boot/grub/grub.cfg, cd into /home/user/Desktop/boot/grub/ and run:

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

The reason to cd into /home/user/Desktop/boot/grub/ and to pass the file path as boot/grub/grub.cfg (notice the lack of a leading slash - boot/ vs /boot/ ) is because dir1/dir2/file is included as (memdisk)/dir1/dir2/file by the grub-mkstandalone script.

If you pass /home/user/Desktop/grub.cfg the file will be included as (memdisk)/home/user/Desktop/grub.cfg. If you pass /home/user/Desktop/boot/grub/grub.cfg the file will be included as (memdisk)/home/user/Desktop/boot/grub/grub.cfg. That is the reason for cd'ing into /home/user/Desktop/boot/grub/ and passing boot/grub/grub.cfg, to include the file as (memdisk)/boot/grub/grub.cfg, which is what grub.efi expects the file to be.

You need to create an UEFI Boot Manager entry for /boot/efi/EFI/arch_grub/grubx64_standalone.efi using efibootmgr. Follow #Create GRUB2 entry in the Firmware Boot Manager.

Multiboot in UEFI

Chainload Microsoft Windows x86_64 UEFI-GPT

Find the UUID of the FAT32 filesystem in the UEFI SYSTEM PARTITION where the Windows UEFI Bootloader files reside. For example, if Windows bootmgfw.efi exists at /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi (ignore the upper-lower case differences since that is immaterial in FAT filesystem):

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

Then, add this code to /boot/grub/grub.cfg OR /boot/efi/EFI/grub/grub.cfg to chainload Windows x86_64 (Vista SP1+, 7 or 8) installed in UEFI-GPT mode:

menuentry "Microsoft Windows x86_64 UEFI-GPT" {
    insmod part_gpt
    insmod fat
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --no-floppy --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 1ce5-7f28
    chainloader /efi/Microsoft/Boot/bootmgfw.efi


你可以選擇自動產生或手動編輯 grub.cfg.

注意: 對 EFI 系統, 如果 GRUB2 是以 --boot-directory 參數安裝, grub.cfg 檔案將被放在跟 grubx64.efi相同的路徑. 否則, grub.cfg 這檔案將會放在 /boot/grub/, 這點跟 GRUB2的BIOS版本是一樣的.

使用grub-mkconfig自動產生(Automatically generating using grub-mkconfig) (Recommended)

在 GRUB2中/etc/default/grub/etc/grub.d/*,與舊版的GRUB的 menu.lst 有相似的設置效果, grub-mkconfig 預設利用這些檔案產生標準的grub.cfg輸出. 產生 grub.cfg 檔案可以執行指令:

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

/etc/grub.d/10_linux is set to automatically add menu items for Arch linux that work out of the box, to any generated configuration. 其他的作業系統也許需要手動配置到 /etc/grub.d/40_custom/boot/grub/custom.cfg

Additional arguments

To pass custom additional arguments to the Linux image, you can set the GRUB_CMDLINE_LINUX variable in /etc/default/grub. This is analogous to adding commands to the kernel line in GRUB Legacy.

For example, use GRUB_CMDLINE_LINUX="resume=/dev/sdaX" where sdaX is your swap partition to enable resume after hibernation.

You can also use GRUB_CMDLINE_LINUX="resume=/dev/disk/by-uuid/${swap_uuid}", where ${swap_uuid} is the UUID of your swap partition.

Users who have replaced the default SysV init with systemd will want to add init=/bin/systemd to their GRUB_CMDLINE_LINUX.

Multiple entries are separated by spaces within the double quotes. So, for users who want both resume and systemd it would look like this: GRUB_CMDLINE_LINUX="resume=/dev/sdaX init=/bin/systemd"

手動創建grub.cfg( Manually creating grub.cfg)

警告: 直接對這個檔案進行編輯是不建議的事.這個檔案是用 grub-mkconfig 產生,所以最好是編輯你的 /etc/default/grub 或其他在 /etc/grub.d 資料夾的script.

一個基本的 GRUB 設置檔使用下列的選項

  • (hdX,Y) 意味在硬碟X中的分割區 Y , 分割區的編號從1開始,硬碟編號從0開始。
  • set default=N is the default boot entry that is chosen after timeout for user action
  • set timeout=M 意謂用 M秒鐘的時間等待使用者動作,否則啟動預設選項。
  • menuentry "title" {entry options} 是啟動項目名稱 title
  • set root=(hdX,Y) 設置啟動分割區, 此分割區應有核心和GRUB模組 (boot need not be a separate partition, and may simply be a directory under the "root" partition (/)


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

#  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


注意: 如果你希望 GRUB2 自動尋找其他的作業系統(舉例來說,像是ubuntu).那麼你可能需要從AUR下載並安裝 os-prober

使用 grub-mkconfig

想增加其他啟動項目,最好的方法是編輯 /etc/grub.d/40_custom或{ic|/boot/grub/custom.cfg}} . 如此一來,項目將在你執行 grub-mkconfig後自動加入。 加入新的內容,執行

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

以產生一個新的 grub.cfg和grub選單。

與 GNU/Linux

假設其他的 distro 在分割區 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

Requires that FreeBSD is installed on a single partition with UFS. 假如安裝在sda4:

menuentry "FreeBSD" {
set root=(hd0,4)
chainloader +1
與 Windows

假設你的 Windows 分割區是 sda3Remember you need to point set root and chainloader to the system reserve partition that windows made when it installed, not the actual partition windows is on..在{{ic|/etc/grub.d/40_custom})加入

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


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

以產生一個新的 grub.cfg和grub選單。

If the Windows bootloader is on an entirely different hard drive than GRUB, it may be necessary to trick Windows into believing that it is the first hard drive. This was possible in GRUB Legacy with map and is now done with drivemap. Assuming GRUB is on hd0 and Windows is on hd2, you need to add the following after set root:

drivemap -s hd0 hd2

With Windows via EasyBCD and NeoGRUB

Since EasyBCD's NeoGRUB currently does not understand the GRUB2 menu format, chainload to it by replacing the contents of your C:\NST\menu.lst file with lines similar to the following:

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

Visual Configuration

In GRUB2 it is possible, by default, to change the look of the menu. Make sure to initialize, if not done already, GRUB2 graphical terminal, gfxterm, with proper video mode, gfxmode, in GRUB2. This can be seen in the section #Correct GRUB2 No Suitable Mode Found Error. This video mode is passed by GRUB2 to the linux kernel via 'gfxpayload' so any visual configurations need this mode in order to be in effect.

Setting the framebuffer resolution

GRUB2 can set the framebuffer for both GRUB2 itself and the kernel. The old vga= way is deprecated. The preferred method is editing /etc/default/grub as the following sample:


套用改變, 執行:

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

The gfxpayload property will make sure the kernel keeps the resolution.

注意: 如果這個例子對你以vbemode="0x105"置換gfxmode="1024x768x32"沒有成功. Remember to replace the specified resolution with one suitable for your screen.
注意: 你可以使用 # hwinfo --framebuffer來顯示出所有的模式 (hwinfo is available in [community]), while at GRUB2 prompt you can use the vbeinfo command.

If this method does not work for you, the deprecated vga= method will still work. Just add it next to the "GRUB_CMDLINE_LINUX_DEFAULT=" line in /etc/default/grub for eg: "GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792" will give you a 1024x768 resolution.

You can choose one of these resolutions: 640×480, 800×600, 1024×768, 1280×1024,1600×1200, 1920×1200

915resolution hack

Some times for Intel graphic adapters neither # hwinfo --framebuffer nor vbeinfo will show you the desired resolution. In this case you can use 915resolution hack. This hack will temporarily modify video BIOS and add needed resolution. See 915resolution's home page

In the following I will proceed with the example for my system. Please adjust the recipe for your needs. First you need to find a video mode which will be modified later. For that, run 915resolution in GRUB2 command shell:

915resolution -l

The output will be something like:

Intel 800/900 Series VBIOS Hack : version 0.5.3
Mode 30 : 640x480, 8 bits/pixel

Next, our purpose is to overwrite mode 30. (You can choose what ever mode you want.) In the file /etc/grub.d/00_header just before the set gfxmode=${GRUB_GFXMODE} line insert:

915resolution 30 1440 900

Here we are overwriting the mode 30 with 1440x900 resolution. Lastly we need to set GRUB_GFXMODE as described earlier, regenerate GRUB2 configuration file and reboot to test changes:

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

背景圖片和字體(Background image and bitmap fonts)

GRUB2 comes with support for background images and bitmap fonts in pf2 format. The unifont font is included in the grub-common[broken link: replaced by grub] package under the filename unicode.pf2, or, as only ASCII characters under the name ascii.pf2.

圖像支援格式有 tga, png and jpeg. 解析度最大支援取決於您的硬體.

Make sure you have set up the proper framebuffer resolution[broken link: invalid section].

編輯 /etc/default/grub :

注意: 如果你將GRUB裝在分開的分割區, /boot/grub/myimage 會變成 /grub/myimage.

套用改變且將新資訊加到 grub.cfg, 執行:

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

如果成功加入背景圖, 使用者將在終端機看到 "Found background image..." . 如果沒看到這段敘述, 圖像資訊可能沒有成功加到 grub.cfg 裡.

如果圖片沒有顯示, 進行確認:

  • /etc/default/grub的圖片路徑跟檔名都是正確的.
  • 圖片的格式跟大小是正確的 (tga, png, 8-bit jpg).
  • The image was saved in the RGB mode, and is not indexed.
  • console mode 沒有啟用在 /etc/default/grub裡.
  • grub-mkconfig 確實執行並將背景圖片資訊放到 /boot/grub/grub.cfg 裡.


Here is an example for configuring Starfield theme which was included in GRUB2 package.

Edit /etc/default/grub


Generate the changes:

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

如果主題設定成功, 您將會在終端機看到 Found theme: /usr/share/grub/themes/starfield/theme.txt 使用主題時,你原先設定的 splash image 將不會被顯示出來

選單顏色(Menu colors)

如同 GRUB 舊版 (0.9x), 在 GRUB2你可以更改選單顏色. 目前可用的顏色 GRUB2 參照 這裡有個範例:

編輯 /etc/default/grub:



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

隱藏選單(Hidden menu)

One of the unique features of GRUB2 is hiding/skipping the menu and showing it by holding Esc when needed. You can also adjust whether you want to see the timeout counter.

Edit /etc/default/grub as you wish. Here is an example where the comments from the beginning of the two lines have been removed to enable the feature, the timeout has been set to five seconds and to be shown to the user:



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

關閉幀緩衝(Disable framebuffer)

Users who use NVIDIA proprietary driver might wish to disable GRUB2's framebuffer as it can cause problems with the binary driver.

要關閉幀緩衝, 編輯 /etc/default/grub 並將下行取消註解:



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

其他選項(Other Options)


If you use LVM for your /boot, add the following before menuentry lines:

insmod lvm

and specify your root in the menuentry as:

set root=(lvm_group_name-lvm_logical_boot_partition_name)


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


GRUB2 provides convenient handling of RAID volumes. You need to add insmod raid which allows you to address the volume natively. For example, /dev/md0 becomes:

set root=(md0)

whereas a partitioned RAID volume (e.g. /dev/md0p1) becomes:

set root=(md0,1)

Persistent block device naming

You can use UUIDs to detect partitions instead of the "old" /dev/sd* and /dev/hd* scheming. It has the advantage of detecting partitions by their unique UUIDs, which is needed by some people booting with complicated partition setups.

UUIDs are used by default in the recent versions of GRUB2 - there is no downside in it anyway except that you need to re-generate the grub.cfg file every time you resize or reformat your partitions. Remember this when modifying partitions with Live-CD.

Recent versions of GRUB2 use UUIDs by default. You can enable the use of UUIDs by simply commenting the UUID line (which is the default):


Or you can uncomment it and set the value to false:


Either way, do not forget to generate the changes:

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

Using Labels

It is possible to use labels, human-readable strings attached to filesystems, by using the --label option to search. First of all, label your existing partition:

# tune2fs -L a <LABEL> <PARTITION>

Then, add an entry using labels. An example of this:

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

Recall previous entry

GRUB2 can remember the last entry you booted from and use this as the default entry to boot from next time. This is useful if you have multiple kernels (i.e., the current Arch one and the LTS kernel as a fallback option) or operating systems. To do this, edit /etc/default/grub and change the setting of GRUB_DEFAULT:


This ensures that GRUB will default to the saved entry. To enable saving the selected entry, add the following line to /etc/default/grub:

Note: Manually added menu items, eg Windows in /etc/grub.d/40_custom or /boot/grub/custom.cfg , will need savedefault added. Remember to regenerate your configuration file.


如果你想增加 GRUB2的安全性,使其他人不能改變啟動參數跟使用命令列,你可以加上一個 user/password 組合到 GRUB2的設置檔案. 如果像這樣做的話, 執行指令 grub-mkpasswd-pbkdf2. 輸入密碼且確認它. 螢幕輸入將會像是這樣:

Your PBKDF2 is grub.pbkdf2.sha512.10000.C8ABD3E93C4DFC83138B0C7A3D719BC650E6234310DA069E6FDB0DD4156313DA3D0D9BFFC2846C21D5A2DDA515114CF6378F8A064C94198D0618E70D23717E82.509BFA8A4217EAD0B33C87432524C0B6B64B34FBAD22D3E6E6874D9B101996C5F98AB1746FE7C7199147ECF4ABD8661C222EEEDB7D14A843261FFF2C07B1269A

Then, add the following to /etc/grub.d/00_header:

cat << EOF

set superusers="username"
password_pbkdf2 username <password>


這裡的 <password> 是由 grub-mkpasswd_pbkdf2產生的字串.

再次產生你的設置檔案, 您的 GRUB2 命令列, 啟動參數和所有的啟動項目都將被保護。

This can be relaxed and further customized with more users as described in the "Security" part of the GRUB manual.

Root Encryption

To let GRUB2 automatically add the kernel parameters for root encryption, add cryptdevice=/dev/yourdevice:label to GRUB_CMDLINE_LINUX in /etc/default/grub.

Example with root mapped to /dev/mapper/root:


Also, disable the usage of UUIDs for the rootfs:


Regenerate the configuration.

在GRUB2啟動(ISOBooting an ISO Directly From GRUB2)

編輯 /etc/grub.d/40_custom/boot/grub/custom.cfg 為目標ISO增加項目。完成後grub-mkconfig -o /boot/grub/grub.cfg (as root)更新選單。

Arch ISO

注意: 一定要調整第3行的 hdX,Y ,才能指向ISO檔正確所在的硬碟/分割區。 同時調整 img_dev 行來對應到相同的位置。 像是, 如果電腦裡已有一個內置硬碟,此時想從隨身碟開啟ISO檔,那麼用sdbY取代 sdaY.
menuentry "Archlinux-2011.08.19-netinstall-x86_64.iso" {
    set isofile="/archives/archlinux-2011.08.19-netinstall-x86_64.iso"
    loopback loop (hd0,7)$isofile
    linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201108 img_dev=/dev/sda7 img_loop=$isofile earlymodules=loop
    initrd (loop)/arch/boot/x86_64/archiso.img
menuentry "Archlinux-2012.07.15-netinstall-dual.iso" {
    set isofile="/archives/archlinux-2012.07.15-netinstall-dual.iso"
    loopback loop (hd0,7)$isofile
    linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201207 img_dev=/dev/sda7 img_loop=$isofile
    initrd (loop)/arch/boot/x86_64/archiso.img
Tip: For thumbdrives, use Persistent block device names for the "img_dev" kernel parameter. Ex: img_dev=/dev/disk/by-label/CORSAIR

Ubuntu ISO

注意: 一定要調整第3行的 hdX,Y ,才能指向ISO檔正確所在的硬碟/分割區。 同時調整 img_dev 行來對應到相同的位置。
menuentry "ubuntu-12.04-desktop-amd64.iso" {
    set isofile="/path/to/ubuntu-12.04-desktop-amd64.iso"
    loopback loop (hdX,Y)$isofile
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash --
    initrd (loop)/casper/initrd.lz

Using the command shell

Since the MBR is too small to store all GRUB2 modules, only the menu and a few basic commands reside there. The majority of GRUB2 functionality remains in modules in /boot/grub, which are inserted as needed. In error conditions (e.g. if the partition layout changes) GRUB2 may fail to boot. When this happens, a command shell may appear.

GRUB2 offers multiple shells/prompts. If there is a problem reading the menu but the bootloader is able to find the disk, you will likely be dropped to the "normal" shell:


If there is a more serious problem (e.g. GRUB cannot find required files), you may instead be dropped to the "rescue" shell:

grub rescue>

The rescue shell is a restricted subset of the normal shell, offering much less functionality. If dumped to the rescue shell, first try inserting the "normal" module, then starting the "normal" shell:

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

Pager support

GRUB2 supports pager for reading commands that provide long output (like the help command). This works only in normal shell mode and not in rescue mode. To enable pager, in GRUB2 command shell type:

sh:grub> set pager=1

GUI configuration tools

Following package may be installed from AUR

  • grub-customizerAUR[broken link: package not found] (requires gettext gksu gtkmm hicolor-icon-theme openssl)
    Customize the bootloader (GRUB2 or BURG)
  • grub2-editor (requires kdelibs)
    A KDE4 control module for configuring the GRUB2 bootloader
  • kcm-grub2 (requires kdelibs python2-qt kdebindings-python)
    This Kcm module manages the most common settings of Grub2.
  • startupmanager (requires gnome-python imagemagick yelp python2 xorg-xrandr)
    GUI app for changing the settings of GRUB, GRUB2, Usplash and Splashy

parttool or legacy hide/unhide

If you have a Windows 9x paradigm with hidden C:\ disks GRUB Legacy had the hide/unhide feature. In GRUB2 this has been replaced by parttool. For example, to boot the third C:\ disk of three Windows 9x installations on the CLI enter the CLI and:

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

Using the rescue console

See #Using the command shell first. If unable to activate the standard shell, one possible solution is to boot using a live CD or some other rescue disk to correct configuration errors and reinstall GRUB. However, such a boot disk is not always available (nor necessary); the rescue console is surprisingly robust.

The available commands in GRUB rescue include insmod, ls, set, and unset. This example uses set and insmod. set modifies variables and insmod inserts new modules to add functionality.

Before starting, the user must know the location of their /boot partition (be it a separate partition, or a subdirectory under their root):

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

where X is the physical drive number and Y is the partition number.

To expand console capabilities, insert the linux module:

grub rescue> insmod (hdX,Y)/boot/grub/linux.mod
Note: With a separate boot partition, omit /boot from the path, (i.e. type set prefix=(hdX,Y)/grub and insmod (hdX,Y)/grub/linux.mod).

This introduces the linux and initrd commands, which should be familiar (see #Configuration[broken link: invalid section]).

An example, booting Arch Linux:

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

With a separate boot partition, again change the lines accordingly:

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

After successfully booting the Arch Linux installation, users can correct grub.cfg as needed and then reinstall GRUB2.

to reinstall GRUB2 and fix the problem completely, changing /dev/sda if needed. See #Bootloader installation[broken link: invalid section] for details.

Combining the use of UUIDs and basic scripting

If you like the idea of using UUIDs to avoid unreliable BIOS mappings or are struggling with GRUB's syntax, here is an example boot menu item that uses UUIDs and a small script to direct GRUB to the proper disk partitions for your system. All you need to do is replace the UUIDs in the sample with the correct UUIDs for your system. The example applies to a system with a boot and root partition. You will obviously need to modify the GRUB configuration if you have additional partitions:

 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 --no-floppy --set=root $the_root_uuid
     search --fs-uuid --no-floppy --set=grub_boot $the_boot_uuid
     # 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
     # $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/$uuid_os_root ro
     initrd ($grub_boot)/initramfs-linux.img


Any troubleshooting should be added here.

Enable GRUB2 debug messages


set pager=1
set debug=all

to grub.cfg.

Correct GRUB2 No Suitable Mode Found Error

If you get this error when booting any menuentry:

error: no suitable mode found
Booting however

Then you need to initialize GRUB2 graphical terminal (gfxterm) with proper video mode (gfxmode) in GRUB2. This video mode is passed by GRUB2 to the linux kernel via 'gfxpayload'. In case of UEFI systems, if the GRUB2 video mode is not initialized, no kernel boot messages will be shown in the terminal (atleast until KMS kicks in).

Copy /usr/share/grub/unicode.pf2 to ${GRUB2_PREFIX_DIR} (/boot/grub/ in case of BIOS and UEFI systems). If GRUB2 UEFI was installed with --boot-directory=/boot/efi/EFI set, then the directory is /boot/efi/EFI/grub/:

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

If /usr/share/grub/unicode.pf2 does not exist, install bdf-unifont, create the unifont.pf2 file and then copy it to ${GRUB2_PREFIX_DIR}:

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

Then, in the grub.cfg file, add the following lines to enable GRUB2 to pass the video mode correctly to the kernel, without of which you will only get a black screen (no output) but booting (actually) proceeds successfully without any system hang.

BIOS systems:

insmod vbe

UEFI systems:

insmod efi_gop
insmod efi_uga

After that add the following code (common to both BIOS and UEFI):

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

As you can see for gfxterm (graphical terminal) to function properly, unicode.pf2 font file should exist in ${GRUB2_PREFIX_DIR}.

msdos-style error message

grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding won't 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.

This error may occur when you try installing GRUB2 in a VMware container. Read more about it here. It happens when the first partition starts just after the MBR (block 63), without the usual space of 1 MiB (2048 blocks) before the first partition. Read #MBR aka msdos partitioning specific instructions

UEFI GRUB2 drops to shell

If GRUB loads but drops you into the rescue shell with no errors, it may be because of a missing or misplaced grub.cfg. This will happen if GRUB2 UEFI was installed with --boot-directory and grub.cfg is missing OR if the partition number of the boot partition changed (which is hard-coded into the grubx64.efi file).

UEFI GRUB2 not loaded

In some cases the EFI may fail to load GRUB correctly. Provided everything is set up correctly, the output of:

efibootmgr -v

might look something like this:

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

If everything works correctly, the EFI would now automatically load GRUB.

If the screen only goes black for a second and the next boot option is tried afterwards, according to this post, moving GRUB to the partition root can help. The boot option has to be deleted and recreated afterwards. The entry for GRUB should look like this then:

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

Invalid signature

If trying to boot Windows results in an "invalid signature" error, e.g. after reconfiguring partitions or adding additional hard drives, (re)move GRUB's device configuration and let it reconfigure:

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

grub-mkconfig should now mention all found boot options, including Windows. If it works, remove /boot/grub/

Restore GRUB Legacy

  • 將 GRUB2 檔案先移除:
# mv /boot/grub /boot/grub.nonfunctional
  • 把舊版GRUB( GRUB Legacy )放回 /boot:
# cp -af /boot/grub-legacy /boot/grub
  • 將sda的MBR加上後面62個sectors的區塊用備份好的資料取代
注意: 這指令同時也回存舊的分割區對應表(partition table),這可能會弄亂你的系統
# dd if=/path/to/backup/first-sectors of=/dev/sdX bs=512 count=1


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


  1. Official GRUB2 Manual -
  2. Ubuntu wiki page for GRUB2 -
  3. GRUB2 wiki page describing steps to compile for UEFI systems -
  4. Wikipedia's page on BIOS Boot partition

外部連結(External Links)

  1. A Linux Bash Shell script to compile and install GRUB(2) for BIOS from BZR Source
  2. A Linux Bash Shell script to compile and install GRUB(2) for UEFI from BZR Source