Show Table of Contents
25.5. Customizing the GRUB 2 Configuration File
GRUB 2 scripts search the user's computer and build a boot menu based on what operating systems the scripts find. To reflect the latest system boot options, the boot menu is rebuilt automatically when the kernel is updated or a new kernel is added.
However, users may want to build a menu containing specific entries or to have the entries in a specific order. GRUB 2 allows basic customization of the boot menu to give users control of what actually appears on the screen.
GRUB 2 uses a series of scripts to build the menu; these are located in the
/etc/grub.d/ directory. The following files are included:
00_header, which loads GRUB 2 settings from the/etc/default/grubfile.01_users, which reads the superuser password from theuser.cfgfile. In Red Hat Enterprise Linux 7.0 and 7.1, this file was only created when boot password was defined in the kickstart file during installation, and it included the defined password in plain text.10_linux, which locates kernels in the default partition of Red Hat Enterprise Linux.30_os-prober, which builds entries for operating systems found on other partitions.40_custom, a template, which can be used to create additional menu entries.
Scripts from the
/etc/grub.d/ directory are read in alphabetical order and can be therefore renamed to change the boot order of specific menu entries.
Important
With the
GRUB_TIMEOUT key set to 0 in the /etc/default/grub file, GRUB 2 does not display the list of bootable kernels when the system starts up. In order to display this list when booting, press and hold any alphanumeric key when the BIOS information is displayed; GRUB 2 will present you with the GRUB 2 menu.
25.5.1. Changing the Default Boot Entry
By default, the key for the
GRUB_DEFAULT directive in the /etc/default/grub file is the word saved. This instructs GRUB 2 to load the kernel specified by the saved_entry directive in the GRUB 2 environment file, located at /boot/grub2/grubenv. You can set another GRUB 2 record to be the default, using the grub2-set-default command, which will update the GRUB 2 environment file.
By default, the
saved_entry value is set to the name of latest installed kernel of package type kernel. This is defined in /etc/sysconfig/kernel by the UPDATEDEFAULT and DEFAULTKERNEL directives. The file can be viewed by the root user as follows:
~]# cat /etc/sysconfig/kernel
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes
# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel
The DEFAULTKERNEL directive specifies what package type will be used as the default. Installing a package of type kernel-debug will not change the default kernel while the DEFAULTKERNEL is set to package type kernel.
GRUB 2 supports using a numeric value as the key for the
saved_entry directive to change the default order in which the operating systems are loaded. To specify which operating system should be loaded first, pass its number to the grub2-set-default command. For example:
~]#grub2-set-default2
Note that the position of a menu entry in the list is denoted by a number starting with zero; therefore, in the example above, the third entry will be loaded. This value will be overwritten by the name of the next kernel to be installed.
To force a system to always use a particular menu entry, use the menu entry name as the key to the
GRUB_DEFAULT directive in the /etc/default/grub file. To list the available menu entries, run the following command as root:
~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
The file name /etc/grub2.cfg is a symbolic link to the grub.cfg file, whose location is architecture dependent. For reliability reasons, the symbolic link is not used in other examples in this chapter. It is better to use absolute paths when writing to a file, especially when repairing a system.
Changes to
/etc/default/grub require rebuilding the grub.cfg file as follows:
- On BIOS-based machines, issue the following command as
root:~]#
grub2-mkconfig -o /boot/grub2/grub.cfg - On UEFI-based machines, issue the following command as
root:~]#
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
25.5.2. Editing a Menu Entry
If required to prepare a new GRUB 2 file with different parameters, edit the values of the
GRUB_CMDLINE_LINUX key in the /etc/default/grub file. Note that you can specify multiple parameters for the GRUB_CMDLINE_LINUX key, similarly to adding the parameters in the GRUB 2 boot menu. For example: GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,9600n8"Where
console=tty0 is the first virtual terminal and console=ttyS0 is the serial terminal to be used.
Changes to
/etc/default/grub require rebuilding the grub.cfg file as follows:
- On BIOS-based machines, issue the following command as
root:~]#
grub2-mkconfig -o /boot/grub2/grub.cfg - On UEFI-based machines, issue the following command as
root:~]#
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
25.5.3. Adding a new Entry
When executing the
grub2-mkconfig command, GRUB 2 searches for Linux kernels and other operating systems based on the files located in the /etc/grub.d/ directory. The /etc/grub.d/10_linux script searches for installed Linux kernels on the same partition. The /etc/grub.d/30_os-prober script searches for other operating systems. Menu entries are also automatically added to the boot menu when updating the kernel.
The
40_custom file located in the /etc/grub.d/ directory is a template for custom entries and looks as follows:
#!/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.
This file can be edited or copied. Note that as a minimum, a valid menu entry must include at least the following:
menuentry "<Title>"{ <Data> }
25.5.4. Creating a Custom Menu
If you do not want menu entries to be updated automatically, you can create a custom menu.
Important
Before proceeding, back up the contents of the
/etc/grub.d/ directory in case you need to revert the changes later.
Note
Note that modifying the
/etc/default/grub file does not have any effect on creating custom menus.
- On BIOS-based machines, copy the contents of
/boot/grub2/grub.cfg, or, on UEFI machines, copy the contents of/boot/efi/EFI/redhat/grub.cfg. Put the content of thegrub.cfginto the/etc/grub.d/40_customfile below the existing header lines. The executable part of the40_customscript has to be preserved. - From the content put into the
/etc/grub.d/40_customfile, only themenuentryblocks are needed to create the custom menu. The/boot/grub2/grub.cfgand/boot/efi/EFI/redhat/grub.cfgfiles might contain function specifications and other content above and below themenuentryblocks. If you put these unnecessary lines into the40_customfile in the previous step, erase them.This is an example of a custom40_customscript:#!/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 'First custom entry' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.10.0-67.el7.x86_64-advanced-32782dd0-4b47-4d56-a740-2076ab5e5976' { load_video set gfxpayload=keep insmod gzio insmod part_msdos insmod xfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7885bba1-8aa7-4e5d-a7ad-821f4f52170a else search --no-floppy --fs-uuid --set=root 7885bba1-8aa7-4e5d-a7ad-821f4f52170a fi linux16 /vmlinuz-3.10.0-67.el7.x86_64 root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root vconsole.font=latarcyrheb-sun16 rd.lvm.lv=rhel/swap vconsole.keymap=us crashkernel=auto rhgb quiet LANG=en_US.UTF-8 initrd16 /initramfs-3.10.0-67.el7.x86_64.img } menuentry 'Second custom entry' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c-advanced-32782dd0-4b47-4d56-a740-2076ab5e5976' { load_video insmod gzio insmod part_msdos insmod xfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 7885bba1-8aa7-4e5d-a7ad-821f4f52170a else search --no-floppy --fs-uuid --set=root 7885bba1-8aa7-4e5d-a7ad-821f4f52170a fi linux16 /vmlinuz-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root vconsole.font=latarcyrheb-sun16 rd.lvm.lv=rhel/swap vconsole.keymap=us crashkernel=auto rhgb quiet initrd16 /initramfs-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c.img } - Remove all files from the
/etc/grub.d/directory except the following:00_header,40_custom,01_users(if it exists),- and
README.
Alternatively, if you want to keep the files in the/etc/grub2.d/directory, make them unexecutable by running thechmodcommand.a-x<file_name> - Edit, add, or remove menu entries in the
40_customfile as desired. - Rebuild the
grub.cfgfile by running thegrub2-mkconfigcommand as follows:-o- On BIOS-based machines, issue the following command as
root:~]#
grub2-mkconfig -o /boot/grub2/grub.cfg - On UEFI-based machines, issue the following command as
root:~]#
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.