|
Bog BOS: dracut - создание initramfs
|
Последнее изменение файла: 2024.09.19
Скопировано с www.bog.pp.ru: 2024.11.23
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={reboot|poweroff|halt} (что делать при ошибке и 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=[0-3] (0 - нет, 1 - часть из /proc/meminfo, 2 - из /proc/meminfo, 3 - из /proc/meminfo и /proc/slabinfo)
- rdbreak (выпасть в командную строку в конце обработки initramfs; RHEL7: rd.break)
- rd.break
- rd.break={cmdline|pre-udev|pre-trigger|initqueue|pre-mount|mount|pre-pivot|cleanup}
(выпасть в командную строку в указанной точке; 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={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 задать не удалось)
- ip=IP-адрес:[IP-адрес-соседа-PPP]:шлюз:маска:имя-хоста:интерфейс:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[: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/прошивки, физическое расположение, biosdevname), изначально ядро создаёт интерфейсы вида eth0, а затем они переименовываются
(чтобы вернуть старые имена необходимо загружаться с параметрами net.ifnames=0 и biosdevname=0;
при неудаче остаются имена вида ethX;
при перестановке в другой слот "предсказуемое" имя изменяется; иногда оно изменяется при установке другой платы;
подробности борьбы с udev):
- en (Ethernet)
- o порядковый-номер [n имя-порта | d номер-устройства ]
(устройство на системной плате - eno1; не всегда устройство на системной плате получает имя eno1)
- s номер-слота [f номер-функции-или-порта] [n имя-порта | d номер-устройства ]
(в теории устройство горячего подключения, на практике - слот ёлочки)
- x MAC-Адрес
- [P номер-домена] p номер-шины s номер-слота f номер-функции-или-порта [n имя-порта | d номер-устройства]
(на основании физического расположения; например, enp4s0f0)
- [P номер-домена] p номер-шины s номер-слота f функция u порт ... c конфигурация i интерфейс (цепочка USB)
- wl (WLAN)
- ww (WWAN, сотовая связь)
В случае проблем при установке пользователь попадает в командную оболочку (указать rd.shell),
в файл /run/initramfs/rdsosreport.txt записывается отчёт.
В командной строке можно найти или создать нужное устройство и сделать на него символьную ссылку в /dev/root,
по команде exit загрузка продолжается.
Для выхода в командную оболочку при завершении работы системы надо (RHEL7):
mkdir -p /run/initramfs/etc/cmdline.d
echo "rd.break=pre-shutdown" > /run/initramfs/etc/cmdline.d/debug.conf
touch /run/initramfs/.need_shutdown
reboot
|
Bog BOS: dracut - создание initramfs
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru