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

Материал из ALT Linux Wiki
 
(не показана 131 промежуточная версия этого же участника)
Строка 1: Строка 1:
[[Файл:Systemd-boot-menu.jpg|thumb|700px|Для отключения обратного отсчёта выбран пункт не по умолчанию.]]
[[Категория:Systemd]]
[[Категория:Загрузчики]]
[[Файл:Systemd-boot-new.jpg|thumb|600px|Для отмены обратного отсчёта выбран пункт не по умолчанию.]]
{{span|font-size: 180%|Загрузчик systemd (только для UEFI)}}
{{span|font-size: 180%|Загрузчик systemd (только для UEFI)}}
==Подготовка==
==Подготовка==
{{Совет|Удостоверьтесь, что раздел ESP существует и смонтирован по маршруту <code>/boot/efi/</code>:}}
Удостоверьтесь, что раздел ESP существует и смонтирован:
<source lang=bash># mount | awk '/\/boot\/efi/{print $1}'
 
/dev/sdb1</source>
<strong># mount | awk '/\/boot\/efi/{print $1}'</strong>
{{Внимание|Если вывод команды пуст, дальше читать не имеет смысла.}}
<pre>/dev/что-нибудь</pre>
sdb1 &mdash; у меня; у вас может быть другой диск и раздел.
{{Памятка|Если вывод команды пуст, дальше читать не имеет смысла.}}
{{Совет|Заранее создайте каталоги для размещения загрузчиков, образов и настроек меню:}}
{{Совет|Заранее создайте каталоги для размещения загрузчиков, образов и настроек меню:<br/>{{cmd|# mkdir -p /boot/efi/{kernels,loader/entries} }}}}
<source lang=bash># mkdir -p /boot/efi/{altlinux,loader/entries}</source>


==Установка==
==Установка==
Состоит в:
Состоит в:
* отдаче команды <code># bootctl install</code>, которая разместит загрузчик systemd по нужному маршруту в разделе ESP (порой приходится добавить опцию с полным маршрутом, но меня это миновало);
* отдаче команды {{cmd|# bootctl install}}, которая разместит загрузчик systemd по нужному маршруту в разделе ESP (порой приходится добавить опцию с полным маршрутом, но меня это миновало);
* размещении пар «загрузчик + образ ядра» в произвольном (под)каталоге этого раздела;
* размещении пар «загрузчик + образ ядра» в произвольном (под)каталоге этого раздела;
* создании/правке конфигурационных файлов по намертво прибитым маршрутам (см. '''Настройку''').
* создании/правке конфигурационных файлов по намертво прибитым маршрутам (см. '''Настройку''').


==Настройка==
==Настройка==
Каждый пункт меню, кроме автоопределяемого загрузчика Windows, настраивается отдельным файлом. В моём случае их два &mdash; для прежнего и свежего ядра (маршрут к каталогу именно таков, имена же файлов произвольные; обязательно лишь расширение <code>.conf</code>):
Каждый пункт меню (кроме автоопределяемого загрузчика Windows) настраивается отдельным файлом. В моём случае их два: для прежнего и свежего ядра (маршрут к каталогу именно таков, имена же файлов произвольные &mdash; обязательно лишь расширение <code>.conf</code>):
 
{| class="mw-collapsible mw-collapsed wikitable"
* <code>/boot/efi/loader/entries/altlinux-5.1.16.conf</code>
!/boot/efi/loader/entries/alt-5.10.217-std.conf &nbsp;
<source lang=bash>
|-
title  ALT Linux 5.1.16
|<pre>
linux  /altlinux/vmlinuz-5.1.16-un-def-alt2
title  ALT Linux
initrd   /altlinux/initrd-5.1.16-un-def-alt2.img
linux  kernels/vmlinuz-5.10.217-std-def-alt1
</source>
initrd kernels/initrd-5.10.217-std-def-alt1.img
* <code>/boot/efi/loader/entries/altlinux-5.1.17.conf</code>
version 5.10.217-std
<source lang=bash>
options loop.max_part=16 root=/dev/disk/by-label/root rw initrd=\EFI\kernels\intel-ucode.img
title  ALT Linux 5.1.17
</pre>
linux  /altlinux/vmlinuz-5.1.17-un-def-alt1
|}
initrd   /altlinux/initrd-5.1.17-un-def-alt1.img
{| class="mw-collapsible mw-collapsed wikitable"
#options root=/dev/disk/by-label/root rw initrd=\EFI\altlinux\intel-ucode.img
!/boot/efi/loader/entries/alt-6.1.85-un.conf &nbsp;
</source>
|-
 
|<pre>
В каждом из них 3 обязательных строки:
title  ALT Linux
* название пункта &mdash; как оно должно выглядеть на экране загрузки,
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
Опции загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы) <code>/boot/efi/loader/loader.conf</code>:
</pre>
<source>
|}
default altlinux-5.1.17
В каждом из них три обязательных строки:
timeout 5
#название пункта как оно должно выглядеть на экране загрузки;
editor 1
#маршрут до загрузчика;
</source>
#маршрут до образа системы;
…и пара опциональных:
*версия ядра — при наличии одноимённых пунктов выводится в скобках после имени;
*передача опций ядру — к примеру:
*:*задать число разделов для монтирования iso-образов,
*:*обойти заморочки AMD-графики,
*:*указать корневой раздел,
*:*подгрузить образ с микрокодом процессора (мне пользоваться не доводилось)
*:и т.п.
Параметры загрузки меняются через файл (маршрут и имя ровно таковы и более никаковы):
{| class="mw-collapsible mw-collapsed wikitable"
!/boot/efi/loader/loader.conf &nbsp;
|-
|<pre>
timeout      4
default     alt-*
console-mode max
editor       yes
</pre>
|}
Здесь указаны:
Здесь указаны:
* пункт загрузки по умолчанию (по сути &mdash; имя файла с пунктом меню без расширения <code>.conf</code>),
* секунды предзагрузочной задержки,
* секунды предзагрузочной задержки и
* пункт загрузки по умолчанию (по сути &mdash; имя/маска файла с пунктом меню без расширения <code>.conf</code>),
* возможность внесения изменений в выбранный пункт до загрузки (не знаю, у меня не срослось пока &mdash; необязательная опция, единичка по умолчанию).
* попытка выставить разрешение экрана на максимально доступное,
* возможность внесения изменений в выбранный пункт до загрузки (опционально, разрешено по умолчанию).
Если же есть потребность в загрузке по умолчанию именно Windows, можно создать отдельный файл с соответствующим пунктом — скажем:
{| class="mw-collapsible mw-collapsed wikitable"
!/boot/efi/loader/entries/windows.conf &nbsp;
|-
|<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/altlinux/</code> (или где решите их держать) дезинсталлированные ядра;
* удалить из <code>/boot/efi/kernels/</code> (или где решите их держать) дезинсталлированные ядра;
* скопировать туда загрузчик и образ нового ядра &mdash; <code>/boot/vmlinuz-<релиз></code> и <code>/boot/initrd-<релиз>.img</code>;
* скопировать туда загрузчик и образ нового ядра &mdash; <code>/boot/vmlinuz-<релиз></code> и <code>/boot/initrd-<релиз>.img</code>;
* добавить конфиг нового ядра в каталог <code>/boot/efi/loader/entries/</code>, скопировав и изменив или просто изменив (мой случай) конфиг старого, снесённого;
* добавить конфиг нового ядра в каталог <code>/boot/efi/loader/entries/</code>, скопировав и изменив (или просто изменив &mdash; мой случай) конфиг старого, снесённого;
* нацелив опцию default в файле <code>/boot/efi/loader/loader.conf</code> на конфиг нового ядра, перезагрузиться;
* нацелить опцию default в файле <code>/boot/efi/loader/loader.conf</code> на конфиг нового ядра (если имя файла менялось);
* перезагрузиться;
* при несрабатывании нового пункта загрузить предыдущее ядро и разобраться, где опечатались.
* при несрабатывании нового пункта загрузить предыдущее ядро и разобраться, где опечатались.
===Минусы===
Ручное внесение изменений (в отличие от [[GRUB]]) как в каждый новый пункт загрузчика с удалением устаревших, так и в его общее меню (если имена файлов с пунктами меняются), что чревато невозможностью загрузки криво отредактированного пункта.
{{Внимание|Не следует сносить с эфи-раздела предыдущее заведомо рабочее ядро и менять его конфигурацию в меню загрузчика как минимум до успешного запуска и какой ни есть обкатки нового: сам делаю это вручную в обеспечение гарантированной загрузки на всякий случай — вместо того, чтоб доработать скрипт <code>/usr/sbin/remove-old-kernels</code> или добавить в него отдельный скрипт зачистки.}}
{{Памятка|Ребята из Тим давно-о обещают вот-вот добавить  автогенерацию менюшки для этого варианта загрузки (ведь проксмокс с этим как-то справляется).}}
А пока не сделано, накостылил собственный скриптец (с учётом валявшейся рядом бубунты &mdash; давно избавился, но сугубо для примера), который вызываю после каждого обновления ядра или перестройки образа <code>initrd</code> в обоих дистрах:
{|class="mw-collapsible mw-collapsed wikitable"
!/boot/sysbootgen &nbsp;
|-
|<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(){
Ручное внесение изменений (в отличие от [[GRUB]]) как в общее меню загрузчика, так и в каждый его новый пункт с удалением устаревших, что чревато невозможностью загрузки криво отредактированного пункта.
    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>
|}
 
==Отстрел неприятностей (трабл-шутинг)==
Пока только одной &mdash; на некоторых материнках Windows заменяет очередность загрузчиков, выставляя себя первой по порядку.


==Устранение проблем==
Лечится из самой Windows следующей командой от имени админа (можно оформить батником):
Пока только одной &mdash; Windows заменяет очередность загрузчиков даже на запароленном UEFI, выставляя себя первой по порядку. Лечится из самой Windows следующей командой от имени админа:
bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi
<pre>bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi</pre>
То есть, Windows всё же грузится первой системой, однако загрузчика выбирает не собственного, а systemd-шного.
То есть, Windows всё же грузится первой системой, однако загрузчика выбирает не собственного, а systemd-шного.
Исходя из чего специально возиться с настройкой отдельного пункта меню для загрузчика Windows не вижу смысла: Windows и так будет грузиться по умолчанию — без вышеописанных манипуляций.


==Ссылки==
==Ссылки==
[https://wiki.archlinux.org/index.php/Systemd-boot_(Русский) Более подробно можно почитать здесь] (наткнулся уже после того, как вышеизложенное было таки вышеизложено :).
Более подробно можно почитать [https://wiki.archlinux.org/index.php/Systemd-boot_(Русский) здесь] (наткнулся уже после того, как вышеизложенное было таки вышеизложено :).
{{Category navigation|title=Загрузчики|category=Загрузчики|sortkey={{SUBPAGENAME}}}}
=Обратная связь=
[[category:systemd]]
*[https://t.me/gbIMoBou @gbIMoBou]
*[[Участник:Дым#Заметки|Другие статьи]]

Текущая версия от 12:29, 30 июня 2024

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

Загрузчик systemd (только для UEFI)

Подготовка

Удостоверьтесь, что раздел ESP существует и смонтирован:

# mount | awk '/\/boot\/efi/{print $1}'

/dev/что-нибудь
Памятка: Если вывод команды пуст, дальше читать не имеет смысла.
Совет: Заранее создайте каталоги для размещения загрузчиков, образов и настроек меню:
# mkdir -p /boot/efi/{kernels,loader/entries}

Установка

Состоит в:

  • отдаче команды # 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

В каждом из них три обязательных строки:

  1. название пункта — как оно должно выглядеть на экране загрузки;
  2. маршрут до загрузчика;
  3. маршрут до образа системы;

…и пара опциональных:

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

Внимание: Не следует сносить с эфи-раздела предыдущее заведомо рабочее ядро и менять его конфигурацию в меню загрузчика как минимум до успешного запуска и какой ни есть обкатки нового: сам делаю это вручную в обеспечение гарантированной загрузки на всякий случай — вместо того, чтоб доработать скрипт /usr/sbin/remove-old-kernels или добавить в него отдельный скрипт зачистки.
Памятка: Ребята из Тим давно-о обещают вот-вот добавить автогенерацию менюшки для этого варианта загрузки (ведь проксмокс с этим как-то справляется).

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

Ссылки

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

Обратная связь