Загрузчик systemd: различия между версиями

Материал из ALT Linux Wiki
Строка 68: Строка 68:


UPD2: уже давно обещают... И пока не сделано, накостылил собственный <code>sysbootgen</code>:
UPD2: уже давно обещают... И пока не сделано, накостылил собственный <code>sysbootgen</code>:
<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 ] || mkdir    $DST
[ -d $CFG ] || mkdir -p $CFG
mkconf(){
    MENU="title $NAME
version $VERS
linux  kernels/$BASE
initrd  kernels/$INIT"
#options zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=25 zswap.zpool=z3fold
#options root=/dev/disk/by-label/root rw initrd=\EFI\altlinux\intel-ucode.img
    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>


==Устранение проблем==
==Устранение проблем==

Версия от 03:49, 14 января 2022

Для отмены обратного отсчёта выбран пункт не по умолчанию.

Загрузчик 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-prev.conf

title   ALT Linux 5.1.16
linux   kernels/vmlinuz-5.1.16-un-def-alt2
initrd   kernels/initrd-5.1.16-un-def-alt2.img

/boot/efi/loader/entries/alt-next.conf

title   ALT Linux 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 обязательных строки:

  • название пункта — как оно должно выглядеть на экране загрузки,
  • маршрут до загрузчика и
  • маршрут до образа системы.
Примечание: Как видно по второму файлу, ядру можно передавать опции — к примеру, подгрузить образ с микрокодом процессора (мне пользоваться не доводилось) и т.п.

Опции загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы) /boot/efi/loader/loader.conf:

timeout 4
default alt-next
console-mode max

Здесь указаны:

  • пункт загрузки по умолчанию (по сути — имя файла с пунктом меню без расширения .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) как в каждый новый пункт загрузчика с удалением устаревших, так и в его общее меню (если имена файлов с пунктами меняются), что чревато невозможностью загрузки криво отредактированного пункта.

Внимание: Не следует удалять гарантированно загружаемое предыдущее установленное ядро и менять его конфигурацию в меню загрузчика как минимум до успешного запуска нового.

UPD: ребята из Тим обещают вот-вот добавить автогенерацию менюшки для этого варианта загрузки.

UPD2: уже давно обещают... И пока не сделано, накостылил собственный 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 zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=25 zswap.zpool=z3fold
#options root=/dev/disk/by-label/root rw initrd=\EFI\altlinux\intel-ucode.img
    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 заменяет очередность загрузчиков даже на запароленном UEFI, выставляя себя первой по порядку. Лечится из самой Windows следующей командой от имени админа:

bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi

То есть, Windows всё же грузится первой системой, однако загрузчика выбирает не собственного, а systemd-шного.

Исходя из этого, специально возиться с настройкой отдельного пункта меню для загрузчика Windows не вижу смысла: без описанных здесь манипуляций Windows и так будет грузиться по умолчанию.

Ссылки

Более подробно можно почитать здесь (наткнулся уже после того, как вышеизложенное было таки вышеизложено :).