== Шаги bootchain

В основном, «шаги» *bootchain* — это относительно небольшие скрипты,
попадающие в образ initramfs в каталог */lib/bootchain/*. Но также
среди них есть и внутренние псевдо-шаги, реализуемые непосредственно
демоном *chaind*.

=== debug

Входит в подпакет *make-initrd-bootchain-core*, является расширением *pipeline*,
в дополнительных параметрах не нуждается. Указывать данный «шаг» в синтаксической
цепочке загрузки не следует. Он автоматически запускается при использовании
параметра *bc_debug* в /proc/cmdline перед каждым «шагом» *bootchain* и перед
переходом в stage2, оказывая влияние только на содержимое журнала
*/var/log/chaind.log* (или */var/log/pipelined.log*).

=== fg

Входит в подпакет *make-initrd-bootchain-core*, является расширением *pipeline*,
в дополнительных параметрах не нуждается. Это внутренний псевдо-шаг главного
цикла демона *chaind*, обеспечивающий его перевод в интерактивный режим при
наличии в initramfs фичи *bootchain-interactive*. Самому *bootchain*
интерактивность не требуется, но в ней могут нуждаться некоторые «шаги»,
такие как *altboot*. См. детали в разделе «_<<_интерактивный_режим_работы>>_».

.Пример использования:
[,,subs="verbatim,quotes"]
----
root=bootchain bootchain=`*fg*`,altboot
----

=== getimage

При форке *bootchain* данный «шаг» перешёл из *pipeline* без изменений, но
был выделен в отдельный подпакет *make-initrd-bootchain-getimage*.
Скачивает по сети и монтирует указанный образ. Можно использовать на
быстрых интернет-каналах или в сценариях автоматического тестирования или
с небольшими образами для загрузки по протоколам HTTP/FTP утилитой wget,
поскольку визуализации процесса нет, а процесс загрузки ограничен 180
секундами. В остальном это скорее «proof of concept».

Параметры загрузки:

* *getimage* — URL скачиваемого образа.

.Пример использования:
[,,subs="verbatim,quotes"]
----
root=bootchain bootchain=`*getimage*`,mountfs,overlayfs,rootfs **ip=dhcp4** \
  `*getimage*`=http://ftp.altlinux.org/pub/people/mike/iso/misc/vi-20140918-i586.iso \
  mountfs=rescue
----

=== mountfs

Входит в подпакет *make-initrd-bootchain-core*, перешёл из *pipeline* без
изменений при форке *bootchain*. Позволяет смонтировать то, что было получено
в результате работы предыдущих «шагов».

Параметры загрузки:

* *mountfs* — имя файла, либо *dev*, либо *DEVNAME*.

=== noop

Входит в подпакет *make-initrd-bootchain-core*, является расширением *pipeline*,
в дополнительных параметрах не нуждается. Это внутренний псевдо-шаг главного
цикла демона *chaind*, не выполняющий никаких действий, и предназначенный для
отрыва результата предыдущего «шага» от входа следующего «шага», что может
быть полезно, например, когда мы не хотим, чтобы результаты *waitdev* были
использованы в следующем «шаге» *localdev*.

=== noretry

Входит в подпакет *make-initrd-bootchain-core*, является расширением *pipeline*,
в дополнительных параметрах не нуждается. Это внутренний псевдо-шаг главного
цикла демона *chaind*, запрещающий следующим «шагам» завершаться с ненулевым
кодом возврата, что приведёт к немедленному завершению работы демона в случае
сбоя в скрипте любого следующего «шага». По умолчанию «шагам» разрешено
фейлиться, демон будет перезапускать их повторно несколько раз.

=== overlayfs

Входит в подпакет *make-initrd-bootchain-core*, перешёл из *pipeline* без
изменений при форке *bootchain*. Создаёт оверлей над read-only rootfs при
LiveCD загрузке.

Параметры загрузки:

* *overlayfs* — необязательный параметр, может содержать перечисленные через
  запятую названия пройденных «шагов» в формате _step<N>_, в каталоги которых
  смонтированы отдельные read-only слои, если на предыдущем «шаге» не был
  смонтирован каталог с read-only rootfs.

=== ping

После форка *bootchain* данный «шаг» был скопирован из *pipeline* без изменений,
но был выделен в отдельный подпакет *make-initrd-bootchain-getimage*. В самом
make-initrd данный «шаг» появился сравнительно недавно (конец 2023 года).
Позволяет проверить доступность удалённого хоста. Имеет смысл использовать
его перед *getimage*. По умолчанию данный «шаг» ждёт неограниченное время,
пока хост не станет доступен. Если параметр не указан, проверяется дефолтный
шлюз.

Параметры загрузки:

* *ping* — необязательные опции работы «шага», перечисляемые через двоеточие.

Возможные значения опций:

