Установить ядро ​​по умолчанию в GRUB


49

Как выбрать ядро ​​GRUB2 по умолчанию? Я недавно установил ядро ​​Linux реального времени, и теперь оно загружается по умолчанию. Я хотел бы загрузить обычный по умолчанию.

До сих пор мне удалось выбрать только ОС по умолчанию ... и по какой-то причине /boot/grub.cfgуже предполагается, что я хочу загрузить rt-ядро и поместить его в общий пункт меню linux (в моем случае Arch Linux).


2
grub2-set-default <название или номер>?
taliezin

1
Но как узнать номер? Числа grub.cfgтолько соответствуют ОС, а не ядрам.
TomTom

В некоторых случаях это работает: askubuntu.com/questions/216398/… Названия меню можно найти, просмотрев этот файл: /boot/grub/grub.cfg
TekOps

Ответы:


43

Я думаю, что большинство дистрибутивов перенесли дополнительные ядра в подменю расширенных опций на данный момент, как обнаружил TomTom в случае с его Arch.

Я не хотел изменять структуру меню верхнего уровня, чтобы выбрать предыдущее ядро ​​в качестве используемого по умолчанию. Я нашел ответ здесь:

http://www.humans-enabled.com/2014/08/how-to-set-default-grub-kernel-boot.html

Обобщить:

1) Найдите $menuentry_id_пцию для подменю:

$ grep submenu /boot/grub/grub.cfg
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {

2) Найдите пункт $menuentry_id_optionменю для ядра, которое вы хотите использовать:

$ grep gnulinux /boot/grub/grub.cfg
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {

3) Закомментируйте ваш текущий набор по умолчанию /etc/default/grubи замените его подменю $menuentry_id_optionс первого шага, а выбранное ядро $menuentry_id_optionс второго шага разделите >.

В моем случае модифицированным GRUB_DEFAULTявляется:

#GRUB_DEFAULT=0

GRUB_DEFAULT="gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc>gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc"

4) Обновите grub, чтобы внести изменения. Для Debian это делается так:

$ sudo update-grub

Готово. Теперь при загрузке в расширенном меню должна быть звездочка, и вы должны загрузиться в выбранное ядро. Вы можете подтвердить это с помощью uname.

$ uname -a
Linux NAME 4.18.0-0.bpo.1-amd64 #1 SMP Debian 4.18.0-0 (2018-09-13) x86_64 GNU/Linux

Изменить это на самое последнее ядро ​​так же просто, как закомментировать новую строку и раскомментировать #GRUB_DEFAULT=0, а затем перезапустить update-grub.


31

После двух часов борьбы я нашел гораздо более простой способ добиться этого. Я просто RTFM. ;)

Добавьте две строки в / etc / default / grub

GRUB_SAVEDEFAULT=true
GRUB_DEFAULT=saved

Выполните sudo update-grub, перезагрузитесь, войдите в свое меню grub и выберите любой пункт меню или подменю, который вам нужен. Выбор будет сохранен, и в следующий раз ваш компьютер загрузится в него автоматически.


2
Замечательный! Так просто!
Егор Скриптунов

О, намного проще. Спасибо.
user207863

21

Как упоминалось в комментариях, вы можете установить ядро ​​по умолчанию для загрузки с помощью grub-set-default Xкоманды, где X - это номер ядра, в которое вы хотите загрузиться. В некоторых дистрибутивах вы также можете установить этот номер, отредактировав /etc/default/grubфайл и настройку GRUB_DEFAULT=X, а затем запустив update-grub.

Число - это индекс массива ядер / настроек ядра, отображаемых в меню GRUB во время загрузки, при этом 0 - это первая (самая верхняя) запись. Обычно вы можете найти правильное число, посмотрев menuentryстроки /boot/grub/grub.cfg, например:

grep menuentry /boot/grub/grub.cfg

Вы увидите каждое ядро ​​в списке с именем, которое отображается в меню загрузки GRUB. Первый - 0, второй - 1 и т. Д.


1
В Fedora 21 это так /boot/grub2/grub.cfg.
что-то что-то

