make-initrd
make-initrd — инструмент для сборки образов формата initramfs, используемых для начальной загрузки ОС Linux.
Проект состоит из двух основных частей:
- утилиты создания образа initramfs;
- утилит, работающих внутри образа в момент загрузки.
Утилита создания образа имеет модульную структуру. Основная её идея, что для создания образа необходимо (в простейшем случае) указать список особенностей (features) будущего образа. При этом порядок указания совершенно не важен. Пользователь не обязан знать как и в каком порядке будут применяться стадии и что они будут делать. Ему важно, чтобы, например, образ имел нужные модули ядра, имел bootspalsh и был сжат определённым образом.
Основной иструмент в initrd это udev. Всё (или почти всё) делается через правила udev. Настройка сети, монтирование корневой директории. Всё.
Загрузка
Init скрипт находится в корне образа (/init). Процесс загрузки разбит на несколько стадий. На самом деле, количество стадий не регламентировано.
Процессом загрузки можно управлять через параметры ядра:
- init=<prog> -- параметр определяет программу init;
- quiet=<1|0> -- включает/отключает отладочные сообщения;
- panic=<1|0> -- разрешает/запрещает получение консоли при аварийных ситуациях;
- stop=<stage-list> -- параметр определяет список стадий, перед которыми необходимо предоставить консоль;
- 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> -- параметр описывает конфигурацию сетевых интерфейсов.
Возможности
Статус | Задача |
---|---|
lvm | |
raid (autodetect) | |
raid (mdadm) | |
luks | |
multipath | |
usb | |
Настройка нескольких сетевых интерфейсов | |
nfs | |
resume | |
Поддержка рута на btrfs | |
Поддержка systemd | |
klog/syslog | |
bootsplash | |
plymouth | |
Автодетект модулей | |
Использовать gen_init_cpio для создания cpio архива | |
Использование glibc и системных библиотек | |
(glibc) Использовать nfs-utils вместо nfsmount | |
Создание нескольких образов за один вызыв make-initrd. Это полезно, если в процессе обновления необходимо создать как initrd под текущую конфигурацию, так и образ с большим количеством модулей (утилит?) для более общий конфигурации. |
ToDo
- Добавить возможность монтировать все системные разделы.
- Добавить проверку разделов.
- Сделать возможность не указывать параметр root=, если загрузка идёт на той же системе, что и создание initrd.
- Мигрировать на kmod.
- Доработать и добавить поддержку unet.
- Добавить поддержку zram/zcache.
Документация
Исходный код
Авторы
- Alexey Gladkov
- Kirill A. Shutemov