Make-initrd: различия между версиями
(→ToDo) |
|||
(не показано 30 промежуточных версий 16 участников) | |||
Строка 7: | Строка 7: | ||
* утилит, работающих внутри образа в момент загрузки. | * утилит, работающих внутри образа в момент загрузки. | ||
Утилита создания образа имеет модульную структуру. Основная её идея, что для создания образа необходимо (в простейшем случае) указать список особенностей (features) будущего образа. При этом порядок указания совершенно не важен. Пользователь не обязан знать как и в каком порядке будут применяться стадии и что они будут делать. Ему важно, чтобы, например, образ имел нужные модули ядра, имел | Утилита создания образа имеет модульную структуру. Основная её идея, что для создания образа необходимо (в простейшем случае) указать список особенностей (features) будущего образа. При этом порядок указания совершенно не важен. Пользователь не обязан знать как и в каком порядке будут применяться стадии и что они будут делать. Ему важно, чтобы, например, образ имел нужные модули ядра, имел bootsplash и был сжат определённым образом. | ||
'''Внимание:''' Некоторые фичи поставляются в отдельных пакетах. При указании имени отсутствующей фичи ''ошибки не происходит''. | |||
Основной иструмент в initrd это udev. Всё (или почти всё) делается через правила udev. Настройка сети, монтирование корневой директории. Всё. | Основной иструмент в initrd это udev. Всё (или почти всё) делается через правила udev. Настройка сети, монтирование корневой директории. Всё. | ||
Строка 15: | Строка 17: | ||
Процессом загрузки можно управлять через параметры ядра: | Процессом загрузки можно управлять через параметры ядра: | ||
'''ВНИМАНИЕ!''' Если нужно, чтобы stop или ignore сработали как можно раньше - нужно писать эти опции в ВЕРХНЕМ регистре, например stop -> STOP | |||
* '''init'''=''<prog>'' -- параметр определяет программу init; | * '''init'''=''<prog>'' -- параметр определяет программу init; | ||
* '''quiet'''=''<1|0>'' -- включает/отключает отладочные сообщения; | * '''quiet'''=''<1|0>'' -- включает/отключает отладочные сообщения; | ||
* '''panic'''=''<1|0>'' -- разрешает/запрещает получение консоли при аварийных ситуациях; | * '''panic'''=''<1|0>'' -- разрешает/запрещает получение консоли при аварийных ситуациях; | ||
* '''stop'''=''<stage-list>'' -- параметр определяет список стадий, перед которыми необходимо предоставить консоль; | * '''stop'''=''<stage-list>'' -- параметр определяет список стадий, перед которыми необходимо предоставить консоль (например stop=,all, или stop=,udev,); | ||
* '''ignore'''=''<stage-list>'' -- список стадий, которые нужно пропустить; | * '''ignore'''=''<stage-list>'' -- список стадий, которые нужно пропустить; | ||
* '''resume'''=''{<device>|UUID=...|LABEL=...}'' -- параметр определяет устройство, с которого будет производиться восстановление после спящего режима; | * '''resume'''=''{<device>|UUID=...|LABEL=...}'' -- параметр определяет устройство, с которого будет производиться восстановление после спящего режима; | ||
Строка 26: | Строка 30: | ||
* '''ip'''=''<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<proto>'' , | * '''ip'''=''<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<proto>'' , | ||
* '''ip'''=''<device>:<proto>'' -- параметр описывает конфигурацию сетевых интерфейсов. | * '''ip'''=''<device>:<proto>'' -- параметр описывает конфигурацию сетевых интерфейсов. | ||
* '''RESCUE_MODULES'''="usbhid ehci_hcd hid_generic evdev ehci_pci ipmi_si" -- загрузить эти модули при вываливании в '''shell''' после указания stop=; | |||
* '''nosplash''' -- не запускать plymouth | |||
* '''rdshell''' -- загрузиться в initrd shell | |||
== Отладка == | == Отладка == | ||
=== общее === | === общее === | ||
Добавьте в {{path|/etc/initrd.mk}} строчку <tt>VERBOSE = 1</tt> перед запуском сборки initrd. | Добавьте в {{path|/etc/initrd.mk}} строчку <tt>VERBOSE = 1</tt> перед запуском сборки initrd. | ||
Можно останавливать загрузку передачей параметра stop=<stage-list>, где список стадий: | |||
<pre> | |||
defaults | |||
prepare | |||
cmdline | |||
fstab | |||
network | |||
preudev | |||
udev | |||
loop | |||
stopudev | |||
killall | |||
cleanup | |||
umount | |||
sysinit | |||
</pre> | |||
=== udev === | === udev === | ||
При "залипании" на старте {{cmd|udevd}}) бывает полезно указать при загрузке опции <tt>rootdelay=3 stop=udev</tt> и запустить в полученном шелле {{cmd|udevd --debug --resolve-names=never}} вручную; если проблема не вскрывается, может пригодиться сборка образа с добавленной в {{path|/etc/initrd.mk}} строчкой <tt>PUT_FILES += /usr/bin/strace</tt> и последующий запуск {{cmd|strace -ff -o /tmp/udev.strace -- udevd --debug --resolve-names=never}}. Для сохранения полученных данных может пригодиться, например, встроенный в ноутбук кардридер при <tt>MODULES_PRELOAD = sd_mod sdhci sdhci_pci mmc_block</tt>. | При "залипании" (на старте {{cmd|udevd}}) бывает полезно указать при загрузке опции <tt>rootdelay=3 stop=udev</tt> и запустить в полученном шелле {{cmd|udevd --debug --resolve-names=never}} вручную; если проблема не вскрывается, может пригодиться сборка образа с добавленной в {{path|/etc/initrd.mk}} строчкой <tt>PUT_FILES += /usr/bin/strace</tt> и последующий запуск {{cmd|strace -ff -o /tmp/udev.strace -- udevd --debug --resolve-names=never}}. Для сохранения полученных данных может пригодиться, например, встроенный в ноутбук кардридер при <tt>MODULES_PRELOAD = sd_mod sdhci sdhci_pci mmc_block</tt>. | ||
== Возможности == | == Возможности == | ||
Строка 41: | Строка 65: | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/lvm lvm] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/raid raid (autodetect)] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/mdadm raid (mdadm)] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/luks luks] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/multipath multipath] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/usb-storage usb] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
Строка 62: | Строка 86: | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/nfsroot nfs] См. также '''nfsroot''' ниже. | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
Строка 74: | Строка 98: | ||
|- | |- | ||
|align="center" | {{done}} | |align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/syslog klog/syslog] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
| | |bootsplash | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|[ | |[https://git.altlinux.org/people/legion/packages/?p=make-initrd.git;a=tree;f=make-initrd/features/plymouth plymouth] | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
Строка 95: | Строка 119: | ||
|- | |- | ||
| align="center" | {{done}} | | align="center" | {{done}} | ||
|Создание нескольких образов за один | |Создание нескольких образов за один вызов make-initrd. Это полезно, если в процессе обновления необходимо создать как initrd под текущую конфигурацию, так и образ с большим количеством модулей (утилит?) для более общей конфигурации. | ||
|- | |- | ||
| align="center" | {{done}} | |||
|Возможность монтировать не только корневую файловую систему. | |||
|- | |||
| align="center" | {{done}} | |||
|Возможность не указывать при загрузке параметры '''root''' / '''rootfstype''' / '''rootflags''', если загрузка идёт на той же системе, где был создан initrd. | |||
|- | |||
| align="center" | {{done}} | |||
|Поддержка работы с busybox. Для неё особенного ничего не нужно. Существует дополнительный [http://git.altlinux.org/people/legion/packages/make-initrd-busybox.git пакет] с собранным busybox расположенным в определённом месте, откуда его берёт make-initrd. | |||
| | |||
|} | |} | ||
=== nfsroot === | |||
Фича {{term|nfsroot}} поставляется в пакете {{pkg|make-initrd-nfs}} и позволяет изготовить образ, пригодный для загрузки бездисковой машины по NFS. Для того, чтобы загрузка прошла правильно, при изготовлении образа в {{path|/etc/fstab}} для корневой точки монтирования должно быть записано: | |||
/dev/nfs / nfs <опции> 0 0 | |||
С таким корнем изготовление с конфигурацией по умолчанию не будет работать. Поэтому в {{path|/etc/initrd.mk}} нужно записать: | |||
AUTODETECT = all | |||
FEATURES = nfsroot | |||
DISABLE_GUESS = root | |||
== ToDo == | == ToDo == | ||
* Добавить поддержку zram/zcache. | * Добавить поддержку zram/zcache. | ||
* Добавить возможность монтирования корня с iscsi ([https://bugzilla.altlinux.org/show_bug.cgi?id=27354 ALT#27354]). | * Добавить возможность монтирования корня с iscsi ([https://bugzilla.altlinux.org/show_bug.cgi?id=27354 ALT#27354]). | ||
* Добавить возможность монтирования корня с bcache ([https://bugzilla.altlinux.org/show_bug.cgi?id=29561 ALT#29561]). | |||
* Добавить фичу для генерации kdump. | |||
== Документация == | == Документация == | ||
* [ | * [https://github.com/osboot/make-initrd/wiki Documentation] | ||
* [ | * [https://github.com/osboot/make-initrd/wiki/Features Features] | ||
* [https://github.com/osboot/make-initrd/wiki/Configuration Configuration] | |||
* [https://github.com/osboot/make-initrd/wiki/BootParameters Boot parameters] | |||
Пример запуска регенерации initrd для текущего ядра: | |||
make-initrd --kernel=`uname -r` | |||
Не забудьте обновить кофигурацию загрузчика, если это необходимо (например, если у Вас LiLo). | |||
== Исходный код == | == Исходный код == | ||
* [http://git.altlinux.org/people/legion/packages/?p=make-initrd.git make-initrd.git] | * [https://github.com/osboot/make-initrd make-initrd] | ||
* [http://git.altlinux.org/people/legion/packages/?p=make-initrd-busybox.git make-initrd-busybox.git] ''включён в 2.17.0'' | |||
* [http://git.altlinux.org/people/legion/packages/?p=kinit-utils.git kinit-utils.git] | * [http://git.altlinux.org/people/legion/packages/?p=kinit-utils.git kinit-utils.git] | ||
== Рассылка == | |||
* [http://lists.altlinux.org/mailman/listinfo/make-initrd make-initrd@] | |||
== Авторы == | == Авторы == |
Текущая версия от 18:31, 28 июля 2024
make-initrd — инструмент для сборки образов формата initramfs, используемых для начальной загрузки ОС Linux.
Проект состоит из двух основных частей:
- утилиты создания образа initramfs;
- утилит, работающих внутри образа в момент загрузки.
Утилита создания образа имеет модульную структуру. Основная её идея, что для создания образа необходимо (в простейшем случае) указать список особенностей (features) будущего образа. При этом порядок указания совершенно не важен. Пользователь не обязан знать как и в каком порядке будут применяться стадии и что они будут делать. Ему важно, чтобы, например, образ имел нужные модули ядра, имел bootsplash и был сжат определённым образом.
Внимание: Некоторые фичи поставляются в отдельных пакетах. При указании имени отсутствующей фичи ошибки не происходит.
Основной иструмент в initrd это udev. Всё (или почти всё) делается через правила udev. Настройка сети, монтирование корневой директории. Всё.
Загрузка
Init скрипт находится в корне образа (/init). Процесс загрузки разбит на несколько стадий. На самом деле, количество стадий не регламентировано.
Процессом загрузки можно управлять через параметры ядра:
ВНИМАНИЕ! Если нужно, чтобы stop или ignore сработали как можно раньше - нужно писать эти опции в ВЕРХНЕМ регистре, например stop -> STOP
- init=<prog> -- параметр определяет программу init;
- quiet=<1|0> -- включает/отключает отладочные сообщения;
- panic=<1|0> -- разрешает/запрещает получение консоли при аварийных ситуациях;
- stop=<stage-list> -- параметр определяет список стадий, перед которыми необходимо предоставить консоль (например stop=,all, или stop=,udev,);
- ignore=<stage-list> -- список стадий, которые нужно пропустить;
- resume={<device>|UUID=...|LABEL=...} -- параметр определяет устройство, с которого будет производиться восстановление после спящего режима;
- root={<device>|UUID=...|LABEL=...|/dev/nfs} -- параметр определяет устройство, на котором находится корневая файловая система;
- rootdelay=<sec> -- определяет время ожидания корневой файловой системы. Если за это время корень не будет найден, то загрузка продолжена не будет. По умолчанию этот параметр составляет 180 секунд;
- ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<proto> ,
- ip=<device>:<proto> -- параметр описывает конфигурацию сетевых интерфейсов.
- RESCUE_MODULES="usbhid ehci_hcd hid_generic evdev ehci_pci ipmi_si" -- загрузить эти модули при вываливании в shell после указания stop=;
- nosplash -- не запускать plymouth
- rdshell -- загрузиться в initrd shell
Отладка
общее
Добавьте в /etc/initrd.mk строчку VERBOSE = 1 перед запуском сборки initrd.
Можно останавливать загрузку передачей параметра stop=<stage-list>, где список стадий:
defaults prepare cmdline fstab network preudev udev loop stopudev killall cleanup umount sysinit
udev
При "залипании" (на старте udevd) бывает полезно указать при загрузке опции rootdelay=3 stop=udev и запустить в полученном шелле udevd --debug --resolve-names=never вручную; если проблема не вскрывается, может пригодиться сборка образа с добавленной в /etc/initrd.mk строчкой PUT_FILES += /usr/bin/strace и последующий запуск strace -ff -o /tmp/udev.strace -- udevd --debug --resolve-names=never. Для сохранения полученных данных может пригодиться, например, встроенный в ноутбук кардридер при MODULES_PRELOAD = sd_mod sdhci sdhci_pci mmc_block.
Возможности
Статус | Задача | |
---|---|---|
lvm | ||
raid (autodetect) | ||
raid (mdadm) | ||
luks | ||
multipath | ||
usb | ||
Настройка нескольких сетевых интерфейсов | ||
nfs См. также nfsroot ниже. | ||
resume | ||
Поддержка рута на btrfs | ||
Поддержка systemd | ||
klog/syslog | ||
bootsplash | ||
plymouth | ||
Автодетект модулей | ||
Использовать gen_init_cpio для создания cpio архива | ||
Использование glibc и системных библиотек | ||
(glibc) Использовать nfs-utils вместо nfsmount | ||
Создание нескольких образов за один вызов make-initrd. Это полезно, если в процессе обновления необходимо создать как initrd под текущую конфигурацию, так и образ с большим количеством модулей (утилит?) для более общей конфигурации. | ||
Возможность монтировать не только корневую файловую систему. | ||
Возможность не указывать при загрузке параметры root / rootfstype / rootflags, если загрузка идёт на той же системе, где был создан initrd. | ||
Поддержка работы с busybox. Для неё особенного ничего не нужно. Существует дополнительный пакет с собранным busybox расположенным в определённом месте, откуда его берёт make-initrd. |
nfsroot
Фича nfsroot поставляется в пакете make-initrd-nfs и позволяет изготовить образ, пригодный для загрузки бездисковой машины по NFS. Для того, чтобы загрузка прошла правильно, при изготовлении образа в /etc/fstab для корневой точки монтирования должно быть записано:
/dev/nfs / nfs <опции> 0 0
С таким корнем изготовление с конфигурацией по умолчанию не будет работать. Поэтому в /etc/initrd.mk нужно записать:
AUTODETECT = all FEATURES = nfsroot DISABLE_GUESS = root
ToDo
- Добавить поддержку zram/zcache.
- Добавить возможность монтирования корня с iscsi (ALT#27354).
- Добавить возможность монтирования корня с bcache (ALT#29561).
- Добавить фичу для генерации kdump.
Документация
Пример запуска регенерации initrd для текущего ядра:
make-initrd --kernel=`uname -r`
Не забудьте обновить кофигурацию загрузчика, если это необходимо (например, если у Вас LiLo).
Исходный код
- make-initrd
- make-initrd-busybox.git включён в 2.17.0
- kinit-utils.git
Рассылка
Авторы
- Alexey Gladkov
- Kirill A. Shutemov