3
Это не работает для меня. Последнее ядро ​​в моей установке - 4.4.0-64-generic (menuentry 0), но я хочу, чтобы 4.4.0-59-generic (menuentry 9) было загрузочным ядром по умолчанию. Я побежал, grub-set-default 9а затем grub-updateи перезагрузился. Я позволил grub загружаться с ядром по умолчанию, и он по-прежнему загружается с 4.4.0-64-generic . Я также попытался редактировать /etc/default/grubи установить GRUB_DEFAULT=9и запустить grub-update. При перезагрузке ничего не меняется, система все еще загружается с 4.4.0-64-generic . Может я что-то упустил, кто-нибудь может мне помочь?
Дроначарья

Это не сработало для меня тоже. Я удалил нежелательное ядро, как объяснено здесь: askubuntu.com/a/764242/456247
Луис

8

Простое выполнение grep 'menuentry' /boot/grub/grub.cfgперечисляет дополнительные записи, которые не относятся к фактическим версиям ядра или ОС. Например, он перечисляет

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option

Я хотел бы предложить небольшое улучшение метода поиска этого файла: использовать awk

$ awk '/menuentry/ && /class/ {count++; print count-1"****"$0 }' /boot/grub/grub.cfg                                            
0****menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-86df21bf-d95f-435c-9292-273bdbcba056' {
1****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
2****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {
3****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
4****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {

С помощью приведенной ниже команды и ее вывода вы можете увидеть, что awkкод соответствует фактической версии ОС, и указать номер, который вы затем можете использовать в /etc/default/grubфайле.

В дополнение к редактированию /etc/default/grubфайла вручную, я предлагаю использовать sed. В приведенной ниже команде замените X на соответствующий номер, полученный из команды awk выше:

sudo sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=X/g' /etc/default/grub; sudo update-grub


2
Это не ответ. Это читается как комментарий. В ответе должно быть сказано «Вот как установить запись по умолчанию в GRUB», а не «позвольте мне добавить дополнение к другому ответу». Вы можете легко отредактировать это в правильный ответ, но может быть разумнее просто оставить комментарий к ответу jkt123 об использовании awk вместо grep.
Александр Дубинский

2

Я думаю, jkt123 будет работать для большинства дистрибутивов. Однако для Arch Linux это не сработало, по крайней мере, с теми пакетами, которые у меня есть.

Индексы, которые вы можете установить, grub-set-defaultсоответствуют только пунктам главного меню. Однако параметры ядра находятся в подменю. Таким образом, вы либо перемещаете запись ядра из подменю в главное меню, либо помещаете запись в верхней части списка подменю и выбираете подменю.

Мое меню Grub

  • Arch Linux
  • Расширенные опции для Arch Linux
    • Ядро 1
    • Ядро 2
  • Windows

Чтобы иметь возможность загружать ядро ​​2, вы должны либо поменять его местами с ядром 1, либо поместить его вне подменю на том же уровне, что и Arch Linux или Windows. А затем установите номер по умолчанию для одного из индексов главного меню. Например, в меню выше «0» загружает «Arch Linux» и «1» загружает ядро ​​1.

Чтобы изменить иерархию и обмен, откройте /boot/grub/grub.cfgи переместите запись, которую вы хотите переместить. Запись может выглядеть так

menuentry 'ENTRY NAME'
   ... some code ...
}

Затем вам нужно применить ваши изменения. В моем случае с grub-mkconfig. Но это может варьироваться от системы к системе.


0

Как только выглядел CentOS-6.6, grub.conf можно было отредактировать вручную, чтобы изменить выбор по умолчанию:

default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

0

Debian Stretch:

Вместо того, чтобы возиться с файлами конфигурации, создайте папку /noot(назовите ее как хотите), оставьте нужное ядро ​​вместе с соответствующими файлами конфигурации и системными файлами /bootи переместите остальные в эту новую папку.

Беги update-grub.

Дважды проверьте /bootпапку, в которой указана версия вашего ядра и соответствующие файлы конфигурации и системные файлы (если вы скопировали что-то, чего не должно быть), и перезагрузитесь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.