Загрузчик systemd: различия между версиями
Дым (обсуждение | вклад) |
Дым (обсуждение | вклад) |
||
Строка 46: | Строка 46: | ||
<code>version</code> опциональна и выводится в скобках после имени при наличии одноимённых пунктов. | <code>version</code> опциональна и выводится в скобках после имени при наличии одноимённых пунктов. | ||
{{Примечание|Как видно по второму файлу, ядру можно передавать опции — к примеру, подгрузить образ с микрокодом процессора (мне пользоваться не доводилось) и т.п.}} | {{Примечание|Как видно по второму файлу, ядру можно передавать опции — к примеру, подгрузить образ с микрокодом процессора (мне пользоваться не доводилось) и т.п.}} | ||
Опции загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы) | Опции загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы): | ||
<pre> | {| class="mw-collapsible mw-collapsed wikitable" | ||
!/boot/efi/loader/loader.conf | |||
|- | |||
|<pre> | |||
timeout 4 | timeout 4 | ||
default alt-* | default alt-* | ||
Строка 53: | Строка 56: | ||
editor yes | editor yes | ||
</pre> | </pre> | ||
|} | |||
Здесь указаны: | Здесь указаны: | ||
* секунды предзагрузочной задержки, | * секунды предзагрузочной задержки, |
Версия от 15:38, 6 июля 2023
Загрузчик systemd (только для UEFI)
Подготовка
Удостоверьтесь, что раздел ESP существует и смонтирован по маршруту /boot/efi/
:
# mount | awk '/\/boot\/efi/{print $1}'
/dev/sdb1
sdb1 — у меня; у вас может быть другой диск и раздел.
# mkdir -p /boot/efi/{kernels,loader/entries}
Установка
Состоит в:
- отдаче команды
# bootctl install
, которая разместит загрузчик systemd по нужному маршруту в разделе ESP (порой приходится добавить опцию с полным маршрутом, но меня это миновало); - размещении пар «загрузчик + образ ядра» в произвольном (под)каталоге этого раздела;
- создании/правке конфигурационных файлов по намертво прибитым маршрутам (см. Настройку).
Настройка
Каждый пункт меню, кроме автоопределяемого загрузчика Windows, настраивается отдельным файлом. В моём случае их два — для прежнего и свежего ядра (маршрут к каталогу именно таков, имена же файлов произвольные; обязательно лишь расширение .conf
):
/boot/efi/loader/entries/alt-5.1.16-undef.conf |
---|
title ALT Linux version 5.1.16 linux kernels/vmlinuz-5.1.16-un-def-alt2 initrd kernels/initrd-5.1.16-un-def-alt2.img options loop.max_part=16 clearcpuid=514 |
/boot/efi/loader/entries/alt-5.1.17-undef.conf |
---|
title ALT Linux
version 5.1.17
linux kernels/vmlinuz-5.1.17-un-def-alt1
initrd kernels/initrd-5.1.17-un-def-alt1.img
#options root=/dev/disk/by-label/root rw initrd=\EFI\kernels\intel-ucode.img
|
В каждом из них 3 обязательных строки:
- название пункта — как оно должно выглядеть на экране загрузки,
- маршрут до загрузчика и
- маршрут до образа системы.
version
опциональна и выводится в скобках после имени при наличии одноимённых пунктов.
Опции загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы):
/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 ] || mkdir $DST
[ -d $CFG ] || mkdir -p $CFG
for FILE in $SRC/vmlinuz-*; do
BASE=`basename $FILE`
KERN=`echo $BASE | cut -d- -f2-`
case $BASE in
*-def-*)
DIST=alt
NAME="ALT Linux"
VERS=`echo $KERN | sed 's|-def-.*||'`
INIT=initrd-$KERN.img
unset ROOT
;;
*-generic)
DIST=ubuntu
NAME=Ubuntu
VERS=`echo $KERN | sed 's|-generic||'`
INIT=initrd.img-$KERN
ROOT="options root=/dev/disk/by-label/root" # указать метку/UUID корневого раздела
;;
*) continue
esac
[ -f $SRC/$INIT ] || continue
[ -f $DST/$INIT ] || cp $SRC/$INIT $DST/
[ -f $DST/$BASE ] || cp $SRC/$BASE $DST/
CONF=$CFG/$DIST-$VERS.conf
[ -f $CONF ] || {
echo "title $NAME
version $VERS
linux kernels/$BASE
initrd kernels/$INIT
$ROOT" >$CONF
}
done
|
Более новый с учётом валявшейся рядом бубунты (давно избавился, но сугубо для примера):
/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 ] || mkdir $DST
[ -d $CFG ] || mkdir -p $CFG
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
|
Правда, старые ядра из эфи-раздела по-прежнему удаляю вручную в обеспечение гарантированной загрузки со старого ядра при каких-либо затруднениях с новым. Хотя можно доработать скрипт /usr/sbin/remove-old-kernels
.
Устранение проблем
Пока только одной — Windows заменяет очередность загрузчиков даже на запароленном UEFI, выставляя себя первой по порядку. Лечится из самой Windows следующей командой от имени админа (можно оформить батником):
bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi
То есть, Windows всё же грузится первой системой, однако загрузчика выбирает не собственного, а systemd-шного.
Исходя из чего специально возиться с настройкой отдельного пункта меню для загрузчика Windows не вижу смысла: Windows и так будет грузиться по умолчанию — без вышеописанных манипуляций.
Ссылки
Более подробно можно почитать здесь (наткнулся уже после того, как вышеизложенное было таки вышеизложено :).