GRUB 1 is a legacy version of GRUB that is no longer supported. The last version made available was 0.97 in 2008. GRUB 2 should be used for newer Linux distributions.


Install GRUB to the primary drive. This will use the MSDOS partition scheme on the first 512 bytes as GPT was not supported until GRUB 2.

$ sudo grub-install --root-directory=/ /dev/<DEVICE>

A basic boot menu must be configured to specify the boot partition, the kernel to use, the root partition to mount, and the initrd/initramfs to load.

File: /boot/grub/menu.lst

root   (hd0,0)
kernel /vmlinuz-linux root=/dev/sda2 ro
initrd /initramfs-linux.img



When GRUB fails to boot, or if the boot settings need to be modified, the GRUB recovery shell can be used.

Common options:

  • help = Show help messages.

  • cat = View the contents of a file.

  • find = View the contents of a file or locate a specific file.

  • dhcp = Obtain an IP address from DHCP.

  • ifconfig = Manually configure IP addressing.

  • tftpserver = Specify a TFTP server to PXE boot from.

  • module = Load a GRUB module.

  • root hd(X,Y) = Specify the root drive X and partition Y (the partition starts at “0” in GRUB 1 and “1” in GRUB 2). Use the “Tab” key on the keyboard to auto-complete if the partitions are unknown.

  • boot = Boot the operating system.

  • halt = Turn the computer off.

  • reboot = Reboot the computer

Example of manually booting a server:

grub> root hd(0,0)
grub> kernel /vmzlinuz-4.0.img root=/dev/sda2 ro
grub> initrd /initramfs-4.0.img
grub> boot



GRUB stands for the GRand Unified Bootloader. It was designed to be cross platform compatible with most operating systems including BSD, Linux, and Windows variants. [7]


GRUB must be installed onto the start of the entire drive, not a partition, to avoid issues in the case of partitions needing to be modified. The first 512 bytes of a drive are used for the Master Boot Record (MBR). If you are using a GPT partition then it uses the first 2048 bytes. GRUB will add it’s own data right after that. It is usually a safe and recommended option to create your first partition 1MB after the start of the drive, especially if GPT is in use.

Install the GRUB 2 packages:

  • Arch Linux:

    $ pacman -S efibootmgr efivar grub os-prober
  • Debian:

    $ apt-get install efibootmgr grub-common grub-efi-amd64-bin grub-efi-amd64-signed grub-gfxpayload-lists grub-pc grub-pc-bin libefiboot1 libefivar1 os-prober shim shim-signed
  • Fedora:

    $ dnf install efibootmgr efi-filesystem grub2-common grub2-efi-x64 grub2-pc grub2-tools grub2-tools-efi grub2-tools-extra grub2-tools-minimal grubby os-prober shim-x64

Install GRUB to a drive (replace “X”) and then generate a boot menu configuration file. This will create the menu file that loads up to the end-user upon boot.

$ sudo grub-install /dev/sdX
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

If any changes are made to GRUB’s settings and/or it’s various scripts, run this command to update the changes. [3]

$ sudo update-grub

Common “grub-install” options:

  • compress = Compress GRUB-related files. Valid options are:

    • no (default), xz, gz, lzo

  • –modules = List kernel modules that are required for boot. Depending on the end-user’s setup, “lvm”, “raid” (for mdadm), and/or “encrypt” (for LUKS) may be required.

  • –force = Install despite any warnings.

  • –recheck = Remove the original /boot/grub/ file (if it exists) and then review the current mapping of partitions.

  • –boot-directory = The directory that the “grub/” folder should exist in. This is typically “/boot”. [4]


Important files:




Default GRUB settings.


A folder with various scripts that make up the grub.cfg. Scripts prefixed with lower numbers are executed first.


This is automatically generated using the settings from /etc/default/grub and the scripts in /etc/grub.d/ . Manual changes may get overwritten.

Common options:

  • /etc/default/grub

    • GRUB_DEFAULT = The default menu entry to autoboot into.

      • saved = Boot from the last option selected. This is cached in the /boot/grub/grubenv file.

      • Alternatively, this can either be the number of the “menuentry” section, in order from top to bottom, starting at “0”.

      • Or the menu entry title can be explicitly specified. For example, “CentOS Linux (3.10.0-327.13.1.el7.x86_64) 7 (Core)”.

