Загрузчик systemd: различия между версиями
Дым (обсуждение | вклад) Нет описания правки |
Дым (обсуждение | вклад) |
||
(не показано 158 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
[[Категория:Systemd]] | |||
[[Категория:Загрузчики]] | |||
[[Файл:Systemd-boot-new.jpg|thumb|600px|Для отмены обратного отсчёта выбран пункт не по умолчанию.]] | |||
{{span|font-size: 180%|Загрузчик systemd (только для UEFI)}} | {{span|font-size: 180%|Загрузчик systemd (только для UEFI)}} | ||
==Подготовка== | |||
Удостоверьтесь, что раздел ESP существует и смонтирован: | |||
<strong># mount | awk '/\/boot\/efi/{print $1}'</strong> | |||
<pre>/dev/что-нибудь</pre> | |||
{{Памятка|Если вывод команды пуст, дальше читать не имеет смысла.}} | |||
{{Совет|Заранее создайте каталоги для размещения загрузчиков, образов и настроек меню:<br/>{{cmd|# mkdir -p /boot/efi/{kernels,loader/entries} }}}} | |||
==Установка== | |||
Состоит в: | Состоит в: | ||
* размещении пар «загрузчик + образ ядра» в произвольном (под)каталоге | * отдаче команды {{cmd|# bootctl install}}, которая разместит загрузчик systemd по нужному маршруту в разделе ESP (порой приходится добавить опцию с полным маршрутом, но меня это миновало); | ||
* создании/правке конфигурационных файлов по намертво прибитым маршрутам (см. '''Настройку''' | * размещении пар «загрузчик + образ ядра» в произвольном (под)каталоге этого раздела; | ||
* создании/правке конфигурационных файлов по намертво прибитым маршрутам (см. '''Настройку'''). | |||
==Настройка== | |||
Каждый пункт меню | Каждый пункт меню (кроме автоопределяемого загрузчика Windows) настраивается отдельным файлом. В моём случае их два: для прежнего и свежего ядра (маршрут к каталогу именно таков, имена же файлов произвольные — обязательно лишь расширение <code>.conf</code>): | ||
{| class="mw-collapsible mw-collapsed wikitable" | |||
!/boot/efi/loader/entries/alt-5.10.217-std.conf | |||
|- | |||
|<pre> | |||
title ALT Linux | |||
linux kernels/vmlinuz-5.10.217-std-def-alt1 | |||
initrd kernels/initrd-5.10.217-std-def-alt1.img | |||
version 5.10.217-std | |||
options loop.max_part=16 root=/dev/disk/by-label/root rw initrd=\EFI\kernels\intel-ucode.img | |||
</pre> | |||
|} | |||
{| class="mw-collapsible mw-collapsed wikitable" | |||
!/boot/efi/loader/entries/alt-6.1.85-un.conf | |||
|- | |||
|<pre> | |||
title ALT Linux | |||
linux kernels/vmlinuz-6.1.85-un-def-alt1 | |||
initrd kernels/initrd-6.1.85-un-def-alt1.img | |||
version 6.1.85-un | |||
options loop.max_part=16 clearcpuid=514 | |||
</pre> | |||
|} | |||
В каждом из них три обязательных строки: | |||
#название пункта — как оно должно выглядеть на экране загрузки; | |||
#маршрут до загрузчика; | |||
#маршрут до образа системы; | |||
…и пара опциональных: | |||
*версия ядра — при наличии одноимённых пунктов выводится в скобках после имени; | |||
*передача опций ядру — к примеру: | |||
*:*задать число разделов для монтирования iso-образов, | |||
*:*обойти заморочки AMD-графики, | |||
*:*указать корневой раздел, | |||
*:*подгрузить образ с микрокодом процессора (мне пользоваться не доводилось) | |||
*:и т.п. | |||
Параметры загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы): | |||
{| class="mw-collapsible mw-collapsed wikitable" | |||
!/boot/efi/loader/loader.conf | |||
|- | |||
|<pre> | |||
timeout 4 | |||
default alt-* | |||
console-mode max | |||
editor yes | |||
</pre> | |||
|} | |||
Здесь указаны: | |||
* секунды предзагрузочной задержки, | |||
* пункт загрузки по умолчанию (по сути — имя/маска файла с пунктом меню без расширения <code>.conf</code>), | |||
* попытка выставить разрешение экрана на максимально доступное, | |||
* возможность внесения изменений в выбранный пункт до загрузки (опционально, разрешено по умолчанию). | |||
Если же есть потребность в загрузке по умолчанию именно Windows, можно создать отдельный файл с соответствующим пунктом — скажем: | |||
{| class="mw-collapsible mw-collapsed wikitable" | |||
!/boot/efi/loader/entries/windows.conf | |||
|- | |||
|<pre> | |||
title Windows Boot Manager | |||
efi \EFI\Microsoft\Boot\Bootmgfw.efi | |||
</pre> | |||
|} | |||
А в <code>/boot/efi/loader/loader.conf</code> опции <code>default</code> присвоить значение <code>windows</code>. | |||
* <code>/boot/efi/ | ==Обновление ядра== | ||
< | После установки нового ядра и сноса старых приходится: | ||
* удалить из <code>/boot/efi/kernels/</code> (или где решите их держать) дезинсталлированные ядра; | |||
* скопировать туда загрузчик и образ нового ядра — <code>/boot/vmlinuz-<релиз></code> и <code>/boot/initrd-<релиз>.img</code>; | |||
* добавить конфиг нового ядра в каталог <code>/boot/efi/loader/entries/</code>, скопировав и изменив (или просто изменив — мой случай) конфиг старого, снесённого; | |||
</ | * нацелить опцию default в файле <code>/boot/efi/loader/loader.conf</code> на конфиг нового ядра (если имя файла менялось); | ||
* <code>/boot/efi/loader/entries/ | * перезагрузиться; | ||
* при несрабатывании нового пункта загрузить предыдущее ядро и разобраться, где опечатались. | |||
===Минусы=== | |||
Ручное внесение изменений (в отличие от [[GRUB]]) как в каждый новый пункт загрузчика с удалением устаревших, так и в его общее меню (если имена файлов с пунктами меняются), что чревато невозможностью загрузки криво отредактированного пункта. | |||
initrd | {{Внимание|Не следует сносить с эфи-раздела предыдущее заведомо рабочее ядро и менять его конфигурацию в меню загрузчика как минимум до успешного запуска и какой ни есть обкатки нового: сам делаю это вручную в обеспечение гарантированной загрузки на всякий случай — вместо того, чтоб доработать скрипт <code>/usr/sbin/remove-old-kernels</code> или добавить в него отдельный скрипт зачистки.}} | ||
# | {{Памятка|Ребята из Тим давно-о обещают вот-вот добавить автогенерацию менюшки для этого варианта загрузки (ведь проксмокс с этим как-то справляется).}} | ||
А пока не сделано, накостылил собственный скриптец (с учётом валявшейся рядом бубунты — давно избавился, но сугубо для примера), который вызываю после каждого обновления ядра или перестройки образа <code>initrd</code> в обоих дистрах: | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!/boot/sysbootgen | |||
|- | |||
|<source lang="bash"> | |||
#!/bin/sh | |||
# SystemD boot menu entries generator for ALT Linux & Ubuntu | |||
SRC=/boot | |||
ESP=$SRC/efi | |||
DST=$ESP/kernels | |||
CFG=$ESP/loader/entries | |||
[ -d $DST -a -d $CFG ] || mkdir -p $ESP/{kernels,loader/entries} | |||
mkconf(){ | |||
MENU="title $NAME | |||
version $VERS | |||
linux kernels/$BASE | |||
initrd kernels/$INIT | |||
options loop.max_part=16" | |||
echo "$MENU" >$CONF | |||
} | |||
mkall(){ | |||
[ -f $SRC/$INIT ] || continue | |||
[ -f $DST/$INIT ] || cp $SRC/$INIT $DST/ | |||
[ -f $DST/$BASE ] || cp $SRC/$BASE $DST/ | |||
[ -f $CONF ] || mkconf | |||
} | |||
for FILE in $SRC/vmlinuz-*; do | |||
BASE=`basename $FILE` | |||
KERN=`echo $BASE | cut -d- -f2-` | |||
case $BASE in | |||
*-def-*) | |||
NAME="ALT Linux" | |||
VERS=`echo $KERN | sed 's|-def-.*||'` | |||
INIT=initrd-$KERN.img | |||
CONF=$CFG/alt-$VERS.conf | |||
;; | |||
*-generic) | |||
NAME="Ubuntu" | |||
VERS=`echo $KERN | sed 's|-generic||'` | |||
INIT=initrd.img-$KERN | |||
CONF=$CFG/ubuntu-$VERS.conf | |||
;; | |||
*) continue | |||
esac | |||
case $VERS in | |||
*-*) mkall | |||
esac | |||
done | |||
</source> | </source> | ||
|} | |||
== | ==Отстрел неприятностей (трабл-шутинг)== | ||
Пока только одной — на некоторых материнках Windows заменяет очередность загрузчиков, выставляя себя первой по порядку. | |||
Лечится из самой Windows следующей командой от имени админа (можно оформить батником): | |||
bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi | |||
То есть, Windows всё же грузится первой системой, однако загрузчика выбирает не собственного, а systemd-шного. | |||
Исходя из чего специально возиться с настройкой отдельного пункта меню для загрузчика Windows не вижу смысла: Windows и так будет грузиться по умолчанию — без вышеописанных манипуляций. | |||
==Ссылки== | |||
[[ | Более подробно можно почитать [https://wiki.archlinux.org/index.php/Systemd-boot_(Русский) здесь] (наткнулся уже после того, как вышеизложенное было таки вышеизложено :). | ||
=Обратная связь= | |||
*[https://t.me/gbIMoBou @gbIMoBou] | |||
*[[Участник:Дым#Заметки|Другие статьи]] |
Текущая версия от 12:29, 30 июня 2024
Загрузчик systemd (только для UEFI)
Подготовка
Удостоверьтесь, что раздел ESP существует и смонтирован:
# mount | awk '/\/boot\/efi/{print $1}'
/dev/что-нибудь
Установка
Состоит в:
- отдаче команды # bootctl install, которая разместит загрузчик systemd по нужному маршруту в разделе ESP (порой приходится добавить опцию с полным маршрутом, но меня это миновало);
- размещении пар «загрузчик + образ ядра» в произвольном (под)каталоге этого раздела;
- создании/правке конфигурационных файлов по намертво прибитым маршрутам (см. Настройку).
Настройка
Каждый пункт меню (кроме автоопределяемого загрузчика Windows) настраивается отдельным файлом. В моём случае их два: для прежнего и свежего ядра (маршрут к каталогу именно таков, имена же файлов произвольные — обязательно лишь расширение .conf
):
/boot/efi/loader/entries/alt-5.10.217-std.conf |
---|
title ALT Linux linux kernels/vmlinuz-5.10.217-std-def-alt1 initrd kernels/initrd-5.10.217-std-def-alt1.img version 5.10.217-std options loop.max_part=16 root=/dev/disk/by-label/root rw initrd=\EFI\kernels\intel-ucode.img |
/boot/efi/loader/entries/alt-6.1.85-un.conf |
---|
title ALT Linux linux kernels/vmlinuz-6.1.85-un-def-alt1 initrd kernels/initrd-6.1.85-un-def-alt1.img version 6.1.85-un options loop.max_part=16 clearcpuid=514 |
В каждом из них три обязательных строки:
- название пункта — как оно должно выглядеть на экране загрузки;
- маршрут до загрузчика;
- маршрут до образа системы;
…и пара опциональных:
- версия ядра — при наличии одноимённых пунктов выводится в скобках после имени;
- передача опций ядру — к примеру:
- задать число разделов для монтирования iso-образов,
- обойти заморочки AMD-графики,
- указать корневой раздел,
- подгрузить образ с микрокодом процессора (мне пользоваться не доводилось)
- и т.п.
Параметры загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы):
/boot/efi/loader/loader.conf |
---|
timeout 4 default alt-* console-mode max editor yes |
Здесь указаны:
- секунды предзагрузочной задержки,
- пункт загрузки по умолчанию (по сути — имя/маска файла с пунктом меню без расширения
.conf
), - попытка выставить разрешение экрана на максимально доступное,
- возможность внесения изменений в выбранный пункт до загрузки (опционально, разрешено по умолчанию).
Если же есть потребность в загрузке по умолчанию именно Windows, можно создать отдельный файл с соответствующим пунктом — скажем:
/boot/efi/loader/entries/windows.conf |
---|
title Windows Boot Manager efi \EFI\Microsoft\Boot\Bootmgfw.efi |
А в /boot/efi/loader/loader.conf
опции default
присвоить значение windows
.
Обновление ядра
После установки нового ядра и сноса старых приходится:
- удалить из
/boot/efi/kernels/
(или где решите их держать) дезинсталлированные ядра; - скопировать туда загрузчик и образ нового ядра —
/boot/vmlinuz-<релиз>
и/boot/initrd-<релиз>.img
; - добавить конфиг нового ядра в каталог
/boot/efi/loader/entries/
, скопировав и изменив (или просто изменив — мой случай) конфиг старого, снесённого; - нацелить опцию default в файле
/boot/efi/loader/loader.conf
на конфиг нового ядра (если имя файла менялось); - перезагрузиться;
- при несрабатывании нового пункта загрузить предыдущее ядро и разобраться, где опечатались.
Минусы
Ручное внесение изменений (в отличие от GRUB) как в каждый новый пункт загрузчика с удалением устаревших, так и в его общее меню (если имена файлов с пунктами меняются), что чревато невозможностью загрузки криво отредактированного пункта.
А пока не сделано, накостылил собственный скриптец (с учётом валявшейся рядом бубунты — давно избавился, но сугубо для примера), который вызываю после каждого обновления ядра или перестройки образа initrd
в обоих дистрах:
/boot/sysbootgen |
---|
#!/bin/sh
# SystemD boot menu entries generator for ALT Linux & Ubuntu
SRC=/boot
ESP=$SRC/efi
DST=$ESP/kernels
CFG=$ESP/loader/entries
[ -d $DST -a -d $CFG ] || mkdir -p $ESP/{kernels,loader/entries}
mkconf(){
MENU="title $NAME
version $VERS
linux kernels/$BASE
initrd kernels/$INIT
options loop.max_part=16"
echo "$MENU" >$CONF
}
mkall(){
[ -f $SRC/$INIT ] || continue
[ -f $DST/$INIT ] || cp $SRC/$INIT $DST/
[ -f $DST/$BASE ] || cp $SRC/$BASE $DST/
[ -f $CONF ] || mkconf
}
for FILE in $SRC/vmlinuz-*; do
BASE=`basename $FILE`
KERN=`echo $BASE | cut -d- -f2-`
case $BASE in
*-def-*)
NAME="ALT Linux"
VERS=`echo $KERN | sed 's|-def-.*||'`
INIT=initrd-$KERN.img
CONF=$CFG/alt-$VERS.conf
;;
*-generic)
NAME="Ubuntu"
VERS=`echo $KERN | sed 's|-generic||'`
INIT=initrd.img-$KERN
CONF=$CFG/ubuntu-$VERS.conf
;;
*) continue
esac
case $VERS in
*-*) mkall
esac
done
|
Отстрел неприятностей (трабл-шутинг)
Пока только одной — на некоторых материнках Windows заменяет очередность загрузчиков, выставляя себя первой по порядку.
Лечится из самой Windows следующей командой от имени админа (можно оформить батником):
bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi
То есть, Windows всё же грузится первой системой, однако загрузчика выбирает не собственного, а systemd-шного.
Исходя из чего специально возиться с настройкой отдельного пункта меню для загрузчика Windows не вижу смысла: Windows и так будет грузиться по умолчанию — без вышеописанных манипуляций.
Ссылки
Более подробно можно почитать здесь (наткнулся уже после того, как вышеизложенное было таки вышеизложено :).