Dan*_*lly 4 updates boot grub2 kernel
我正在运行 ubuntu 20.04,并且安装了许多内核,从默认内核到我在本地编译的自定义内核。当我运行时sudo update-grub
,我当前正在摆弄的内核(IE最后编译的)总是被神奇地选择为默认启动选项。
这是如何运作的?update-grub 如何知道应该将哪个内核设置为默认内核?我发现有关该主题的文档令人恼火地贫乏:
它的工作原理是在 /boot 中查找以“vmlinuz-”开头的所有文件。它们将被视为内核,并且将为每个内核创建 grub 菜单条目。
这很好,但是怎么样?
update-grub
调用grub-mkconfig
,后者又运行 中的 shell 脚本/etc/grub.d
。其中之一是/etc/grub.d/10_linux
,它使用 shell 函数version_find_latest
不断迭代剩余的 Linux 内核列表,从最新到最旧。
shell 函数version_find_latest
在 中定义/usr/share/grub/grub-mkconfig_lib
,使用辅助函数version_test_gt
(也在同一文件中定义)。该函数使用 sed 正则表达式的混合来检测预发布、git 版本等,最后诉诸于dpkg --compare-versions
比较两个点修订字符串。
实际上,您可以在 shell 中尝试它,而无需编译任何内核或更改任何 grub 配置:
$ source /usr/share/grub/grub-mkconfig_lib
$ version_find_latest vmlinuz-5.6.7-aaa vmlinuz-5.1.12 vmlinuz-5.6.7-git
vmlinuz-5.6.7-aaa
Run Code Online (Sandbox Code Playgroud)