Как знает загрузчик grub?

Это абсолютно безопасно, если вы не знаете, как откат видео драйверов до стабильной версии из командной строки, потому что это то, что вы собираетесь делать.

1
задан 18 March 2014 в 12:40

3 ответа

Вот что я почерпнул из info grub и этого урока grub.

Короче говоря, да, если вы измените файл /boot/grub/grub.cfg, загрузчик grub2 будет читать эти изменения и действовать соответственно.

Оговорка заключается в том, что если вы сделаете крошечную опечатку, ваша система не загрузится (хотя сам grub2 будет запущен, и вы можете использовать оболочку grub для загрузки с тремя командами, если знаете, что вы делаете). Поэтому вместо фактического редактирования загрузочной записи внутри grub.cfg, дублируйте ее и укажите новое имя для нового menuentry.If новый загружается правильно, вы можете либо сделать его новым по умолчанию (см. Ниже), либо удалить старый один. Усложнение состоит в том, что по умолчанию, когда Ubuntu подталкивает обновление grub или ядра, он полностью перезаписывает grub.cfg (через скрипт оболочки / usr / sbin / update-grub2). Поэтому, если вы вручную замените grub.cfg на загрузку настраиваемого ядра, эти изменения могут быть перезаписаны.

В этом случае, вместо того, чтобы возиться с grub.cfg, добавьте пользовательскую команду меню ядра в конец /etc/grub.d/40_custom и запустите #sudo update-grub2 [!d13 ]

(Это гарантирует, что ваше пользовательское ядро ​​всегда будет находиться в файле grub.cfg grub даже в случае наличия обновлений grub или ядра, продвигаемых Ubuntu).

Вам все равно необходимо убедиться, что ваше ядро загружается по умолчанию. Сделайте это, отредактировав файл / etc / default / grub

Измените строку

GRUB-DEFAULT=0

на

GRUB-DEFAULT='My super duper kernel 3.11.xxx'

, где указанная строка - это именно то, что находится в кавычках для соответствующего пункта в grub.cfg

Возможно, вам придется снова запустить update-grub2.

Все, все готово.

Пример:

У меня есть следующее ядро ​​и initrd:

vmlinuz-3.11.0-18-generic

initrd.img-3.11.0-18-generic

и вы хотите вместо этого загружать Следующее пользовательское ядро ​​по умолчанию

my_super_duper_kernel_3.11

initrd.img-my_super_duper_kernel_3.11

1) Я просматриваю / boot / grub / grub / cfg для текущей записи. (Обратите внимание: в каждом меню нет много несущественного материала - см. Конец этого сообщения для голых костей).

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os
$menuentry_id_option 'gnulinux-simple-83af7d46-f6f8-4161-b7a4-47c44de0dd5e' {


... stuff deleted for brevity...

#this specifies first hard disk, first partition (i have a separate /boot partition)    
set root='hd0,msdos1'

linux   /vmlinuz-3.11.0-18-generic root=/dev/mapper/linuxlvm-lvubuntu ro   quiet splash $vt_handoff

initrd  /initrd.img-3.11.0-18-generic

}

2) Я добавляю элемент меню в / etc /grub.d/40_custom, заменив новое имя меню, образ ядра и initrd:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

#menu entry changed. It can be anything as long as it's unique
menuentry 'my_super_duper_kernel_3.11' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-83af7d46-f6f8-4161-b7a4-47c44de0dd5e' {


set root='hd0,msdos1'

#kernel image here must match the one in /boot
linux   /my_super_duper_kernel_3.11 root=/dev/mapper/linuxlvm-lvubuntu ro   quiet 

splash $vt_handoff

#initrd image, if you use one
initrd  /initrd-my_super_duper_kernel_3.11

#don't forget the closing bracket
}

3) запустите #sudo update-grub2

4) перезагрузитесь. вы увидите новое ядро ​​внизу списка загрузчиков.

5) Внесите его по умолчанию, отредактировав строку по умолчанию в / etc / default / grub. Он должен точно соответствовать тому, что вы положили в кавычки в /etc/grub.d/40_custom сразу после menuentry=

GRUB-DEFAULT='My super duper kernel 3.11'

