Последнее изменение файла: 2020.12.30
Скопировано с www.bog.pp.ru: 2023.10.01
Bog BOS: dracut - создание initramfs
dracut - утилита создания initramfs (initial RAM disk image,
загружаемый в оперативную память файл с образом файловой системы),
используемого при загрузке Linux в качестве первоначальной корневой файловой системы.
Заменяет mkinitrd (с Fedora 12 и RHEL 6). Загрузчик загружает в память ядро и initramfs, монтирует временную
корневую файловую систему и передаёт управление ядру.
Задача initramfs - обеспечить хранение скриптов, программ, модулей ядра и прочих файлов,
необходимых для загрузки драйверов, инициализации сетевых устройств, видео, устройств хранения,
обработки сложных случаев в виде программных RAID,
LVM, iSCSI,
multipath, FibreChannel,
LUKS, NFS для бездисковых компьютеров,
поиска по имени или метке, обслуживания (fsck) и монтирования "настоящей" корневой файловой системы
в режиме только чтения, после чего корневая файловая система "переключается".
Подробно процесс загрузки описан в dracut.bootup.7 и bootup.7.
Также созданный dracut initramfs используется системой установки anaconda и LiveCD.
dracut автоматически распознаёт имеющееся оборудование и включает в образ необходимые загружаемые модули ядра
(может создавать образ, настроенный на конкретное оборудование, или универсальный).
Дополнительно внедряет в initramfs программы разбора параметров загрузки ядра.
dracut имеет модульную структуру (dracut.modules.7, /usr/share/dracut/modules.d или /usr/lib/dracut/modules.d/; 63 штуки в RHEL7).
Основной модуль 99base задаёт скрипт init.sh, запускаемый ядром после монтирования initramfs.
В RHEL7 dracut использует systemd со всеми его целями (нормальная конечная initrd.target?,
аварийная - emergency.target) и сервисами (см. dracut.bootup(7) и bootup(7) и dracut-*.service).
dracut также используется при выключении компьютера, чтобы обеспечить разборку всех сложных
конструкций хранения (/usr/lib/dracut/modules.d/99shutdown/shutdown.sh).
Не все модули включены по умолчанию. Настройки в файлах /etc/dracut.conf и /etc/dracut.conf.d/*.conf
и /usr/lib/dracut/dracut.conf.d/*.conf (см. dracut.conf(5)).
Ключи dracut перебивают настройки (журнал создания в /var/log/dracut.log):
--verbose | -v
--quiet | -q
--debug (выводить отладочную информацию при построении initram)
--force | -f
--kver версия-ядра
--hostonly | -H (минимизировать размер initramfs, выкинув всё ненужное для данного сервера;
в RHEL7 включён по умолчанию через /usr/lib/dracut/dracut.conf.d/01-dist.conf;
для генерации универсального initramfs необходимо установить пакет dracut-config-generic;
универсальным также является initrams с именем initramfs-0-rescue-*.img)
--no-hostonly
--hostonly-cmdline (сохранить параметры ядра в initramfs)
--no-hostonly-cmdline
--hostonly-i18n (по умолчанию, только нужные шрифты и клавиатуры)
--no-hostonly-i18n (все файлы шрифтов и клавиатур)
--list-modules (выдать список имеющихся модулей dracut)
--modules список-модулей-dracut-через-пробел
--omit список-модулей-dracut-через-пробел
--add список-модулей-dracut-через-пробел
--force-add список-модулей-dracut-через-пробел (для --hostonly)
--include исходный-файл путь-в-initram (добавить свой файл или целое поддерево в initramfs; можно использовать только 1 раз?)
--install программа (добавляет программу в initram вместе с требующимися библиотеками; можно использовать несколько раз;
в RHEL7 через /usr/lib/dracut/dracut.conf.d/01-dist.conf добавлены vi, /etc/virc, ps, grep, cat, rm)
--install-optional программа (добавляет программу по возможности)
--regenerate-all (пересоздать initramfs со всеми обнаруженными ядрами)
имя-файла-initramfs (по умолчанию - /boot/initramfs-ВерсияЯдра.img)
[версия-ядра] (по умолчанию используется версия выполняемого ядра)
Возможна загрузка корневой файловой системы по сети - пакет dracut-network. Загрузчик локальный или PXE.
При установке пакета с новым ядром вызывается скрипт
"/sbin/new-kernel-pkg --package kernel --install версия", который вызывает "dracut -f /boot/initramfs-версия.img версия-ядра".
Утилита lsinitrd позволяет посмотреть содержимое указанного файла initramfs.
Ключ "-f имя-файла" позволяет вывести содержимое указанного файла из initramfs.
mkinitrd имитирует поведение предыдущей системы mkinitrd.
При загрузке ядра распознаются следующие параметры (dracut.cmdline.7; в RHEL7 к именам параметров добавлен префикс "rd.";
берутся из командной строки (например, в /boot/grub2/grub.cfg, можно отредактировать при загрузке)
и из initramfs в файлах /etc/cmdline, /etc/conf.d/, /etc/cmdline.d/*.conf;
параметры без значения - булевы, можно задавать 0 или 1):
ключи ядра (/usr/share/doc/kernel-doc-*/Documentation/kernel-parameters.txt)
init=путь-к-программе-init (можно сюда /bin/sh, но лучше systemd.unit=rescue.target или emergency.target;
rd.systemd.unit= действует только на dracut, но не основную систему)
задание корневой файловой системы
root=блочное-устройство (например, /dev/sda2 или /dev/disk/by-path/pci-0000:00:1f.1-scsi-0:0:1:0-part1
или /dev/disk/by-label/Root или UUID=идентификатор или LABEL=метка-файловой-системы)
root=nfs[4]:IP-адрес:корневой-каталог:опции
root=dhcp|dhcp6 (сеть настраивается по DHCP, путь и параметры для NFS берутся из root-path)
rd.vconsole.keymap=ruwin_alt-UTF-8 (раскладка клавиатуры - имя файла из каталога keymaps для loadkeys,
пишется KEYMAP в /etc/vconsole.conf в initramfs, был KEYMAP и KEYTABLE)
rd.vconsole.keymap.ext=имя-файла (пишется EXT_KEYMAP в /etc/vconsole.conf в initramfs, был EXT_KEYMAP)
rd.vconsole.unicode (UTF-8; пишется UNICODE в /etc/vconsole.conf в initramfs, был UNICODE)
rd.vconsole.font=latarcyrheb-sun16 (консольный шрифт - имя файла из каталога consolefonts, пишется FONT в /etc/vconsole.conf в initramfs,
был SYSFONT)
rd.vconsole.font.map (имя файла преобразования кодов из каталога consoletrans - см ключ "-m" setfont,
пишется FONT_MAP в /etc/vconsole.conf в initramfs, был CONTRANS)
rd.vconsole.font.unimap (имя файла преобразования кодов из каталога unimaps - см ключ "-u" setfont,
пишется FONT_UNIMAP в /etc/vconsole.conf в initramfs, был UNIMAP)
rd.locale.LANG=en_US.UTF-8 # ru_RU.UTF-8 (пишется LANG в /etc/locale.conf в initramfs)
rd.locale.LC_ALL= (пишется LC_ALL в /etc/locale.conf в initramfs)
LVM
rd_NO_LVM (RHEL6)
rd.lvm=0 (RHEL7)
rd.lvm.vg=имя-группы-томов (только эту группу, был rd_LVM_VG)
rd_LVM_LV (RHEL6)
rd.lvm.lv=имя-тома (только этот том)
rd.lvm.conf=0 (удалить /etc/lvm/lvm.conf из initramfs, был rd_NO_LVMCONF)
rd.lvm.snapshot (? был rd_LVM_SNAPSHOT)
rd.lvm.snapsize (? был rd_LVM_SNAPSIZE)
LUKS
rd_NO_LUKS (RHEL6)
rd.luks=0 (RHEL7)
rd.luks.uuid=часть-UUID (только этот раздел, был rd_LUKS_UUID)
rd.luks.allow-discards[=UUID] (разрешить TRIM)
rd.luks.crypttab=0 (не проверять /etc/crypttab, был rd_NO_CRYPTTAB)
rd.luks.key=путь-к-ключу[:устройство-к-ключу[:LUKS-устройство]] (местонахождение ключа для указанного LUKS-устройства)
rd.luks.keydev.uuid (rd_LUKS_KEYDEV_UUID)
rd.luks.keypath (rd_LUKS_KEYPATH)
программный RAID
rd_NO_MD (RHEL6)
rd.md=0 (RHEL7)
rd.md.imsm=0 (предоставить обработку RAID в формате imsm/isw подсистеме DM RAID, был rd_NO_MDIMSM)
rd.md.conf=0 (игнорировать mdadm.conf в initramfs, был rd_NO_MDADMCONF)
rd.md.waitclean=1 (дождаться завершения resync, recovery и reshape)
rd.md.uuid=UUID (только этот массив, был rd_MD_UUID)
псевдоаппаратный RAID (DM RAID)
rd_NO_DM (RHEL6)
rd.dm=0 (RHEL7)
rd.dm.uuid=UUID (только этот массив)
FIPS
rd.fips
boot=блочное-устройство (для FIPS)
rd.fips.skipkernel (не проверять контрольную сумму ядра)
настройки сети
rd.neednet=1 (поднимать сеть, даже если она не нужна для монтирования корня)
ip=auto (поднять интерфейс для сетевой загрузки по DHCP, DHCP сервер может задать root-path, удалили?)
ip={dhcp | on | any | auto6 | dhcp6 | ibft} (автоматическая конфигурация всех интерфейсов)
ip=интерфейс:{none | off | dhcp | on | any | auto6 | dhcp6}[:MTU[:новый-MAC]] (автоматическая конфигурация интерфейса,
MTU задать не удалось, выкинули?, none и off выкинули?)
ip=IP-адрес:[IP-адрес-соседа-PPP]:шлюз:маска:имя-хоста:интерфейс:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:MTU[:MAC-адрес]]
(частичная ручная настройка сетевого интерфейса; опущенные части будут взяты по DHCP; MTU задать не удалось)
rd.nfs.domain=имя-домена (для NFSv4, приоритет над /etc/idmap.conf, был rd_NFS_DOMAIN)
LiveCD (squashfs с образом файловой системы без возможности записи, создаётся снимок для небольшого объёма записи, если не указан rd.writable_fsimg=1)
root=live:URL (http, httpd, ftp, tftp)
rd.writable_fsimg=1 (образ файловой системы с возможностью записи, предварительно копируется в память)
rd.live.debug=1 (отладочная печать при загрузке, был rdlivedebug)
rd.live.dir=путь (расположение ext3fs.img или rootfs.img внутри squashfs, по умолчанию LiveOS, был live_dir)
rd.live.ram=1 (скопировать образ в память перед загрузкой, чтобы освободит носитель, был live_ram)
rd.live.overlay=блочное-устройство:путь-внутри (изменения будут сохранены, был overlay)
rd.live.overlay.thin=1 (использовать снимок с динамически выделяемым местом)
rd.live.overlay.readonly (?, удалён? был readonly_overlay)
rd.live.overlay.reset (?, удалён? был reset_overlay)
rd.live.check (проверить носитель перед запуском, был check, удалён?)
rd.live.image (?, удалён? был liveimg)
графическое оформление загрузки (Plymouth)
rd_NO_PLYMOUTH (RHEL6)
plymouth.enable=0 (отключить полностью)
rd.plymouth=0 (отключить для initramfs)
rd.splash (?, удалён? был rd_NO_SPLASH)
ключи ядра
masterkey=путь
masterkeytype=trusted
evmkey=путь
ecryptfskey=путь
"Предсказуемые" имена сетевых интерфейсов (по данным BIOS/прошивки, физическое расположение), изначально ядро создаёт интерфейсы вида eth0, а затем они переименовываются (чтобы вернуть старые имена необходимо загружаться с параметрами net.ifnames=0 и biosdevname=0; подробности борьбы с udev):
en (Ethernet)
o Номер (устройство на материнской плате - eno1)
s Слот f функция-порт d устройство (устройство горячего подключения)
x MAC-Адрес
[P Домен] p Шина s Слот f функция-порт d устройство (например, enp4s0f0)
[P Домен] p Шина s Слот f функция u порт ... c конфигурация i интерфейс (цепочка USB)
wl (WLAN)
ww (WWAN, сотовая связь)
В случае проблем при установке пользователь попадает в командную оболочку (указать rd.shell),
в файл /run/initramfs/rdsosreport.txt записывается отчёт.
В командной строке можно найти или создать нужное устройство и сделать на него символьную ссылку в /dev/root,
по команде exit загрузка продолжается.
Для выхода в командную оболочку при завершении работы системы надо (RHEL7):