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

Я не понимаю, как это узнает который изображение ядра загрузиться? У меня есть так многие. После того как я создал свое собственное ядро и перекомпилировал. Как это узнает это, это - то для загрузки?

2
задан 18 March 2014 в 10:40

4 ответа

Отвечать на Ваш заключительный вопрос:

можно поместить новый menuentry где угодно в/etc/grub.d/40_custom.

Тогда редактирование/etc/default/grub и изменение ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ к имя из menuentry, которые Вы добавили к 40_custom. (Используя имя, а не 0-индексируемое число является лучшим, потому что оно допускает возможность большего количества изображений ядра, добавляемых или удаленных позже: см. grub2 infopage).

Тогда удостоверяются для выполнения sudo update-grub2 (или изменения не будут записаны в grub.cfg).

Обоснование: 40_custom добавляется для расчистки меню под любыми изображениями ядра, которые находит личинка-update2, таким образом, порядок в 40_custom не будет сверхъязь ядра, найденные 10_linux.

0
ответ дан 8 October 2019 в 11:19

Это не знает. Это только ищет определенные файлы (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
ответ дан 8 October 2019 в 11:19

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

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

0
ответ дан 8 October 2019 в 11:19

Вот то, что я подобрал из информационной личинки и этого учебного руководства по личинке.

Рассказ - то, что, да, при изменении/boot/grub/grub.cfg файла grub2 загрузчик считает те изменения и действие соответственно.

  • Протест состоит в том, что при создании крошечной опечатки система не загрузится, (хотя сам grub2 будет работать, и можно использовать оболочку личинки для начальной загрузки с тремя командами, если Вы знаете то, что Вы делаете). Таким образом вместо того, чтобы на самом деле редактировать запись загрузки в grub.cfg, копируйте его и дайте новое название нового menuentry. Если новый загружается правильно, можно или сделать его новым значением по умолчанию (см. ниже), или удалите старый.

  • Сложность - то, что по умолчанию, каждый раз, когда Ubuntu продвигает личинку или ядро, обновляют его, полностью переписывает grub.cfg (с помощью сценария оболочки/usr/sbin/update-grub2). Таким образом, при изменении grub.cfg вручную для начальной загрузки пользовательского ядра, те изменения могли бы быть перезаписаны.

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

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

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

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

GRUB-DEFAULT=0

кому:

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

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

Вы, возможно, должны выполнить обновление-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 - посмотрите конец этого сообщения для базового).

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, заменяя новым именем menuentry, изображением ядра и 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) Не уверенный, если необходимо, но не повредит повторно выполнять обновление-grub2 '#sudo

Вводная информация:

Терминология: 'Загрузчик называют grub2, но в разговорной речи люди все еще называют его 'личинкой'. Таким образом, если Вы гуглите для справки на предмете, удостоверьтесь, что искали специально для grub2. Поиск с помощью Google просто 'копается', поднимет некоторую устаревшую информацию о старом загрузчике личинки (который все еще используется, но переименованный в 'наследие личинки').

Как это знает: Grub2 состоит из крошечной части программного обеспечения (boot.img), который установлен (обычно на MBR Вашего диска) и имеет hardcoded в него местоположения на Вашем диске 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 на стандартном ПК с личинкой. Другой материал для графических экранов-заставок, и я не знаю что еще (следующее было протестировано с разделом начальной загрузки ext4 / и / в 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
ответ дан 2 December 2019 в 03:04

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

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