Make-initrd: различия между версиями

Материал из ALT Linux Wiki
Строка 16: Строка 16:
Процессом загрузки можно управлять через параметры ядра:
Процессом загрузки можно управлять через параметры ядра:


ВНИМАНИЕ! Если нужно, чтобы stop или ignore сработали как можно раньше - нужно писать эти опции в ВЕРХНЕМ регистре, например stop -> STOP
'''ВНИМАНИЕ!''' Если нужно, чтобы stop или ignore сработали как можно раньше - нужно писать эти опции в ВЕРХНЕМ регистре, например stop -> STOP


* '''init'''=''<prog>'' -- параметр определяет программу init;
* '''init'''=''<prog>'' -- параметр определяет программу init;
Строка 28: Строка 28:
* '''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


== Отладка ==
== Отладка ==

Версия от 02:58, 23 декабря 2016


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

Отладка

общее

Добавьте в /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.

Возможности

Статус Задача
Symbol kept vote.svg  lvm
Symbol kept vote.svg  raid (autodetect)
Symbol kept vote.svg  raid (mdadm)
Symbol kept vote.svg  luks
Symbol kept vote.svg  multipath
Symbol kept vote.svg  usb
Symbol kept vote.svg  Настройка нескольких сетевых интерфейсов
Symbol kept vote.svg  nfs
Symbol kept vote.svg  resume
Symbol kept vote.svg  Поддержка рута на btrfs
Symbol kept vote.svg  Поддержка systemd
Symbol kept vote.svg  klog/syslog
Symbol kept vote.svg  bootsplash
Symbol kept vote.svg  plymouth
Symbol kept vote.svg  Автодетект модулей
Symbol kept vote.svg  Использовать gen_init_cpio для создания cpio архива
Symbol kept vote.svg  Использование glibc и системных библиотек
(glibc) Использовать nfs-utils вместо nfsmount
Symbol kept vote.svg  Создание нескольких образов за один вызыв make-initrd. Это полезно, если в процессе обновления необходимо создать как initrd под текущую конфигурацию, так и образ с большим количеством модулей (утилит?) для более общей конфигурации.
Symbol kept vote.svg  Возможность монтировать не только корневую файловую систему.
Symbol kept vote.svg  Возможность не указывать при загрузке параметры root / rootfstype / rootflags, если загрузка идёт на той же системе, где был создан initrd.
Symbol kept vote.svg  Поддержка работы с busybox. Для неё особенного ничего не нужно. Существует дополнительный пакет с собранным busybox расположенным в определённом месте, откуда его берёт make-initrd.

ToDo

  • Добавить проверку разделов.
  • Доработать и добавить поддержку unet.
  • Добавить поддержку zram/zcache.
  • Добавить возможность монтирования корня с iscsi (ALT#27354).
  • Добавить возможность монтирования корня с bcache (ALT#29561).
  • Добавить фичу для генерации kdump.

Документация

Пример запуска регенерации initrd для текущего ядра:

make-initrd --kernel=`uname -r`

Не забудьте обновить кофигурацию загрузчика, если это необходимо (например, если у Вас LiLo).

Исходный код

Авторы

  • Alexey Gladkov
  • Kirill A. Shutemov