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)
- —drivers список-модулей-ядра-через-пробел
- —add-drivers список-модулей-ядра-через-пробел
- —omit-drivers список-модулей-ядра-через-пробел
- —kmoddir каталог-модулей-ядра
- —print-cmdline (вывести рекомендуемые параметры загрузки ядра)
- —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 программа (добавляет программу по возможности)
- —filesystems список-типов-файловых-систем-через-пробел
- —fwdir каталог-с-прошивками
- —kernel-cmdline параметры-ядра-по-умолчанию
- —kernel-only (только модули ядра и прошивки)
- —no-kernel (не включать модули ядра и прошивки)
- —early-microcode
- —no-early-microcode
- —mdadmconf (включить /etc/mdadm.conf)
- —nomdadmconf
- —lvmconf (включить /etc/lvm/lvm.conf)
- —nolvmconf
- —fscks [список-через-пробел] (включить утилиты fsck)
- —nofscks
- —strip (по умолчанию)
- —nostrip
- —prelink (по умолчанию)
- —noprelink
- —hardlink (по умолчанию)
- —nohardlink
- —conf /etc/dracut.conf
- —confdir /etc/dracut.conf.d
- —tmpdir /var/tmp
- —sshkey файл-ключа
- —logfile /var/log/dracut.log
- —fstab (использовать /etc/fstab вместо /proc/self/mountinfo
- —add-fstab имя-файла (добавить содержимое к записываемому /etc/fstab)
- —add-device устройство
- —gzip | —bzip2 | —lzma | —xz | —lzo | —lz4 | —no-compress | —compress=»gzip -9″ (по умолчанию gzip)
- —show-modules (вывести имена используемых модулей)
- —keep (не удалять временный каталог)
- —printsize
- —stdlog уровень-вывода-на-stderr (0 — ничего, 1 — фатальные ошибки, 2 — ошибки, 3 — предупреждения, 4 — информация, 5 — отладочная печать, 6 — трассировка)
- —ro-mnt (монтировать / и /usr в режиме чтения)
- —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)
- root=/dev/nfs nfsroot=IP-адрес:корневой-каталог:опции
- root=cifs://[имя-пользователя[:пароль]@]IP-адрес-сервера:корневой-каталог (можно задать cifsuser= и cifspass=)
- root=iscsi:[имя:пароль[:обратное-имя:пароль]@][имя-сервера]:[протокол]:[порт][:[имя-интерфейса-iSCSI]:имя-netdev]]:[LUN]:имя-target
- root=UUID=идентификатор netroot=iscsi.
- root=UUID=идентификатор rd.iscsi.initiator, rd.iscsi.target.name, rd.iscsi.target.ip, rd.iscsi.target.port, rd.iscsi.target.group, rd.iscsi.username, rd.iscsi.password, rd.iscsi.in.username, rd.iscsi.in.password, rd.iscsi.firmware, rd.iscsi.param, rd.iscsi.ibft, rd.iscsi.waitnet=0, rd.iscsi.testroute=0
- root=UUID=идентификатор netroot=nbd:сервер:порт[:тип-файловой-системы[:опции-монтирования[:опции-NBD]]]
- rootfstype=тип-файловой-системы (auto)
- rootflags=флаги-монтирования (если не задано, то информация извлекается из /et/fstab настоящей корневой файловой системы)
- ro (монтировать / и /usr только на чтение; если ro или rw не заданы, то информация извлекается из /et/fstab настоящей корневой файловой системы)
- rw
- rd.fstab=0 (не брать параметры монтирования из /etc/fstab, был rd_NO_FSTAB)
- rootfallback=блочное-устройство (запасная корневая файловая система)
- rd.skipfsck
- rd.auto (автоматическая сборка LUKS, dmraid, mdraid, lvm; выключена с версии dracut 024 — RHEL7 )
- rd.cmdline=ask (запросить дополнительные параметры)
- resume=блочное-устройство (swap для просыпания)
- rd.emergency=
(что делать при ошибке и rd.shell=0 - rdblacklist=модули-ядра-через-запятую (не загружать; в RHEL7: rd.driver.blacklist=; до RHEL72 не работал во время установки)
- rd.driver.blacklist=
- rdloaddriver=модуль-ядра (в RHEL7 разделился на rd.driver.pre (до автоматической загрузки модулей ядра) и rd.driver.post)
- rd.driver.pre=модуль-ядра (до автоматической загрузки модулей ядра)
- rd.driver.post=модуль-ядра (после автоматической загрузки модулей ядра, был rdinsmodpost)
- rd.retry=секунд (30; ждать появления устройств; через 2/3 указанного времени запускаются деградированные RAID, был rd_retry)
- rd.noverifyssl (разрешить самоподписанные сертификаты для загрузки по SSL)
- средства отладки
- rdinfo (информационная печать; rd.info в RHEL7)
- rd.info
- rdshell (rd.shell в RHEL7; выпасть в командную строку, если не удалось смонтировать корневую файловую систему)
- rd.shell
- rdinitdebug и rdnetdebug (RHEL6: отладку в /init.log)
- rd.debug (RHEL7: отладочная печать («set -x») в /run/initramfs/rdsosreport.txt, /run/initramfs/init.log или доступна через «journalctl -ab»)
- rd.memdebug=3 (0 — нет, 1 — часть из /proc/meminfo, 2 — из /proc/meminfo, 3 — из /proc/meminfo и /proc/slabinfo)
- rdbreak (выпасть в командную строку в конце обработки initramfs; RHEL7: rd.break)
- rd.break
- rd.break=
(выпасть в командную строку в указанной точке; RHEL7) - rdudevinfo (информационная печать для udev; RHEL7: rd.udev.info)
- rd.udev.info
- rdudevdebug (отладочная печать udev; RHEL7: rd.udev.debug)
- rd.udev.debug
- локализация
- 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.ddf=0 (предоставить обработку RAID в формате SNIA ddf подсистеме DM RAID)
- 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=
(автоматическая конфигурация всех интерфейсов) - ip=интерфейс:
[:MTU[:новый-MAC]] (автоматическая конфигурация интерфейса, MTU задать не удалось, выкинули? , none и off выкинули?) - ip=IP-адрес:[IP-адрес-соседа-PPP]:шлюз:маска:имя-хоста:интерфейс:
[:MTU[:MAC-адрес]] (частичная ручная настройка сетевого интерфейса; опущенные части будут взяты по DHCP; MTU задать не удалось ) - ip=IP-адрес:[IP-адрес-соседа-PPP]:шлюз:маска:имя-хоста:интерфейс:
[:IP-адрес-DNS[:IP-адрес-DNS]] (частичная ручная настройка сетевого интерфейса) - ifname=имя-интерфейса:MAC-адрес (задать своё имя сетевого интерфейса, не надо использовать стандартные шаблоны типа eth0)
- rd.route=сеть/маска:шлюз[:интерфейс] (задать статический маршрут)
- bootdev=имя-интерфейса (указание загрузочного интерфейса; необходим, если описано несколько интерфейсов)
- BOOTIF=MAC-адрес (явное указание интерфейса загрузки; можно обеспечить автоматическое задание средствами PXE)
- rd.bootif=0 (не брать BOOTIF от PXE)
- nameserver=IP-адрес (можно указать несколько штук)
- biosdevname=0 (не переименовывать интерфейсы по информации от BIOS в eno1 и т.п.) только для DELL? (net.ifnames=0)
- vlan=имя-VLAN:имя-устройства (стили именования: vlan0005, vlan5, eth0.0005, eth0.5)
- bond=имя-группового-интерфейса:интерфейс<,интерфейс>:опции-модуля-bonding
- team=имя-группового-интерфейса:интерфейс
- bridge=имя-группового-интерфейса:интерфейс
- rd.ipv6.disable ( не работает? )
- rd.net.dhcp.retry=число (по умолчанию 1)
- rd.net.timeout.dhcp= («dhclient -timeout . «)
- rd.net.timeout.iflink=секунд (ждать возникновения интерфейса, 60)
- rd.net.timeout.ifup=секунд (ждать поднятия интерфейса, 20)
- rd.net.timeout.route=секунд (20)
- rd.net.timeout.ipv6dad=секунд (50)
- rd.net.timeout.ipv6auto=секунд (40)
- rd.net.timeout.carrier=секунд (5)
- NFS
- 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):
Источник