Working with Grub2 in Linux
2016-10-21 by terryoy, in tricks
Grub2(GRUB: the GRand Unified Bootloader) is the main bootloader in Debian/Ubuntu distribution. I have always wanted to know the details to change or fix the booting process. So I did a research and make a note here.
Normally we should use the util
update-grub to update the grub2 boot entries. In grub(the older, not grub2), we need to update the boot menu file
/boot/grub/menu.lst carefully to manage the entries. In this case, it could be easy to make mistakes, or inconvenient while editing the file and get required information at the same time.
In grub2 with
update-grub, this process can be managed in updating a general setting file and a list of scripts that generate entries. These files are:
/etc/default/grub, general grub settings,
/etc/grub.d/*, this directory contains a list of executable scripts and will be processed in order. You can add the files according to the convention:
- “00_*”: It is reserved for 00_header.
- “10_*”: Native boot entries.
- “20_*”: Third party apps (e.g. memtest86+).
The number namespace in-between is configuratble by system installer and/or administrator. The order of other number will be reflected in the menu if you set 01_otheros, 11_otheros, etc.
For example, I have below config files in
/etc/init.d/ for a ubuntu installation:
00_header 05_debian_theme 10_linux 20_linux_gen 30_os-prober 30_uefi_firmware 40_custom 41_custom
2. Clean up Grub2 Menu
After a release or a kernel upgrade, you may usually find unuseful entries in the boot menu, which are mainly for previous state recovery. So here let's see how to remove the unuseful entries.
First are the unnecessary kernel entries. They exist because you install more older kernel versions lying around on your machine. So you can check if there are more than one
linux-headers-<version> entry and
linux-image-<version> entry, then remove the unnecessary package via package manager.
Second, unwanted entries in
/etc/init.d/ such as memtest86+. Disabling them is very easy, just make them not executable then it's done.
$ cd /etc/init.d/ $ sudo chmod -x 20_memtest86+
And the last thing is to update grub:
$ sudo update-grub
Sometimes if you just want to edit some of the boot menu item, you could lookup the
menuentry in the file and edit the content. For example, there is a
30_os-prober file in
/etc/grub.d/, which checks if there are other OS exists on local drives and create boot entries for them. You can see the similar content in each OS part and using
menuentry to add an entry to the grub config.
3. Grub2 Settings
In the general setting file
/etc/default/grub, there are some basic settings that you could change.
# (template of /etc/default/grub) # 1. Default boot entry, can be the index or the title of the boot item; SAVEDEFAULT option let you save every last choice as next default GRUB_DEFAULT=0 GRUB_SAVEDEFAULT=true # 2. Go directly to the default boot entry unless you press 'shift' or 'esc' at startup. The "QUIET" option will display the count down of the hidden timeout before going to boot, which you can use a chance for a boot splash GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true # 3. Grub background, just simply set the image path(supports '.png', '.tga', '.jpg' or '.jpeg') GRUB_BACKGROUND='/path/to/image.jpg'
Ref: (run as shell cmd)
info -f grub -s 'Simple configuration'
4. Grub2 tools
4.1 Grub Rescue
Many times when grub boot failed, it will run into
grub-rescue shell environment. It is expected that you fix something(usually try to recover the damaged boot record.) and set a bootable entry for grub to continue the boot process
Below is an example of a common process.
# check available parition grub rescue> ls (hd0),(hd0,msdos3),(hd0,msdos2),(hd0,msdos1) # check available grub boot record in a partition grub rescue> ls (hd0,msdosX)/boot/grub # set boot entry grub rescue> set root=(hd0,msdos3) grub rescue> set prefix=(hd0,msdos3)/boot/grub grub rescue> insmod /boot/grub/normal.mod # go to startup screen grub rescue>normal # (is this the alternative way?) rescue>linux /boot/vmlinuz-xxx-xxx root=/dev/sdax rescue>initrd /boot/initrd.img-xxx-xxx rescue>boot
The GRUB manual: (run in linux shell)
Clean up Grub2 entries: www.howtogeek.com/howto/17787/clean-up-the-new-ubuntu-grub2-boot-menu/. (There is also a link to an article for the old
How to Configure Grub2 boot loader settings: www.howtogeek.com/196655/how-to-configure-the-grub2-boot-loaders-settings/