mkinitcpio подробно: хуки, модули и конфиг
Сразу к делу: mkinitcpio это сборщик initramfs в Arch Linux. Вся настройка живёт в одном файле /etc/mkinitcpio.conf: секция MODULES задаёт модули для ранней загрузки, BINARIES и FILES добавляют бинарники и прошивки, а HOOKS упорядоченный список скриптов, которые готовят систему к монтированию корня. После любой правки конфиг пересобирается командой mkinitcpio -P.
Что такое initramfs и зачем он нужен
initramfs это маленькая файловая система, которую ядро распаковывает в память на самом старте. Ядро само не умеет разблокировать LUKS, собирать LVM-тома, монтировать btrfs или подтягивать модули с диска. Всю эту работу выполняет initramfs, а уже потом передаёт управление настоящей системе через pivot_root.
Последовательность такая: загрузчик (GRUB или systemd-boot) передаёт ядру путь к initramfs, ядро распаковывает его в память и запускает скрипт /init. Этот скрипт загружает модули, поднимает устройства, разблокирует шифрование, монтирует корень и переключается на него. Только затем стартует systemd из настоящей системы.
Почему именно mkinitcpio? В других дистрибутивах ту же работу делают dracut (Fedora, RHEL) или initramfs-tools (Debian, Ubuntu). mkinitcpio родной инструмент Arch: конфиг читается за минуту, хуки легко добавлять, а при проблемах всё проверяется парой команд. Если ты перешёл с другого дистрибутива, привыкать придётся недолго.
В Arch Linux initramfs собирает mkinitcpio. Он читает /etc/mkinitcpio.conf, берёт оттуда список модулей, бинарников и хуков, упаковывает всё в архив и кладёт в /boot. На выходе получаются два файла: initramfs-linux.img и initramfs-linux-fallback.img. Первый компактный, под твоё железо. Второй универсальная страховка. Разницу смотри ниже.
Как читать /etc/mkinitcpio.conf
Файл простой: строки вида ПЕРЕМЕННАЯ=(значения через пробел). Комментарии начинаются с #. Всего секций четыре: MODULES, BINARIES, FILES и HOOKS.
MODULES
Сюда пишут модули ядра, которые должны загрузиться сразу, ещё до того, как initramfs начнёт работать с железом. Типичные кандидаты видеодрайверы (i915, amdgpu, nvidia) и модули контроллеров дисков:
MODULES=(i915 nvidia)
Зачем это нужно? Например, с проприетарным драйвером NVIDIA без ранней загрузки модуля возможен чёрный экран или мерцание на старте. А если корень лежит на файловой системе, модуль которой не подхватывается autodetect, без записи в MODULES система просто не смонтирует корень.
Если модуля нет в списке, он может загрузиться позже, через udev или autodetect. Проверить, какие модули реально загружены в работающей системе, можно командой lsmod. Если модуль в списке, но его нет в initramfs, он подхватился уже после старта, и для раннего этапа его не хватает. Имя модуля сверяй с каталогом /usr/lib/modules/$(uname -r)/kernel, оно не всегда совпадает с названием из новостей. Про порядок загрузки модулей и типичные ошибки читай в статье «Модули загружаются в неправильном порядке».
BINARIES и FILES
BINARIES: исполняемые файлы, которые копируются в образ как есть. Обычно секция пустая, но иногда нужно вшить утилиту для раннего этапа, например fsck или cryptsetup.
FILES: произвольные файлы, чаще всего прошивки. Если модуль Wi-Fi или сетевой карты требует firmware, которую autodetect не подхватил, добавь путь явно:
FILES=(/usr/lib/firmware/rtl_nic/rtl8168g-3.fw)
Обе секции работают одинаково: файл копируется в образ по указанному пути. Разница только в назначении: бинарники для запуска, файлы для прошивок и конфигов.
HOOKS
Самая важная секция. Хуки это скрипты, которые выполняются на разных этапах сборки и загрузки. Порядок в списке: порядок выполнения. Стандартный набор для ядра linux выглядит так:
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck)
Посмотреть все доступные хуки можно командой mkinitcpio -L, а справку по конкретному mkinitcpio -H <имя>.
Что делает каждый хук
base, базовое окружение: каталоги, busybox, основные утилиты. Без него ничего не работает, поэтому он всегда первый.udev: запускает udev внутри initramfs, чтобы устройства определялись динамически, а не по жёсткому списку.autodetect: сканирует железо и оставляет в образе только нужные модули. Именно он делает initramfs маленьким.modconf: подхватывает файлы из/etc/modprobe.d, чтобы параметры модулей попали в образ.kms, включает Kernel Mode Setting на раннем этапе: без него возможен чёрный экран и скачки разрешения.keyboard,keymap,consolefont: раскладка и шрифт консоли. Критично, если корень зашифрован и пароль вводится до загрузки системы.block, модули блочных устройств: SATA, NVMe, USB-накопители.filesystems, модули файловых систем: ext4, btrfs, xfs, vfat.fsck: проверка корневой файловой системы перед монтированием.
В systemd-варианте хуки называются иначе: sd-vconsole вместо keyboard и keymap, sd-encrypt вместо encrypt, а вместо udev используется systemd. Если корень на LVM, добавляется хук lvm2. Хук btrfs раньше добавляли для btrfs-корня, сейчас он не нужен: модуль подхватывается autodetect. Подробнее про LVM читай в статье «Установка Arch с LVM».
Какой набор выбирать, классический или systemd? Оба рабочие. Классический проще и легче, systemd-вариант теснее связан с systemd и удобнее при шифровании через sd-encrypt. Менять набор без причины не стоит: переезд с одного на другой это правка HOOKS и проверка загрузки.
Почему порядок хуков так важен
Хуки выполняются строго по порядку. Нарушишь последовательность, получишь зависание на загрузке или падение в emergency shell.
Главные правила:
filesystemsидёт послеblock: сначала должны появиться блочные устройства, потом файловые системы.encryptиlvm2стоят доfilesystems: сначала разблокировка и сборка томов, потом монтирование.fsck: послеfilesystems, но до монтирования корня.autodetect: послеudev, чтобы udev уже знал, какое железо в системе.
Пример для зашифрованного корня с LVM:
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck)
Если поставить encrypt после filesystems, initramfs попробует смонтировать зашифрованный раздел как обычный и упадёт с ошибкой. Порядок это не стилистика, а логика работы: каждый хук подготавливает следующий этап.
Ещё один частый сценарий: забытые keyboard и keymap при зашифрованном корне. Без них пароль вводится в раскладке по умолчанию, и при кириллической раскладке система не примет его. Хук consolefont отвечает за читаемый шрифт на этом экране.
Что такое autodetect и зачем нужен fallback
autodetect смотрит на реальное железо и выкидывает из образа всё лишнее. Поэтому initramfs-linux.img весит десятки мегабайт, а не сотни. Минус: образ привязан к текущей конфигурации. Переставишь диск в другой компьютер, и нужных модулей в initramfs нет.
Для таких случаев существует fallback. Он собирается без autodetect, со всеми модулями сразу. Настройки лежат в /etc/mkinitcpio.d/linux.preset:
ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-linux"
PRESETS=('default' 'fallback')
default_image="/boot/initramfs-linux.img"
fallback_image="/boot/initramfs-linux-fallback.img"
fallback_options="-S autodetect"
default собирается с autodetect, fallback без него (флаг -S autodetect пропускает этот хук). Если после смены железа система не грузится с обычного образа, выбери в меню GRUB пункт с fallback. Он грузится дольше, зато универсальный. У каждого ядра свой пресет: у linux-lts файл linux-lts.preset, у собранного вручную свой. Какой образ использует GRUB, видно в /boot/grub/grub.cfg, там прописаны пути к initramfs-linux.img и initramfs-linux-fallback.img.
Как пересобрать initramfs после изменений
Любая правка /etc/mkinitcpio.conf (добавление модуля, хука или прошивки) требует пересборки. Иначе изменения не попадут в образ.
mkinitcpio -P # пересобрать все пресеты
mkinitcpio -p linux # пересобрать только пресет linux
Флаг -P проходит по всем пресетам из /etc/mkinitcpio.d, -p по конкретному. Если нужно собрать образ в произвольное место, используй -g:
mkinitcpio -g /tmp/test.img
После установки нового ядра pacman запускает mkinitcpio сам через свой хук, но при ручных правках конфига пересборка твоя забота. Если образ собрался с другим ядром, чем ожидалось, смотри статью «initramfs создан с другим ядром».
Как проверить, что внутри initramfs
Содержимое образа показывает утилита lsinitcpio:
lsinitcpio /boot/initramfs-linux.img
Она выведет список файлов и хуков. Флаг -a добавляет детали по каждому файлу, -k версию ядра, для которого собран образ, -x распаковывает образ в текущий каталог для ручного осмотра. Это первое, что стоит сделать, если подозреваешь, что в initramfs чего-то не хватает. Полезно сравнить вывод для default и fallback: разница покажет, какие модули выкинул autodetect.
Что делать, если система не грузится
Зависание на загрузке после правки конфига: классика. Действуй по порядку:
- В меню GRUB выбери fallback-образ. Если он грузится, проблема в autodetect или нехватке модуля.
- Проверь образ:
lsinitcpio -a /boot/initramfs-linux.img, на месте ли нужные модули и хуки. - Добавь хук
debugв конецHOOKSи пересобери. Он откроет интерактивную оболочку внутри initramfs, где можно вручную посмотреть, какие модули загружены и что смонтировано. - После диагностики убери
debugи пересобери образ.
Если fallback не помог, отредактируй пункт меню GRUB прямо при загрузке: нажми e, допиши break к строке ядра, initramfs остановится и откроет оболочку до монтирования корня. Если система всё же стартовала, но с ошибками, смотри логи: journalctl -b покажет, что происходило на раннем этапе. И помни: правки конфига без пересборки не действуют, сначала mkinitcpio -P, потом перезагрузка. Если проблема появилась после обновления самого mkinitcpio (например, сломался LUKS или TPM) разбор есть в статье «mkinitcpio v42 сломал TPM/LUKS».
Частые вопросы
Нужно ли пересобирать initramfs после каждого обновления ядра?
Нет. pacman делает это автоматически через свой хук: при установке нового ядра mkinitcpio запускается сам и собирает образы для всех пресетов. Ручная пересборка нужна только после правок /etc/mkinitcpio.conf или ручной установки модулей.
Чем отличается default от fallback?
default собран с autodetect и содержит только модули для твоего железа. fallback: полный набор модулей без autodetect. Он нужен как страховка при смене железа или поломке основного образа. В меню GRUB оба пункта обычно соседствуют.
Что делать, если после добавления модуля в MODULES ничего не изменилось?
Проверь, что пересобрал образ: mkinitcpio -P. Потом посмотри lsinitcpio, попал ли модуль внутрь. Если нет, сверь имя модуля с каталогом /usr/lib/modules/$(uname -r)/kernel, оно может отличаться от ожидаемого.
Можно ли убрать autodetect, чтобы не было проблем?
Можно, но тогда initramfs раздуется до сотен мегабайт и будет грузиться заметно дольше. Лучше оставить autodetect и пользоваться fallback как страховкой.
Зачем нужен хук debug, если есть логи?
Логи появляются уже после старта systemd. А debug работает внутри initramfs, до монтирования корня, когда система ещё не пишет в журнал. Это единственный способ посмотреть, что происходит на самом раннем этапе.
Полезные ресурсы
- mkinitcpio (ArchWiki): официальная документация по хукам, пресетам и флагам.
- Arch boot process (ArchWiki): полная картина загрузки Arch от BIOS до initramfs.
Заключение
mkinitcpio это один конфиг-файл и понятный порядок действий. MODULES: что загрузить рано, HOOKS: что выполнить и в каком порядке, autodetect: почему образ маленький, fallback: страховка на случай смены железа. Поменял конфиг, пересобери mkinitcpio -P. Не грузится, проверь lsinitcpio и попробуй fallback. Этого достаточно, чтобы решить большинство проблем с загрузкой. А live-USB с Arch держи под рукой на крайний случай.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии