205 lines
9 KiB
Markdown
205 lines
9 KiB
Markdown
# Grub 2 Info
|
|
|
|
## Contents
|
|
|
|
- [Overview](#overview)
|
|
- [Default Menu Entry](#default-menu-entry)
|
|
- [Vendor Defaults](#vendor-defaults)
|
|
- [RHEL Kernels](#rhel-kernels)
|
|
- [Simple Text Mode](#simple-text-mode)
|
|
- [Boot Options](#boot-options)
|
|
- [Disable Recovery Menus](#disable-recovery-menus)
|
|
- [Use Backup Config](#use-backup-config)
|
|
- [References](#references)
|
|
|
|
|
|
## Overview
|
|
|
|
Grub v2 is a radical departure fron grub v1 (aka "grub legacy"); at first it seems daunting, especially if you've spent years working with lilo and grub v1 and their simplistic, single-file index based configuration. These are some of the frequent tasks encountered when working with the new grub v2 environment; be sure to refer to the References links for more detailed and in-depth information. Grub2 is used in RHEL / CentOS 7 and above, Fedora 19 and above, and Ubuntu 14 and above.
|
|
|
|
|
|
## Default Menu Entry
|
|
|
|
Choose the default boot target via the `GRUB_DEFAULT` setting in `/etc/default/grub`:
|
|
|
|
- `GRUB_DEFAULT=`_n_ : specify the _n_th entry in `/boot/grub2/grub.cfg`; first entry is `0`
|
|
- `GRUB_DEFAULT=`_string_ : choose an entry by name
|
|
- `GRUB_DEFAULT=saved` : use the boot target specified in `/boot/grub/grubenv`
|
|
|
|
### Vendor Defaults
|
|
|
|
Vendors are using different out of the box defaults for the kernel to boot:
|
|
|
|
| **Distro** | **Default** |
|
|
| ------------- | -------------------- |
|
|
| RHEL / CentOS | `GRUB_DEFAULT=saved` |
|
|
| Ubuntu | `GRUB_DEFAULT=0` |
|
|
|
|
> Note that Ubuntu by default is using the 0-index method to boot a kernel; in real terms, this means it always tries to boot the top-level entry named "Ubuntu" that has no discrete kernel name listed. You must first set `GRUB_DEFAULT=saved` in `/etc/default/grub` and run `update-grub` to convert it over to using named kernels as outlined below. Failure to do these steps will result in an outcome you did not expect.
|
|
|
|
First, make sure that your setup is using a special setting in `/etc/default/grub` - add or replace as needed:
|
|
|
|
```
|
|
/etc/default/grub
|
|
|
|
GRUB_DEFAULT=saved
|
|
```
|
|
|
|
Rebuild your grub config file after making a backup. You will notice we create a backup **in the boot directory** as the Grub2 bootloader has the capability to use an alternate backup file\! So if your changes end up with a mistake, at a `grub>` menu you can tell it to boot your backup file out of the `/boot` directory. This provides an emergency rollback scenario should things go south during the reboot; see the "Use Backup Config" section in this article.
|
|
|
|
```
|
|
Fedora/RHEL/CentOS:
|
|
# cp -a /boot/grub2/grub.cfg{,.bak}
|
|
# grub2-mkconfig -o /boot/grub2/grub.cfg
|
|
|
|
Ubuntu/Debian/Mint:
|
|
# cp -a /boot/grub/grub.cfg{,.bak}
|
|
# update-grub
|
|
```
|
|
|
|
Get a list of the boot menu items with a simple grep - note that RHEL style systems use a flat top-level menu, whereas Ubuntu uses a top-level single menu "Ubuntu" with several submenus of named kernels; this is just a different implementation by the vendors, but it does require a slightly different grep to find the menu entry names.
|
|
|
|
```
|
|
Fedora/RHEL/CentOS:
|
|
# grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2
|
|
|
|
Red Hat Enterprise Linux Server (3.10.0-229.1.2.el7.x86_64) 7.1 (Maipo)
|
|
Red Hat Enterprise Linux Server (3.10.0-229.1.2.el7.x86_64) 7.1 (Maipo) with debugging
|
|
Red Hat Enterprise Linux Server (3.10.0-229.4.2.el7.x86_64) 7.1 (Maipo)
|
|
Red Hat Enterprise Linux Server (3.10.0-229.4.2.el7.x86_64) 7.1 (Maipo) with debugging
|
|
Red Hat Enterprise Linux Server 7.1 (Maipo), with Linux 3.10.0-229.el7.x86_64
|
|
Red Hat Enterprise Linux Server 7.1 (Maipo), with Linux 0-rescue-2c9acae4aae44399a33ff8405cdfda12
|
|
|
|
Ubuntu/Debian/Mint:
|
|
# egrep "^[[:space:]]?(submenu|menuentry)" /boot/grub/grub.cfg | cut -d "'" -f2
|
|
|
|
Ubuntu
|
|
Advanced options for Ubuntu
|
|
Ubuntu, with Linux 4.4.0-75-generic
|
|
Ubuntu, with Linux 4.4.0-72-generic
|
|
Ubuntu, with Linux 4.4.0-43-generic
|
|
```
|
|
|
|
> Ubuntu uses submenus. This means that the line above "Advanced options for Ubuntu" is the top level item, then the lines below it are children; visually:
|
|
>
|
|
> - Ubuntu
|
|
> - Advanced options for Ubuntu
|
|
> - Ubuntu, with Linux 4.4.0-75-generic
|
|
> - Ubuntu, with Linux 4.4.0-72-generic
|
|
> - Ubuntu, with Linux 4.4.0-43-generic
|
|
>
|
|
> Below you will prepend "Advanced options for Ubuntu", a '\>' symbol, then the name to make it work correctly.
|
|
|
|
Use one of these lines to set the default with `grub2-set-default` / `grub-set-default` - a 0-based index can be used instead of a name, however on RHEL `grubby` uses the long name so stick to that. `grub(2)-set-default` is just a fancy shell script that runs `grub(2)-editenv` to unset old entries and set the `saved_entry` with your new choice. It updates the `/boot/grub(2)/grubenv` file:
|
|
|
|
```
|
|
Fedora/RHEL/CentOS:
|
|
# grub2-set-default "Red Hat Enterprise Linux Server (3.10.0-229.1.2.el7.x86_64) 7.1 (Maipo)"
|
|
|
|
# grub2-editenv list
|
|
saved_entry=Red Hat Enterprise Linux Server (3.10.0-229.1.2.el7.x86_64) 7.1 (Maipo)
|
|
|
|
# grep saved_entry /boot/grub2/grubenv
|
|
saved_entry=Red Hat Enterprise Linux Server (3.10.0-229.1.2.el7.x86_64) 7.1 (Maipo)
|
|
|
|
===
|
|
|
|
Ubuntu/Debian/Mint:
|
|
# grub-set-default 'Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-72-generic'
|
|
|
|
# grub-editenv list
|
|
saved_entry=Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-72-generic
|
|
|
|
# grep saved_entry /boot/grub2/grubenv
|
|
saved_entry=Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-72-generic
|
|
```
|
|
|
|
|
|
## RHEL Kernels
|
|
|
|
A note about how Red Hat builds their kernel packages; in the above examples `grub2-mkconfig` is used to build new config files; be aware that the RHEL kernel package installs do not use it. Instead, they use a shim `/sbin/new-kernel-pkg` which in turn uses a program called `grubby`. The critical differences:
|
|
|
|
- **grubby does not use /etc/default/grub** – it uses the as-booted kernel parameters to build a new commandline for the new kernel. If you have custom kernel arguments, be sure to first update `/etc/default/grub`, use `grub2-mkconfig`, reboot to activate the new options then upgrade the new kernel package. This is most commonly done on a freshly installed server before a `yum update` is issued.
|
|
- **the grubby menu entries are different** – the Title used in the menu entries is of a different text string than the one produced by `grub2-mkconfig`; this means you should always check and if required set the default kernel to boot when manipulating the grub config file. A quick example:
|
|
|
|
```
|
|
# Build the new config
|
|
grub2-mkconfig -o /boot/grub2/grub.cfg
|
|
|
|
# Get the name of the one you want, let's call it "Red Hat FOOBAR" here
|
|
grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2
|
|
|
|
# Update the grub environment file /boot/grub2/grubenv saved_entry
|
|
grub2-set-default "Red Hat FOOBAR"
|
|
grub2-editenv list
|
|
```
|
|
|
|
The Red Hat kernel packages will automatically reconfigure the default kernel to boot as part of the `grubby` process; if simply doing a standard kernel package upgrade or downgrade the environment file will be updated to that package version.
|
|
|
|
|
|
## Simple Text Mode
|
|
|
|
This is handy for servers - set up grub2 to use basic text mode and show all kernels by default:
|
|
|
|
```
|
|
# vi /etc/default/grub
|
|
|
|
GRUB_DISABLE_SUBMENU=true
|
|
GRUB_GFXMODE=1024x768
|
|
GRUB_GFXPAYLOAD_LINUX=keep
|
|
|
|
Comment this out if present:
|
|
#GRUB_TERMINAL_OUTPUT="console"
|
|
|
|
# cp -a /boot/grub2/grub.cfg{,.bak}
|
|
# grub2-mkconfig -o /boot/grub2/grub.cfg
|
|
```
|
|
|
|
|
|
## Boot Options
|
|
|
|
The config variable `GRUB_CMDLINE_LINUX` will be applied to all the auto-detected linux kernels when you rebuild the config; typically the config already has some options, just add to the end as needed. Some common options might be disabling IPv6, setting the LANG variable or blacklisting initrd modules (such as SAN/DAS HBAs).
|
|
|
|
```
|
|
# vi /etc/default/grub
|
|
|
|
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vglocal00/swap00 rd.lvm.lv=vglocal00/root00 net.ifnames=0 biosdevname=0 rdblacklist=bfa nomodeset"
|
|
|
|
# cp -a /boot/grub2/grub.cfg{,.bak}
|
|
# grub2-mkconfig -o /boot/grub2/grub.cfg
|
|
```
|
|
|
|
|
|
## Disable Recovery Menus
|
|
|
|
You may wish to disable the "(recovery mode)" (single-user mode) menu entries by setting `GRUB_DISABLE_RECOVERY` and rebuilding your config. In reality all the menu entry does is add the boot option `single` so there's no real value in cluttering up your grub menus.
|
|
|
|
```
|
|
# vi /etc/default/grub
|
|
|
|
GRUB_DISABLE_RECOVERY="true"
|
|
|
|
# cp -a /boot/grub2/grub.cfg{,.bak}
|
|
# grub2-mkconfig -o /boot/grub2/grub.cfg
|
|
```
|
|
|
|
|
|
## Use Backup Config
|
|
|
|
It's possible something might go wrong during `grub2-mkconfig` and leave you with a corrupt config file, but you won't notice it until you've rebooted. Typically grub will drop you to the shell with an error (or just empty menus). If that happens and you've made a backup use the `configfile` command to use it - as soon as the command is issued the menu should appear.
|
|
|
|
```
|
|
grub2> ls
|
|
(hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)
|
|
grub2> configfile (hd0,1)/boot/grub2/grub.cfg.bak
|
|
```
|
|
|
|
|
|
## References
|
|
|
|
- <https://www.gnu.org/software/grub/manual/grub.html>
|
|
- <http://fedoraproject.org/wiki/GRUB_2>
|
|
- <https://help.ubuntu.com/community/Grub2>
|
|
- <https://wiki.archlinux.org/index.php/GRUB>
|
|
- <https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html>
|
|
- <https://fedoraproject.org/wiki/Features/DracutHostOnly>
|