Я создал собственное ядро на машине Debian 8 и хочу установить его по умолчанию. Казалось бы, простая задача, но я не могу заставить ее работать на всю жизнь.
Я построил свое ядро, используя официальный исходный код (через git), а не тарбол поставщика, предоставленный моим debian. После сборки я установил ядро и модули:
$ 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
- похоже, не действуют.grub-set-default
Я собираюсь изучить feature_menuentry_id
сейчас, но я чувствую, что это будет отвлекающий маневр. Если кто-нибудь пока сможет избавить меня от страданий, я буду очень признателен.
Спасибо
В конце концов мне удалось загрузить ядро со следующей строчкой в /etc/default/grub
:
GRUB_DEFAULT=gnulinux-advanced-197f20c1-1808-41b5-831f-b85a40358757>gnulinux-3.16.36krunsystickless+-advanced-197f20c1-1808-41b5-831f-b85a40358757
Документация вводит в заблуждение. Вы не можете просто поместить идентификатор в GRUB_DEFAULT
если есть подменю. Вы должны думать о навигации по меню grub, используя (потенциально много) идентификаторов. В >
выше (которого я не нашел в документации, кстати) означает «перейти в это подменю».
Надеюсь, это поможет другим запутаться в этой же проблеме.
Ура