$ sudo grep ^menuentry /boot/grub2/grub.cfg
menuentry 'CentOS Linux (3.10.0-327.18.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.18.2.el7.x86_64-advanced-d2e5b723-0055-4157-9197-e7d715937e8b' {
menuentry 'CentOS Linux (3.10.0-327.13.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.13.1.el7.x86_64-advanced-d2e5b723-0055-4157-9197-e7d715937e8b' {
  • GRUB_TIMEOUT = Set the timeout (in seconds) before booting into the default menu entry.

  • GRUB_CMDLINE_LINUX = Append kernel options to the end of the “linux” line. These can later be seen in the operating system in /proc/cmdline. This applies to both the normal and recovery mode options.

  • GRUB_CMDLINE_LINUX_DEFAULT = The same as the above setting except this option does not affect the recovery kernel options.

  • GRUB_DISABLE_LINUX_UUID = If set to “true”, devices from /dev/ will be used for specifying the root instead of the UUID. The default is “false” which will use UUIDs.

  • GRUB_BACKGROUND = Specify the full path to a custom image for GRUB’s menu background.


  • GRUB_PRELOAD_MODULES = Default: part_gpt part_msdos. Additional GRUB modules to load. These may be required for special file systems or boot configurations. [12]

    • View all of the UEFI GRUB modules:

      $ ls -1 /boot/grub/x86_64-efi/*.mod
    • View all of the legacy BIOS boot GRUB modules:

      $ ls -1 /boot/grub/i386-pc/*.mod


These are examples configurations for /etc/default/grub. Use grub-mkconfig -o /boot/grub/grub.cfg to load up the new configurations.

  • Do not show the GRUB menu on boot:

  • Show the consolidated GRUB menu on boot:

  • Show everything on the main GRUB menu page on boot:

  • Save the selected boot kernel as the default for the next boot:



  • Support for booting off of any file systems:

    GRUB_PRELOAD_MODULES="part_gpt part_msdos affs afs bfs btrfs cbfs ext2 fat fshelp geli hfs hfspluscomp hfsplus http iso9660 luks macbless memdisk minix nilfs2 ntfscomp ntfs pxe reiserfs scsi sfs squash4 tftp usf1_be ufs1 ufs2 xfs zfscrypt zfsinfo zfs"
  • Support for booting more than one operating system:

    GRUB_PRELOAD_MODULES="part_gpt part_msdos multiboot2"
  • Support for compression (required by some file systems):

    GRUB_PRELOAD_MODULES="part_gpt part_msdos hfspluscomp lzopio ntfscomp zstd zxio"



In cases where GRUB fails (because it was installed incorrectly), the end-user is automatically switched into GRUB’s rescue shell.

Common options:

  • insmod = Load kernel modules.

  • ls = List partitions and file systems within them.

  • cat = View file contents.

  • set = Set a boot option.

  • unset = Remove a boot option.

  • boot = Attempt to boot again.

  • halt = Shutdown the computer.

  • reboot = Restart the computer.

The rescue prompt will look similar to this.

grub rescue>

Example of using these commands to do a custom rescue boot.

grub rescue> ls
(hd0) (hd0,msdos1)
grub rescue> ls (hd0,1)/boot/
grub rescue> set root=(hd0,1)
grub rescue> linux /boot/vmlinuz root=/dev/sda1
grub rescue> initrd /boot/initramfs-linux.img
grub rescue> boot

Alternatively, you can switch back to the graphical GRUB menu and make changes there.

grub rescue> insmod normal
grub rescue> normal

For recovering from a corrupt GRUB installation, fully change root into the environment from a live CD, USB, or PXE network boot. Then you can modify configuration files and re-install GRUB using the same commands used during the installation.

In this example, /dev/sda2 is the root partition and /dev/sda1 is the boot partition. [6]

$ sudo mount /dev/sda2 /mnt
$ sudo mount /dev/sda1 /mnt/boot
$ sudo mount --bind /dev /mnt/dev
$ sudo mount -t proc proc /mnt/proc
$ sudo mount --bind /run /mnt/run
$ sudo mount -t sysfs sys /mnt/sys
$ chroot /mnt
$ /bin/bash
$ export PATH="$PATH:/sbin:/bin"

If you need to recover GRUB from a chroot that is based on a LVM on the host node, make sure that LVM tools are installed on the guest. This way it can properly see the logical volume as a block device.


$ sudo apt-get install lvm2


$ sudo yum install lvm2

USB Installation with Both Legacy BIOS and UEFI Support

Linux can be installed onto a portable storage device that can boot on both legacy BIOS computers and newer UEFI computers. UEFI requires a GPT partition table which means a legacy MBR partition scheme will not work.

  • GPT partitions:

    1. BIOS GRUB boot partition. This extra space provides more room for GRUB to store its boot and partition table data.

    • Size: 1 MiB.

    • File system: none.

    • Partition flag: bios_grub.

    • Mount point: none.

    1. EFI partition. This stores the UEFI firmware.

    • Size: >= 200 MiB.

    • File system: FAT32.

    • Partition flags: boot and esp.

    • Mount point: /boot/efi/.

    1. Linux boot partition. This stores the Linux kernel and boot configuration files (optional).

    • Size: 1 GiB.

    • File system: ext4.

    • Partition flags: none.

    • Mount point: /boot/.

  • GRUB requirements:

    1. Install GRUB to the UEFI partition mount. Use the --removable option to set a default UEFI firmware at /boot/efi/EFI/BOOT/BOOTX64.efi. This assumes that only one operating system will be installed on the storage device. [9]

    2. Install GRUB to the block device (not a partition) that will be used for legacy BIOS boot.

    3. Regenerate the GRUB configuration file.

Example partition layout:

Number  Start   End  Size    File system     Name    Flags
 1   1049kB  2097kB  1049kB                  primary  bios_grub
 2   2097kB  500MB   498MB   fat32           primary  boot, esp
 3   500MB   8500MB  8000MB  linux-swap(v1)  primary  swap
 4   8500MB  128GB   120GB   btrfs           primary

Arch Linux and Debian:

$ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=<OPERATING_SYSTEM_NAME> --removable
$ sudo grub-install --target=i386-pc /dev/<DEVICE>
$ sudo grub-mkconfig -o /boot/grub/grub.cfg


$ sudo grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=<OPERATING_SYSTEM_NAME> --removable
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
$ sudo grub2-install --target=i386-pc /dev/<DEVICE>

Most modern Linux installers will default to installing GRUB with UEFI support. After installation, ensure to run the necessary commands to setup legacy BIOS boot.




Error after selecting a boot entry in the GRUB menu:

ERROR: device 'UUID=9d4e74d8-8046-4f12-9ac9-624b8f306343' not found. Skipping fsck.
mount: /new_root: can't find UUID=9d4e74d8-8046-4f12-9ac9-624b8f306343.
You are now being dropped into an emergency shell.


  1. Boot from the fallback initramfs instead. This uses a full kernel and extra dependencies compared to the minimal default initramfs.

  2. Ensure that the initramfs has all of the Linux kernel modules that are required for storage devices. Normally this is a missing hardware RAID driver.

  3. Ensure that the UUID for the root device is correct. If not, update /etc/fstab and then rebuild the grub.cfg configuration.

  4. On Arch Linux, ensure both the “block” and “keyboard” hooks are loaded before the “autodetect” hook in the initramfs. [11]

$ sudo vim /etc/mkinitcpio.conf
HOOKS=(base udev keyboard block autodetect modconf resume filesystems fsck)
$ sudo mkinitpcio -p linux

Error from GRUB during boot:

error: sparse file not allowed


This means that GRUB was unable to save information such as which kernel was used to boot into and should be the default next time.

  1. Configure GRUB to not automatically save the last boot option.

$ sudo vim /etc/default/grub
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
  1. Add support for the correct file system (including compression, if necessary). Refer to the GRUB 2 - Configuration section for a list of valid GRUB modules.

  • Syntax:

    $ sudo vim /etc/default/grub
    $ sudo grub-mkconfig -o /boot/grub/grub.cfg
  • Example:

    $ sudo vim /etc/default/grub
    GRUB_PRELOAD_MODULES="part_gpt part_msdos btrfs zstd"
    $ sudo grub-mkconfig -o /boot/grub/grub.cfg



  1. “GRUB Legacy.” Arch Linux Wiki. January 11, 2017. Accessed February 8, 2017.

  2. “GNU GRUB Manual 0.97.” GNU. Accessed February 8, 2017.

  3. “GRUB.” Arch Linux Wiki. May 27, 2016.

  4. “GRUB2-INSTALL MAN PAGE.” Mankier. February 26, 2014.

  5. “GRUB2/Setup.” Ubuntu Documentation. November 29, 2015.

  6. “Grub2/Installing.” Ubuntu Documentation. March 6, 2015.

  7. “GNU GRUB Manual 2.00.” GNU. Accessed June 27, 2016.

  8. “Is a hybrid Linux USB-Stick for UEFI & legacy BIOS possible?” Super User. March 11, 2018. Accessed June 17, 2020.

  9. “GRUB/Tips and tricks.” ArchWiki. April 17, 2021. Accessed May 31, 2021.

  10. “Simple configuration handling.” GNU GRUB Manual 2.06. Accessed February 5, 2022.

  11. “Install Arch Linux on a removable medium.” ArchWiki. July 12, 2021. Accessed July 17, 2021.

  12. “Understanding the Various Grub Modules.” March 2, 2015. Accessed February 5, 2022.

  13. “GRUB error: sparse file not allowed.” Support - Manjaro Linux. September 6, 2020. Accessed February 2022.