* *v4* — использовать 4-ю версию протокола IP;
* *v6* — использовать 6-ю версию протокола IP;
* *waitfor* — предписывает пинговать без ограничений по числу попыток;
* *iter=<N>* — предписывает пинговать не более указанного числа попыток;
* *%gateway* — предписывает пинговать шлюз по умолчанию, который будет
  определён автоматически по таблице маршрутизации;
* _другие значения_ — рассматриваются как непосредственный адрес или имя
  пингуемого хоста.

.Пример использования:
[,,subs="verbatim,quotes"]
----
root=bootchain bootchain=noretry,`*ping*`,getimage,mountfs,overlayfs,rootfs **ip=dhcp4** \
  `*ping*`=v4:iter=30:ftp.altlinux.org \
  getimage=http://ftp.altlinux.org/pub/people/mike/iso/misc/vi-20140918-i586.iso \
  mountfs=rescue
----

=== retry

Входит в подпакет *make-initrd-bootchain-core*, является расширением *pipeline*,
в дополнительных параметрах не нуждается. Это внутренний псевдо-шаг главного
цикла демона *chaind*, разрешающий всем последующим «шагам» завершаться с
ненулевым кодом возврата, что приведёт к их пятикратному запуску. Такой режим
работы демона действует по умолчанию.

=== rootfs

Входит в подпакет *make-initrd-bootchain-core*, перешёл из *pipeline* с
незначительными изменениями при форке *bootchain*. Переносит в rootmnt=/root
результаты предыдущего «шага» и сообщает демону *chaind* о том, что это последний
«шаг» и можно переходить в stage2. В дополнительных параметрах не нуждается.

=== wait-resume

Входит в подпакет *make-initrd-bootchain-core*, был скопирован из *pipeline*
без изменений после форка *bootchain*. В самом make-initrd данный «шаг» появился
уже после основного форка (осень 2022 года). Иногда загрузочная цепочка успевает
отработать быстрее, чем происходит возобновление работы после «спящего режима»,
в результате чего выполняется новая загрузка. Данный «шаг» позволяет приостановить
нормальный процесс загрузки до того, как возобновление завершится неудачей. Имеет
смысл использовать на обычной rootfs, а не с универсальными «живыми» носителями.

=== waitdev

Входит в подпакет *make-initrd-bootchain-waitdev*, является расширением
одноимённого «шага» *pipeline*. Изначально каждый «шаг» *waitdev* предписывает
дожидаться устройства по заданной в одноимённом параметре спецификации, чей
формат аналогичен параметру *root=…* make-initrd. Расширение исходного кода
*pipeline* здесь сводится к трём изменениям:

* Допускается префикс «CDROM:» в спецификации либо использование этого
  префикса вместо спецификации. В первом случае waitdev будет дожидаться
  первого попавшегося устройства типа CD/DVD-ROM или имеющего формат файловой
  системы ISO-9660. Во втором случае префикс дополняет спецификацию, требуя,
  чтобы устройство было CD/DVD-ROM'ом или имело формат ISO-9660.
* Имя найденного устройства записывается ещё и в файл DEVNAME в каталоге
  результата текущего «шага», что позволяет видеть более понятное администратору
  имя устройства в /proc/mounts при его монтировании последующими «шагами».
* В /proc/cmdline можно прописать параметр *waitdev_timeout*. Он определяет
  суммарный таймаут для всех «шагов» waitdev, что позволит использовать другие
  «шаги» в качестве fallback, если указанные устройства не будут обнаружены в
  заданное время. Так, *altboot*'овский «шаг» *localdev* сначала пытается
  использовать результаты предыдущего «шага», но если их нет, выводится диалог
  выбора устройства, т.е. данное расширение обеспечивает переход от ожидания
  к сканированию или выбору устройств.

Параметры загрузки:

* *waitdev* — определяет спецификацию устройства для каждого «шага» waitdev
  в стиле root=… make-initrd;
* *waitdev_timeout* — определяет общий таймаут для всех «шагов» waitdev чтобы
  использовать fallback;

.Примеры использования:
[,,subs="verbatim,quotes"]
----
root=bootchain bootchain=`*waitdev*`,mountfs,mountfs,overlayfs,rootfs \
  `*waitdev*`=CDROM:LABEL=ALT_regular-rescue/x86_64 \
  mountfs=dev \
  mountfs=rescue

root=bootchain bootchain=`*waitdev,waitdev*`,fg,altboot \
  `*waitdev*`=LABEL=alt-live-storage \
  `*waitdev*`=CDROM: \
  automatic=method:cdrom

root=bootchain bootchain=`*waitdev*`,fg,download,... ip=dhcp4 \
  `*waitdev*`=MODEL=SAMSUNG_SSD_960_EVO_250GB \
  altboot_download=method=url;url=http://192.168.15.1/images/alt-ws11.img
----

На момент написания настоящей документации спецификация определения дисков
в стиле *MODEL=…* не поддерживается make-initrd, так что третий пример здесь
скорее гипотетический.

