我在 Debian 8 机器上构建了一个自定义内核,我想将其设置为默认内核。这看似是一个很简单的任务,但我无论如何都无法让它工作。
我使用官方源代码(通过 git)构建了内核,而不是使用供应商为 Debian 提供的 tarball。构建完成后,我使用以下命令安装了内核和模块:
$ sudo make modules_install install
这会在 grub 中安装一个新的菜单项,如果您在启动时手动选择它,它确实会起作用。所以这很好。
现在,为了让它默认启动,我必须编辑/etc/default/grub
并更改GRUB_DEFAULT
。文件顶部是一条注释,将用户指向一个信息页面,内容如下:
'GRUB_DEFAULT'
The default menu entry. This may be a number, in which case it
identifies the Nth entry in the generated menu counted from zero,
or the title of a menu entry, or the special string 'saved'. Using
the id may be useful if you want to set a menu entry as the default
even though there may be a variable number of entries before it.
For example, if you have:
menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
...
}
then you can make this the default using:
GRUB_DEFAULT=example-gnu-linux
Previously it was documented the way to use entry title. While
this still works it's not recommended since titles often contain
unstable device names and may be translated
If you set this to 'saved', then the default menu entry will be
that saved by 'GRUB_SAVEDEFAULT' or 'grub-set-default'. This
relies on the environment block, which may not be available in all
situations (*note Environment block::).
The default is '0'.
首先,从文章中看不出“id”是否与“title”相同。除此之外,看起来我应该--id
在生成的 grub 配置中使用后面的字符串。
因此,make install
将以下内容插入/boot/grub/grub.cfg
:
menuentry 'Debian GNU/Linux, with Linux 3.16.36krunsystickless+' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.36krunsystickless+-advanced-197f20c1-1808-41b5-831f-b85a40358757' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 197f20c1-1808-41b5
-831f-b85a40358757
else
search --no-floppy --fs-uuid --set=root 197f20c1-1808-41b5-831f-b85a40358757
fi
echo 'Loading Linux 3.16.36krunsystickless+ ...'
linux /boot/vmlinuz-3.16.36krunsystickless+ root=UUID=197f20c1-1808-41b5-831f-b85a40358757 ro quiet console=ttyS0,115200n8 intel_psta
te=disable
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-3.16.36krunsystickless+
}
其中,先前在文件中$menuentry_id_option
设置:
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
因此,我大概应该GRUB_DEFAULT
开始/etc/grub/default
:
gnulinux-3.16.36krunsystickless+-advanced-197f20c1-1808-41b5-831f-b85a40358757
然后运行:
$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.16.36softdevnohzfullall
Found initrd image: /boot/initrd.img-3.16.36softdevnohzfullall
Found linux image: /boot/vmlinuz-3.16.36krunsystickless+
Found initrd image: /boot/initrd.img-3.16.36krunsystickless+
Found linux image: /boot/vmlinuz-3.16.36krunsystickless+.old
Found initrd image: /boot/initrd.img-3.16.36krunsystickless+
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
最后重新启动之前。
但这似乎不起作用。相反,启动的是与之前相同的内核。有人知道为什么吗?
我还尝试过其他方法:
- 数字索引
GRUB_DEFAULTS
——似乎没有效果。 - 转义内核 ID 中的加号。
grub-set-default
我现在要去调查一下feature_menuentry_id
,但我感觉这只是一个转移注意力的借口。如果有人能在此期间让我摆脱痛苦,我将不胜感激。
谢谢
答案1
最后我设法使用以下行启动我的内核/etc/default/grub
:
GRUB_DEFAULT=gnulinux-advanced-197f20c1-1808-41b5-831f-b85a40358757>gnulinux-3.16.36krunsystickless+-advanced-197f20c1-1808-41b5-831f-b85a40358757
文档具有误导性。GRUB_DEFAULT
如果涉及子菜单,则不能简单地将 ID 放入其中。您必须考虑使用(可能有很多)ID 来导航 grub 菜单。>
上面的内容(顺便说一句,我在文档中没有找到)表示“进入此子菜单”。
我希望这可以帮助其他被同样问题困扰的人。
干杯