update-grub和grub-mkconfig

-- TOC --

update-grub和grub-mkconfig这两个放在sbin目录里的脚本,基本上是一样的,干得是同一件事情:更新grub.cfg!

update-grub

这条命令其实就是一个非常简单的脚本,它的出现应该是为了更好的记忆。

# content of update-grub
#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

update-grub就是调用grub-mkconfig!

update-grub命令会扫描/boot/目录下的vmlinuz ,initrd 等文件,自动将内核加到启动菜单中

grub-mkconfig

执行下面这条命令,与执行 update-grub 是一样的:

$ sudo grub-mkconfig -o /boot/grub/grub.cfg
[sudo] password for xinlin: 
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.11.0-38-generic
Found initrd image: /boot/initrd.img-5.11.0-38-generic
Found linux image: /boot/vmlinuz-5.11.0-27-generic
Found initrd image: /boot/initrd.img-5.11.0-27-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done

注意不同系统中,grub.cfg的路径,MBR和UEFI两种启动模式对应的路径也不一样!

距离例子:

LEGACY启动模式的文件是这个,/boot/grub/grub.cfg

UEFI启动模式的文件是这个,/boot/efi/EFI//grub.cfg

搜索所有分区

这两个命令其实搜索的是硬盘的所有分区,把所有能够找到的OS(包括Win系统)都加入grub.cfg,这得益于os-prober。我们以前装双系统,都是先装Windows,再装Linux,这样开机能看到grub的OS选项,原因就是装Linux系统的时候,安装完成后会自动运行update-grub命令!

编译内核后

完成了内核编译,执行 sudo make install 时,有两个过程会自动被执行,update-initramfsupdate-grub

$ sudo make install
sh ./arch/x86/boot/install.sh 5.11.0 arch/x86/boot/bzImage \
    System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 5.11.0 /boot/vmlinuz-5.11.0
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 5.11.0 /boot/vmlinuz-5.11.0
update-initramfs: Generating /boot/initrd.img-5.11.0
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 5.11.0 /boot/vmlinuz-5.11.0
run-parts: executing /etc/kernel/postinst.d/update-notifier 5.11.0 /boot/vmlinuz-5.11.0
run-parts: executing /etc/kernel/postinst.d/xx-update-initrd-links 5.11.0 /boot/vmlinuz-5.11.0
I: /boot/initrd.img.old is now a symlink to initrd.img-5.11.0-38-generic
I: /boot/initrd.img is now a symlink to initrd.img-5.11.0
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 5.11.0 /boot/vmlinuz-5.11.0
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.11.0-38-generic
Found initrd image: /boot/initrd.img-5.11.0-38-generic
Found linux image: /boot/vmlinuz-5.11.0-27-generic
Found initrd image: /boot/initrd.img-5.11.0-27-generic
Found linux image: /boot/vmlinuz-5.11.0
Found initrd image: /boot/initrd.img-5.11.0
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done

不要直接修改grub.cfg

不要修改/boot/grub/grub.cfg,因为那个文件的内容,在执行update-grub命令后会自动生成。

$ ll /boot/grub/grub.cfg
-r--r--r-- 1 root root 9947 10月 24 20:50 /boot/grub/grub.cfg
$ ll /etc/default/grub
-rw-r--r-- 1 root root 1209 10月 24 16:33 /etc/default/grub

默认情况下,grub.cfg连root用户都没有w权限!

上面的脚本打印可以看出,update-grub也是source了另外两个脚本(Ubuntu桌面):

Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'

一般都是修改 /etc/default/grub ,然后再 update-grub

$ head /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

继续学习线索出现: info -f grub -n 'Simple configuration'

本文链接:https://cs.pynote.net/sf/grub/202110247/

-- EOF --

-- MORE --