Привет! В ходе обсуждения с Димой и Глебом появилась идея сделать условную фичу kexec, которая бы позволяла создавать из образа kexec-based bootloader. В основном прицел идёт на EFI. Схема работы тут также как с рутом, но для /boot. Находим нужные модули для него а в runtime ищем этот раздел, но вместо переключения туда читаем конфиг оттуда, показываем менюшку и делаем kexec на выбранное ядро. Поиск для не-рута и так уже давно есть. Необходимо лишь добавить новую логику для выхода из initrd после нахождения /boot. Pros: * bootloader не пытается дублировать реализации lvm/raid/luks. * больше возможностей для кастомизации стадии загрузчика. Cons: * не-EFI загрузка. Для MBR всё равно нужен загружен (lilo/grub). * более сложный загрузчик - выше шанс получить не загружаемую систему. * медленнее? -- Rgrds, legion
On Mon, Mar 09, 2020 at 05:02:28PM +0100, Alexey Gladkov wrote:
> Привет!
>
> В ходе обсуждения с Димой и Глебом появилась идея сделать условную фичу
> kexec, которая бы позволяла создавать из образа kexec-based bootloader. В
> основном прицел идёт на EFI.
>
> Схема работы тут также как с рутом, но для /boot. Находим нужные модули
> для него а в runtime ищем этот раздел, но вместо переключения туда читаем
> конфиг оттуда, показываем менюшку и делаем kexec на выбранное ядро.
>
> Поиск для не-рута и так уже давно есть. Необходимо лишь добавить новую
> логику для выхода из initrd после нахождения /boot.
Я сделал первый вариант такой фичи [1]. С ней я смог выбрать ядро и
загрузить свою систему.
К сожалению без странностей не обошлось. У меня пока не получилось
зафиксировать initrd. Указание CONFIG_CMDLINE не помогает:
$ grep ^CONFIG_CMDLINE kernel.config
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="ro quiet initrd=\\EFI\\LINUX\\bootloader.img"
приходится указывать initrd через efi shell.
Также пакет пока не может собраться на aarch64.
--
Rgrds, legion
On Sun, Apr 05, 2020 at 09:09:17PM +0200, Alexey Gladkov wrote: > Я сделал первый вариант такой фичи [1]. С ней я смог выбрать ядро и > загрузить свою систему. > > К сожалению без странностей не обошлось. У меня пока не получилось > зафиксировать initrd. Указание CONFIG_CMDLINE не помогает: > > $ grep ^CONFIG_CMDLINE kernel.config > CONFIG_CMDLINE_BOOL=y > CONFIG_CMDLINE="ro quiet initrd=\\EFI\\LINUX\\bootloader.img" Потому что этот параметр разбирается до загрузки самого ядра [1]. Он передаётся либо через параметры, либо через efi сервис [2]. Необходимо написать враппер который сделает либо одно, либо другое. [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/firmware/efi/libstub/file.c#n257 [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/firmware/efi/libstub/x86-stub.c#n788 > приходится указывать initrd через efi shell. > Также пакет пока не может собраться на aarch64. Ограничил архитектуру до x86_64 потому что только на ней я её использую. -- Rgrds, legion