6) Не уверен, если это необходимо, но не повредит повторному запуску ` #sudo update-grub2

Фоновая информация:

Способ вокруг этого `Загрузочный загрузчик называется grub2, но разговорное слово ppl все еще вызывает его grub. Поэтому, если вы обратитесь за помощью в Google, обязательно выполните поиск именно для grub2. Googling просто «grub» принесет некоторую устаревшую информацию о старом загрузчике grub (который все еще используется, но переименован в «grub-legacy»).

Как он знает: Grub2 состоит из крошечной части (boot.img), который установлен (как правило, на MBR вашего диска) и жестко закодировал в нем места на вашем диске файла grub.cfg и больше программного обеспечения (core.img и различные файлы * .mod), которые фактически загрузите ядро ​​Linux. Поэтому boot.img знает, как найти core.img, который, в свою очередь, будет читать grub.cfg

grub.cfg создается сценарием оболочки / usr / sbin / update-grub2. Он выполняет все исполняемые скрипты в /etc/grub.d/ (в алфавитном порядке, поэтому 10_linux выполняется до 40_custom и т. Д.) И отправляет свои выходы в grub.cfg

Как он знает: Если вы не используете нестандартные файловые системы или оборудование, вам потребуется всего несколько строк для загрузки ядра Linux на стандартный ПК с grub. Другой материал для графических экранов заставки, и я не знаю, что еще (было протестировано с помощью раздела ext4 / boot и / in lvm-ext4):

menuentry 'foo' {
set root='hd0,msdos1' #depends on your partitioning scheme 

linux   /kernel_image root=/dev/mapper/linuxlvm-lvubuntu ro  
#root= should be set to whatever /etc/fstab (or the mount command) says for the device that / is mounted on.

#initrd image, if you use one
initrd  /initrd-my_super_duper_kernel_3.11
}
2
ответ дан 24 May 2018 в 10:40

Он не знает. Он ищет только определенные файлы (initrd*, vmlinuz*) внутри каталога /boot и записывает файл конфигурации (/boot/grub/grub.cfg). Вы можете обновить этот файл, используя

sudo update-grub2

или

sudo grub2-mkconfig -o /boot/grub/grub.cfg

. Затем на этапе загрузки GRUB просматривает файл и использует информацию, которую он там размещает. Это просто.

Пример вывода:

$ sudo update-grub2 Generating grub.cfg ... Found linux image: /boot/vmlinuz-3.11.0-18-generic Found initrd image: /boot/initrd.img-3.11.0-18-generic Found memtest86+ image: /memtest86+.bin No volume groups found done
1
ответ дан 24 May 2018 в 10:40
  • 1
    Извините, я очень наивна в этом. Когда я открыл файл grub.cfg, первым пунктом меню был тот, который был загружен, и этот пункт был тем, который я перекомпилировал и загрузил. Так что, если я изменю его на другой образ, это сработает? Я имею в виду, загрузит ли он новое изображение? – akshay 18 March 2014 в 13:11
  • 2
    Вы должны смотреть в терминал, когда компилируете свои ядра. Если он показывает вывод, например found initrd image..., ваше новое ядро, вероятно, будет в конфигурации. Но, конечно, просто запускайте sudo update-grub2 каждый раз после перекомпиляции. Это не вредная команда. – Danatela 18 March 2014 в 13:17

Чтобы подробно рассказать о ответе Данателы, в /etc/grub.d/ существуют вспомогательные скрипты grub-mkconfig, которые определяют, где GRUB должен искать ядра (10_linux), и если в него должны быть включены другие операционные системы (30_os-prober выключен, добавив GRUB_DISABLE_OS_PROBER=true в /etc/default/grub).

Вы можете посмотреть код в 10_linux, чтобы получить представление о том, как GRUB «находит» ядра и пытается их включить, или добавьте свой собственный код в 40_custom, что может быть немного затруднительным, поскольку код 10_linux выглядит довольно сложным и непростым для настройки.

0
ответ дан 24 May 2018 в 10:40
  • 1
    Понял. В любом случае я хотел вернуться к моему предыдущему ядру. Я хочу сказать, что хочу, чтобы мой grub загружал более старое ядро, а не тот, который он использует. Так должен ли я поставить код предыдущей версии в 40_custom выше, чем тот, который уже есть? Или как сделать загрузку grub предыдущей? – akshay 18 March 2014 в 15:24

Другие вопросы по тегам:

Похожие вопросы: