Сразу к делу: mkinitcpio — это сборщик initramfs в Arch Linux. Вся настройка живёт в одном файле — /etc/mkinitcpio.conf: секция MODULES задаёт модули для ранней загрузки, BINARIES и FILES добавляют бинарники и прошивки, а HOOKS — упорядоченный список скриптов, которые готовят систему к монтированию корня. После любой правки конфиг пересобирается командой mkinitcpio -P.
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. Первый — компактный, под твоё железо, второй — универсальная страховка. Разницу смотри ниже.
Файл простой: строки вида ПЕРЕМЕННАЯ=(значения через пробел). Комментарии начинаются с #. Всего секций четыре: MODULES, BINARIES, FILES и HOOKS.
Сюда пишут модули ядра, которые должны загрузиться сразу, ещё до того, как initramfs начнёт работать с железом. Типичные кандидаты — видеодрайверы (i915, amdgpu, nvidia) и модули контроллеров дисков:
MODULES=(i915 nvidia)
Зачем это нужно? Например, с проприетарным драйвером NVIDIA без ранней загрузки модуля возможен чёрный экран или мерцание на старте. А если корень лежит на файловой системе, модуль которой не подхватывается autodetect, без записи в MODULES система просто не смонтирует корень.
Если модуля нет в списке, он может загрузиться позже — через udev или autodetect. Проверить, какие модули реально загружены в работающей системе, можно командой lsmod. Если модуль в списке, но его нет в initramfs — он подхватился уже после старта, и для раннего этапа его не хватает. Имя модуля сверяй с каталогом /usr/lib/modules/$(uname -r)/kernel — оно не всегда совпадает с названием из новостей. Про порядок загрузки модулей и типичные ошибки — в статье «Модули загружаются в неправильном порядке».
BINARIES — исполняемые файлы, которые копируются в образ как есть. Обычно секция пустая, но иногда нужно вшить утилиту для раннего этапа, например fsck или cryptsetup.
FILES — произвольные файлы, чаще всего прошивки. Если модуль Wi-Fi или сетевой карты требует firmware, которую autodetect не подхватил, добавь путь явно:
FILES=(/usr/lib/firmware/rtl_nic/rtl8168g-3.fw)
Обе секции работают одинаково: файл копируется в образ по указанному пути. Разница только в назначении — бинарники для запуска, файлы для прошивок и конфигов.
Самая важная секция. Хуки — это скрипты, которые выполняются на разных этапах сборки и загрузки. Порядок в списке — порядок выполнения. Стандартный набор для ядра 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 смотрит на реальное железо и выкидывает из образа всё лишнее. Поэтому 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.
Любая правка /etc/mkinitcpio.conf — добавление модуля, хука или прошивки — требует пересборки. Иначе изменения не попадут в образ.
mkinitcpio -P # пересобрать все пресеты
mkinitcpio -p linux # пересобрать только пресет linux
Флаг -P проходит по всем пресетам из /etc/mkinitcpio.d, -p — по конкретному. Если нужно собрать образ в произвольное место, используй -g:
mkinitcpio -g /tmp/test.img
После установки нового ядра pacman запускает mkinitcpio сам через свой хук, но при ручных правках конфига пересборка — твоя забота. Если образ собрался с другим ядром, чем ожидалось, — смотри статью «initramfs создан с другим ядром».
Содержимое образа показывает утилита lsinitcpio:
lsinitcpio /boot/initramfs-linux.img
Она выведет список файлов и хуков. Флаг -a добавляет детали по каждому файлу, -k — версию ядра, для которого собран образ, -x — распаковывает образ в текущий каталог для ручного осмотра. Это первое, что стоит сделать, если подозреваешь, что в initramfs чего-то не хватает. Полезно сравнить вывод для default и 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».
Нет. pacman делает это автоматически через свой хук: при установке нового ядра mkinitcpio запускается сам и собирает образы для всех пресетов. Ручная пересборка нужна только после правок /etc/mkinitcpio.conf или ручной установки модулей.
default собран с autodetect и содержит только модули для твоего железа. fallback — полный набор модулей без autodetect. Он нужен как страховка при смене железа или поломке основного образа. В меню GRUB оба пункта обычно соседствуют.
Проверь, что пересобрал образ: mkinitcpio -P. Потом посмотри lsinitcpio — попал ли модуль внутрь. Если нет, сверь имя модуля с каталогом /usr/lib/modules/$(uname -r)/kernel — оно может отличаться от ожидаемого.
Можно, но тогда initramfs раздуется до сотен мегабайт и будет грузиться заметно дольше. Лучше оставить autodetect и пользоваться fallback как страховкой.
Логи появляются уже после старта systemd. А debug работает внутри initramfs, до монтирования корня, когда система ещё не пишет в журнал. Это единственный способ посмотреть, что происходит на самом раннем этапе.
mkinitcpio — это один конфиг-файл и понятный порядок действий. MODULES — что загрузить рано, HOOKS — что выполнить и в каком порядке, autodetect — почему образ маленький, fallback — страховка на случай смены железа. Поменял конфиг — пересобери mkinitcpio -P. Не грузится — проверь lsinitcpio и попробуй fallback. Этого достаточно, чтобы решить большинство проблем с загрузкой. А live-USB с Arch держи под рукой на крайний случай.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии