Jump to content

# mkinitcpio (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи mkinitcpio. Дата последней синхронизации: 12 августа 2025. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- Booster
- Отладка загрузки
- dracut
- Модули ядра
- mkinitcpio/Minimal initramfs
- systemd (Русский)
- Unified kernel image

mkinitcpio — это bash-скрипт, используемый для создания начального загрузочного диска системы. Из man-страницы mkinitcpio(8):

  Начальный ram-диск по сути представляет собой очень маленькую среду (раннее пользовательское пространство, early userspace), которая загружает различные модули ядра и настраивает необходимые вещи перед передачей управления процессу `init`. Это позволяет, например, использовать зашифрованную корневую файловую систему или разместить её на программном RAID-массиве. mkinitcpio легко расширяется с помощью настраиваемых хуков, имеет автоопределение во время работы системы и многие другие функции.

Традиционно ядро отвечает за обнаружение всего оборудования и выполняет задачи на ранних этапах процесса загрузки до монтирования корневой файловой системы. Однако по мере развития технологий эти задачи становятся всё более сложными.

В настоящее время корневая файловая система может быть на широком диапазоне аппаратных средств от SCSI до SATA и USB дисков, управляемых различными контроллерами от разных производителей. Кроме того корневая файловая система может быть зашифрована или сжата, находиться в RAID массиве или группе логических томов. Простой способ справиться с этой сложностью является передача управления в пользовательском пространстве: начальный загрузочный диск. Смотрите также: /dev/brain0 » Blog Archive » Early Userspace in Arch Linux.

mkinitcpio разрабатывается разработчиками Arch Linux при участии сообщества. Смотрите публичный Git-репозиторий mkinitcpio.

Важно отметить, что существует два различных подхода к выполнению задач на этапе работы начального загрузочного диска:

На основе Busybox
  Запускается init-скрипт, который, в свою очередь, сканирует файловую систему ram-диска в поисках скриптов для выполнения (в данном контексте называемых «runtime hooks»). Плюсы: лёгкий, небольшой размер, меньше зависимостей.
На основе systemd
  systemd запускается уже в начале работы начального загрузочного диска. Выполняемые задачи определяются с помощью обычных юнитов systemd. Смотрите процесс запуска systemd. Плюсы: тесная интеграция с остальной частью экосистемы systemd, что приводит к более последовательному и оптимизированному процессу запуска. Более эффективная параллелизация определённых задач загрузки, что в некоторых случаях может привести к сокращению общего времени запуска. Более полный набор функций, например systemd-cryptsetup-generator с `/etc/crypttab.initramfs` или автомонтирование GPT-разделов. Минусы: Больше зависимостей и больший размер: как правило, приводит к увеличению размера initramfs из-за включения исполняемых файлов systemd и его зависимостей. Это может немного увеличить время загрузки.

Используемый подход выбирается путём добавления или удаления `systemd` в массиве `HOOKS` в файле `/etc/mkinitcpio.conf`. Подробнее в разделе #Доступные хуки.

## Установка

Установите пакет mkinitcpio, который является зависимостью пакета linux, поэтому большинство пользователей уже установили его.

Продвинутые пользователи могут захотеть установить последнюю версию mkinitcpio из Git с пакетом mkinitcpio-gitAUR.

## Создание загрузочного образа

### Автоматическая генерация

Каждый раз, когда ядро устанавливается или обновляется, pacman-хук генерирует файл предустановки (.preset) и сохраняет его в `/etc/mkinitcpio.d/`. Например, для официального пакета linux создаётся файл `linux.preset`. Предустановка — это просто список информации, необходимой для создания начальных образов RAM-диска, вместо того, чтобы вручную указывать различные параметры и расположение выходных файлов. По умолчанию mkinitcpio генерирует два образа после установки или обновления ядра:

1. default, создаваемый в соответствии с директивами, указанными в настройках, и
2. fallback, который создается с точно таким же конфигурационным файлом за исключением хука autodetect, что позволяет включить в него все модули.

После создания файла предустановки pacman-хук запускает скрипт mkinitcpio, который генерирует два образа, используя информацию, указанную в этом файле.

Примечание .preset файлы используются для автоматической пересборки initramfs после обновления ядра. Будьте внимательны при их редактировании.

### Ручная генерация

Чтобы запустить скрипт вручную, обратитесь к mkinitcpio(8) для чтения инструкций. В частности, чтобы (повторно) сгенерировать образ initramfs, используя предустановку, предоставленную пакетом ядра, используйте параметр `-p`/`--preset` с именем нужной предустановки. Например, для ядра linux используйте такую команду:

    # mkinitcpio -p linux

Чтобы (повторно) сгенерировать образы initramfs, используя все существующие предустановки, используйте параметр `-P`/`--allpresets`. Обычно это используется для перегенерации всех образов initramfs после изменения глобальных настроек:

    # mkinitcpio -P

Можно создать любое количество образов initramfs с различными конфигурациями. Путь к нужному образу должен быть прописан в настройках загрузчика.

### Варианты создания initcpio

Пользователи могут вручную создать образ с помощью альтернативного конфигурационного файла. Например, следующее будет генерировать initramfs образ в соответствии с `/etc/mkinitcpio-custom.conf` и сохранит его в `/boot/linux-custom.img`.

    # mkinitcpio --config /etc/mkinitcpio-custom.conf --generate /boot/initramfs-custom.img

Если необходимо создать образ с ядром отличным от загруженного, добавьте параметр с версией ядра. Доступные версии ядер можно посмотреть в `/usr/lib/modules`, синтаксис соответствует выводу `uname -r` для каждого ядра.

    # mkinitcpio --generate /boot/initramfs-custom2.img --kernel 5.7.12-arch1-1

### Unified kernel images

mkinitcpio может генерировать unified kernel image (UKI) самостоятельно или через systemd-ukify. Если systemd-ukify не установлен или явно отключен опцией `--no-ukify`, mkinitcpio соберёт UKI сам, но тогда дополнительные возможности, которые предоставляет ukify, будут недоступны.

Подробнее в статье Unified kernel image.

## Настройка

`/etc/mkinitcpio.conf` — основной файл настроек mkinitcpio. Поддерживаются drop-in файлы, например `/etc/mkinitcpio.conf.d/myhooks.conf` (но они игнорируются при запуске с опцией `-c` и/или использовании предустановки, содержащей `ALL_config`). Кроме того, в каталоге `/etc/mkinitcpio.d` располагаются файлы предустановок (например `/etc/mkinitcpio.d/linux.preset`).

Можно изменять семь переменных в файле настроек (подробнее в документации mkinitcpio.conf(5) § VARIABLES):

`MODULES`
  Модули ядра, которые будут загружены до выполнения хуков.
`BINARIES`
  Дополнительные исполняемые файлы, которые необходимо включить в initramfs.
`FILES`
  Дополнительные файлы, которые необходимо включить в initramfs.
`HOOKS`
  Хуки — скрипты, выполняемые в initramfs.
`COMPRESSION`
  Тип используемого сжатия initramfs.
`COMPRESSION_OPTIONS`
  Дополнительные опции, передаваемые программе, указанной в переменной `COMPRESSION`. Использование этого параметра не рекомендуется. mkinitcpio будет обрабатывать особые требования к инструментам сжатия (например `--check=crc32` для xz), и неправильное использование может привести к невозможности запуска системы.
`MODULES_DECOMPRESS`
  Разжимать ли загружаемые модули ядра и файлы прошивок перед их записью в initramfs или сохранять их в исходном сжатом виде.

Примечание

- Некоторые хуки, которые могут быть нужны для вашей системы, вроде lvm2, mdadm_udev и encrypt, НЕ включены по умолчанию. Смотрите раздел #HOOKS, чтобы узнать, как их включить и настроить.
- Файлы предустановок, созданные через mkinitcpio до версии 36, устанавливают переменную `ALL_config`, что предотвращает загрузку drop-in файлов. Чтобы они загружались, закомментируйте строку `ALL_config="/etc/mkinitcpio.conf"` в старых файлах предустановок.

### MODULES

Указывает, какие модули ядра должны быть загружены перед выполнением всех остальных действий.

Для модулей с суффиксом `?` не будет выводиться ошибка, если они не будут найдены. Это может быть полезно для пользовательских ядер.

Примечание

- При использовании сторонних (out-of-tree) файловых систем, которые нужно монтировать в early userspace (например, если такая файловая система используется для корневого раздела), соответствующие модули (например, `reiser4`) должны быть добавлены в массив `MODULES`.
- При использовании хука encrypt или sd-encrypt модули клавиатуры и/или файловых систем, необходимые для разблокировки устройства LUKS во время загрузки системы, нужно добавить в массив `MODULES`, когда целевая система отличается от той, которая использовалась для запуска mkinitcpio. Например, если вы используете keyfile в файловой системе ext2, но во время запуска mkinitcpio файловая система ext2 не смонтирована, добавьте `ext2`. Подробнее смотрите dm-crypt/System configuration#cryptkey.
- Если клавиатура подключена через USB3-хаб и вы хотите использовать её для разблокировки LUKS устройства, добавьте `usbhid xhci_hcd`.
- При использовании дисплеев, подключенных к док-станции, вам может потребоваться добавить модуль для вашей видеокарты, чтобы сделать вывод initrd видимым (например `i915` для большинства карт Intel).

### BINARIES и FILES

Указывают, какие файлы необходимо добавить в initramfs. `BINARIES` и `FILES` будут добавлены перед запуском хуков и могут использоваться для переопределения файлов, используемых или предоставляемых хуками. `BINARIES` — бинарные файлы из `PATH`, все необходимые для их работы библиотеки будут добавлены автоматически. `FILES` добавляет файлы как есть. Например:

    FILES=(/etc/modprobe.d/modprobe.conf)

    BINARIES=(kexec)

И `BINARIES`, и `FILES` являются bash-массивами, в них можно добавить несколько файлов с пробелом в качестве разделителя.

### HOOKS

Массив `HOOKS` наиболее важный в файле настроек. Хуки — это небольшие скрипты, которые описывают, что будет добавлено к образу, а также дополнительные действия, выполняемые при загрузке системы. Хуки указываются по имени и выполняются в порядке, заданном в массиве `HOOKS`.

Значение по умолчанию для `HOOKS` должно быть достаточным для большинства простых установок с одним диском. Для корневых устройств, которые являются многоуровневыми или многоблочными устройствами, такими как LVM, mdadm или dm-crypt, смотрите cоответствующие страницы вики для дальнейшей необходимой конфигурации.

#### Build hooks

Build hooks — хуки сборки. Располагаются в `/usr/lib/initcpio/install/`; пользовательские хуки можно добавить в `/etc/initcpio/install/`. mkinitcpio выполняет source этих файлов в bash во время сборки initramfs. Должны содержать две функции: `build` и `help`. Функция `build` перечисляет модули, файлы и исполняемые файлы, которые добавляются в образ. Функции, которые могут использовать хуки сборки, описаны в mkinitcpio(8). Функция `help` выводит описание действий хука.

Для получения списка всех доступных хуков:

    $ mkinitcpio -L

Используйте опцию `-H`/`--hookhelp` для вывода информации о конкретном хуке:

    $ mkinitcpio -H udev

#### Runtime hooks

Runtime hooks — хуки времени выполнения. Располагаются в `/usr/lib/initcpio/hooks/`, пользовательские хуки можно добавить в `/etc/initcpio/hooks/`. Для любого runtime-хука всегда должен быть build-хук, имеющий такое же имя и вызывающий функцию `add_runscript`, которая добавит runtime-хук в образ. Во время early userspace выполняется source этих файлов командным интерпретатором ash из busybox. Они запускаются по порядку записи в `HOOKS`, за исключением хуков очистки. Runtime-хуки могут содержать несколько функций:

`run_earlyhook`: Функции с таким именем будут запускаться один раз после монтирования API файловых систем и обработки командной строки ядра. Как правило, здесь запускаются дополнительные демоны, такие как udev, необходимые для раннего процесса загрузки.

`run_hook`: Функции с таким именем запускаются вскоре после ранних хуков. Эта функция используется чаще всего, и здесь должны выполняться операции, такие как сборка многоуровневых блочных устройств.

`run_latehook`: Функции c этим именем запускаются после того, как была примонтирована корневая файловая система. Это следует использовать ограниченно для дальнейшей настройки корневой ФС или для монтирования других файловых систем, таких как `/usr`.

`run_cleanuphook`: Функции с этим именем запускаются как можно позже и в порядке обратном порядку их перечисления в массиве `HOOKS` из файла настроек. Эти хуки должны использоваться для любой очистки в последнюю минуту, например, для закрытия всех демонов, запущенных ранними хуками.

Примечание Runtime-хуки используются только в busybox init. Хук systemd запускает инициализацию на основе systemd, который вместо runtime-хуков использует юниты systemd.

#### Post hooks

Post hooks — исполняемые файлы, которые выполняются после завершения создания образа initramfs. Располагаются в `/usr/lib/initcpio/post/`, пользовательские хуки можно добавить в `/etc/initcpio/post/`. Их можно использовать для дополнительных задач вроде подписи созданного образа.

Каждый исполняемый файл запускается с тремя аргументами в таком порядке:

1. использованное ядро (иногда может быть пустым);
2. созданный образ initramfs;
3. (опционально) созданный unified kernel image.

Также устанавливаются переменные окружения `KERNELVERSION`, содержащая полную версию ядра, и `KERNELDESTINATION`, содержащая путь, в котором должно находиться ядро, чтобы оно могло быть загружено.

#### Доступные хуки

Таблица стандартных хуков и как они влияют на создание и выполнение образа. Обратите внимание, что эта таблица не является полной, так как пакеты могут предоставлять свои хуки.

busybox init | systemd init | Build hook | Runtime hook (только busybox init)
--- | --- | --- | ---
base | опционален | Устанавливает все начальные каталоги, базовые утилиты и библиотеки. Всегда ставьте этот хук первым, за исключением случаев, когда вы действительно знаете, что делаете, если не используется хук systemd. Опционален при использовании хука systemd, поскольку он лишь предоставляет busybox recovery shell. Примечание Командная оболочка восстановления недоступна, так как аккаунт root в initramfs заблокирован. Смотрите archlinux/mkinitcpio/mkinitcpio#205. | –
udev | systemd | Добавляет в образ udevd, udevadm и небольшое подмножество правил udev. | Запускает демон udev и обрабатывает uevents из ядра, создавая файлы устройств. Поскольку он упрощает процесс загрузки, не требуя от пользователя явного указания необходимых модулей, его использование рекомендуется.
usr | Добавляет поддержку отдельного раздела `/usr`. Подробнее: #/usr на отдельном разделе | Монтирует раздел `/usr` после монтирования корневой файловой системы.
resume | Добавляет модули ядра `lzo` и `lz4`, позволяющие загрузить образ памяти, созданный при уходе в спящий режим, если этот образ сжат алгоритмом, не используемым по умолчанию. Добавляет исполняемый файл systemd-hibernate-resume(8) для поддержки загрузки образа памяти, указанного в UEFI-переменной `HibernateLocation`. | Пытается возобновить систему после спящего режима. Подробнее в разделе Ждущий и спящий режимы#Гибернация.
btrfs | – | Устанавливает необходимые модули для использования файловой системы Btrfs, расположенной на нескольких устройствах. Для использования хука нужно установить btrfs-progs. Этот хук не требуется, если Btrfs расположена на одном устройстве, так как для этого достаточно хука `filesystems`. | Запускает `btrfs device scan` для сборки корневой файловой системы Btrfs, расположенной на нескольких устройствах, когда хуки udev и systemd отсутствуют. Для использования хука нужно установить btrfs-progs.
autodetect | Уменьшает размер initramfs, пытаясь определить, какие модули вам нужны, сканируя sysfs. Проверьте список модулей, которые он добавил. Он должен запускаться раньше других подсистем. Все обработчики, выполняемые до него, будут включать все модули. | –
microcode | Перед основным образом initramfs добавляет несжатый образ, содержащий файлы с обновлениями микрокода для процессоров Intel и AMD. Использует файлы микрокода из каталогов `/usr/lib/firmware/amd-ucode/` и `/usr/lib/firmware/intel-ucode/`, если они доступны, иначе извлекает `/boot/amd-ucode.img` и `/boot/intel-ucode.img`. Если перед этим хуком находится хук autodetect, будут добавлены файлы микрокода только для того процессора, на котором была запущена генерация образа. Этот хук заменяет устаревший флаг `--microcode` и опцию `microcode` в файлах предустановок. Он также позволяет убрать из настроек загрузчика второй параметр `initrd`, указывающий на отдельный образ с микрокодом, поскольку микрокод теперь находится в одном файле с основным образом initramfs. | –
modconf | Добавляет конфигурационные файлы modprobe из `/etc/modprobe.d/` и `/usr/lib/modprobe.d/` | –
kms | Добавляет модули видеокарт для раннего запуска KMS. Также добавляет модули, необходимые для экранов конфиденциальности (privacy screens), встроенных в ЖК-панели некоторых ноутбуков. | –
keyboard | Добавляет модули, необходимые для работы клавиатур. Используйте этот хук, если необходимо использовать USB-клавиатуру на ранней стадии загрузки (для ввода пароля от зашифрованных данных или для работы в командной оболочке). В качестве побочного эффекта также могут быть добавлены модули для некоторых устройств ввода без клавиатуры, но на это не следует полагаться. Примечание Для систем, которые загружаются с различными конфигурациями оборудования (например, ноутбуки с внешней клавиатурой или внутренней клавиатурой или headless-системы), этот хук необходимо поместить перед autodetect, чтобы иметь возможность использовать клавиатуру во время загрузки, например, чтобы разблокировать зашифрованное устройство при использовании хука `encrypt`. | –
keymap | sd-vconsole | Добавляет в initramfs раскладки, указанные в `/etc/vconsole.conf`. При использовании шифрования системы добавляйте его перед хуком `encrypt`. | Загружает раскладки, указанные в `/etc/vconsole.conf`.
consolefont | Добавляет в образ консольный шрифт, указанный в `/etc/vconsole.conf`. | Загружает шрифт, указанный в `/etc/vconsole.conf`.
block | Добавляет в образ модули блочных устройств. Если перед этим хуком находится хук autodetect, будут добавлены только модули, используемые в системе. Исключения — модули `ahci`, `sd_mod`, `usb_storage`, `uas`, `mmc_block`, `nvme`, `virtio_scsi` и `virtio_blk`, которые добавляются всегда. | –
net | не реализован | Добавляет модули, необходимые для сетевых устройств. Для использования хука нужно установить mkinitcpio-nfs-utils. Подробнее: #При использовании net | Занимается обработкой корневой файловой системы, расположенной на NFS.
dmraid | ? | Поддержка корневой файловой системы на fakeRAID массивах. Необходимо установить пакет dmraid. Обратите внимание, что рекомендуется использовать mdadm с хуком mdadm_udev с fakeRAID, если ваш контроллер поддерживает это. Подробнее: #При использовании RAID | Находит и монтирует fakeRAID блочные устройства, используя `dmraid`.
mdadm_udev | Обеспечивает поддержку сборки RAID-массивов с помощью udev. Для использования хука нужно установить mdadm. Подробнее: RAID#Configure mkinitcpio | –
encrypt | sd-encrypt | Добавляет в образ модуль ядра `dm_crypt` и инструмент `cryptsetup`. Для использования хука нужно установить cryptsetup. Примечание Обратите внимание на замечания для хука keyboard выше для разблокировки зашифрованного устройства во время загрузки, а также примечания о файловых системах в #MODULES, если вы используете файл для разблокировки. | Определяет и подключает зашифрованный корневой раздел. Смотрите #Настройка во время выполнения для дальнейшей настройки. Для sd-encrypt смотрите dm-crypt/System configuration#Using systemd-cryptsetup-generator.
lvm2 | Добавляет в образ модуль ядра device mapper и инструмент `lvm`. Для использования хука нужно установить lvm2. Необходим, если корневая файловая система находится на LVM. | –
filesystems | Добавляет в образ модули необходимых файловых систем. Этот хук обязателен, если вы не указываете модули файловых систем в `MODULES`. | –
fsck | Добавляет исполняемый файл fsck и необходимые обработчики файловых систем для проверки корневой файловой системы (и `/usr`, если он на отдельном разделе) перед монтированием. Если стоит после хука autodetect, то будут добавлены только обработчики для вашей корневой файловой системы. Использование этого хука настоятельно рекомендуется и обязательно с отдельным `/usr` разделом. При включении этого хука крайне рекомендуется также включить все необходимые модули для обеспечения работы вашей клавиатуры в early userspace. Использование этого хука требует, чтобы rw передавался в командной строке ядра (обсуждение). Смотрите fsck (Русский)#Проверка при загрузке для подробностей. | –
acpi_override | Добавляет в ранний несжатый образ файлы ACPI Machine Language (.aml) из каталогов `/usr/initcpio/acpi_override/` и `/etc/initcpio/acpi_override/`, чтобы ядро могло переопределить таблицы ACPI (например DSDT) на раннем этапе загрузки.[1] | –

### COMPRESSION

Ядро поддерживает несколько форматов для сжатия initramfs: gzip, bzip2, lzma (xz), xz, lzo (lzop), lz4 и zstd. По умолчанию mkinitcpio использует zstd для ядра 5.9 и более новых версий или gzip для старых версий.

Стандартный `mkinitcpio.conf` имеет различные закомментированные варианты `COMPRESSION`. Раскомментируйте один из них, чтобы выбрать необходимый формат сжатия, и убедитесь, что соответствующий инструмент сжатия установлен в системе. Чтобы создать несжатый образ, укажите `COMPRESSION=cat` в конфигурации или используйте `-z cat` в командной строке.

Совет

- Инструменты сжатия lz4 и xz используют многопоточность по умолчанию, а сжатие zstd запускается в многопоточном режиме (с опцией `-T0`, которая запускает столько же потоков, сколько ядер в процессоре).
- Со степенью сжатия около 2.5 на образе в режиме высокого сжатия (`-9`) lz4 обеспечивает самую быструю скорость распаковки. Немного лучшее сжатие даёт lzo, который при этом всё ещё довольно быстро распаковывается. zstd предлагает универсальное решение с многопоточным сжатием и широким диапазоном уровней сжатия с помощью своих опций — смотрите zstd(1) § Operation modifiers. xz достигает наименьшего размера с коэффициентом уменьшения около 5 в предустановке высокой степени сжатия (`-9`) за счёт гораздо более низкой скорости распаковки.

### COMPRESSION_OPTIONS

Это дополнительные флаги, передаваемые программе, указанной в переменной `COMPRESSION`, например:

    COMPRESSION_OPTIONS=(-9)

Эту опцию можно не трогать: mkinitcpio сам позаботится о том, чтобы любой поддерживаемый метод сжатия имел необходимые флаги для создания рабочего образа.

Важно Неправильное использование этого параметра может привести к незагружаемой системе, если ядро не сможет распаковать полученный архив.

При использовании сжатия zstd можно сэкономить место для пользовательских ядер (особенно при использовании двойной загрузки с монтированием системного раздела EFI в `/boot`) с помощью опции `--long`. Однако системы с небольшим объёмом оперативной памяти могут не осилить распаковку образа initramfs при использовании этой опции. Опция `-v` также может быть полезна для просмотра подробностей во время генерации образа initramfs. Например:

    COMPRESSION="zstd"
    COMPRESSION_OPTIONS=(-v -5 --long)

Самое сильное, но самое медленное сжатие можно получить при использовании xz с опцией `-9e` и распаковки файлов модулей и прошивок перед их записью в initramfs:

    COMPRESSION="xz"
    COMPRESSION_OPTIONS=(-9e)
    MODULES_DECOMPRESS="yes"

### MODULES_DECOMPRESS

Переменная `MODULES_DECOMPRESS` контролирует, будут ли файлы модулей ядра и прошивок разжаты перед их записью в образ initramfs. Значение по умолчанию — `no`.

Arch сжимает модули официальных ядер и файлы прошивок в linux-firmware с помощью zstd с уровнем сжатия 19. При использовании более высокого уровня сжатия для initramfs установка `MODULES_DECOMPRESS="yes"` позволит ещё сильнее уменьшить размер initramfs. Это достигается за счёт увеличения использования памяти и процессора на ранних этапах загрузки, что негативно сказывается на системах с небольшим объёмом памяти или слабым процессором, поскольку во время загрузки системы ядро будет тратить больше времени на распаковку образа initramfs целиком вместо того, чтобы по отдельности распаковывать только нужные файлы модулей и прошивок.

Совет Чтобы избежать повторного сжатия уже сжатых файлов, перед завершением генерации initramfs все файлы с расширениями .bz2, .gz, .lz4, .lzma, .lzo, .xz и .zst перемещаются в ранний несжатый образ.

## Настройка во время выполнения

Настройки среды выполнения могут быть переданы в `init` и некоторые хуки через параметры ядра, которые обычно задаются в загрузчике. Приведённые ниже параметры могут быть добавлены в командную строку ядра для изменения поведения по умолчанию. Подробности смотрите в статьях Параметры ядра и Процесс загрузки Arch.

### init из хука base

`root=`
  Это самый важный параметр, указываемый в командной строке ядра, поскольку он определяет, какое устройство будет смонтировано как корневая ФС. mkinitcpio поддерживает большой набор форматов; примеры есть в разделе Постоянные имена для блочных устройств#Параметры ядра.

Примечание Следующие параметры загрузки изменяют поведение `init` по умолчанию в среде initramfs. Подробнее смотрите `/usr/lib/initcpio/init`. Они не будут работать при использовании хука `systemd`, так как он заменит `init` из хука `base`.

`break`
  Если указан `break` или `break=premount`, `init` приостановит процесс загрузки (после загрузки хуков, но перед монтированием корневой ФС) и запустит интерактивную оболочку, которую можно использовать для устранения неполадок. Эту оболочку можно запустить после монтирования корневой ФС, указав `break=postmount`. После выхода из оболочки продолжится обычная загрузка.

`disablehooks=`
  Отключает runtime-хуки, перечисленные через запятую: `disablehooks=хук1[,хук2,...]`. Например:

      disablehooks=resume

`earlymodules=`
  Изменяет порядок загрузки модулей, загружая указанные здесь модули раньше остальных: `earlymodules=модуль1[,модуль2,...]`. (Это может использоваться, например, для обеспечения правильного порядка нескольких сетевых интерфейсов.)

Смотрите Устранение часто встречающихся неполадок#Проблемы загрузки и mkinitcpio(8) для более подробной информации.

### При использовании RAID

Смотрите RAID#Configure mkinitcpio.

### При использовании net

Примечание NFSv4 ещё не поддерживается FS#28287.

Требуемые пакеты

Хук `net` требует пакет mkinitcpio-nfs-utils.

Параметры ядра

Полную и актуальную информацию можно найти в официальной документации ядра.

ip=

Этот параметр сообщает ядру, как настраивать IP-адреса устройств и таблицу маршрутизации. Может принимать до девяти аргументов, разделённых двоеточиями:

`ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>`.

Если этот параметр не указан, все поля считаются пустыми и используются значения по умолчанию, описанные в документации ядра. В целом это подразумевает, что ядро пытается настроить всё с помощью автоконфигурации.

Можно указать `<autoconf>` в одиночку как значение параметра `ip` (без всех двоеточий перед ним). Значение `ip=off` или `ip=none` отключает автоконфигурацию. Чаще всего используется `ip=dhcp`.

Разъяснение параметров:

     <client-ip>   IP адрес клиента. Если пустой, то автоматически назначается
                   протоколом RARP/BOOTP/DHCP. Какой протокол используется
                   зависит от параметра <autoconf>. Если его значение не пустое,
                   то autocnf работает корректно.

     <server-ip>   IP адрес NFS сервера. Если используется RARP для определения
                   адреса клиента и этот параметр не пуст, то принимаются ответы
                   только от указанного сервера.
                   Для использования разных RARP и NFS серверов,
                   укажите ваш RARP сервер здесь (или оставьте пустым), и
                   укажите ваш NFS сервер в параметре `nfsroot'
                   (см. выше). Если тут пусто, будет использован сервер, ответивший
                   на RARP/BOOTP/DHCP запрос.

     <gw-ip>       IP адрес шлюза если сервер в другой подсети. Если тут пусто,
                   предполагается, что сервер находится в одной подсети, если значение
                   не получено по BOOTP/DHCP.

     <netmask>     Маска подсети для локального интерфейса. Если тут пусто,
                   используется маска по умолчанию в зависимости от класса IP,
                   если конечно не переопределена значением из BOOTP/DHCP ответа.

     <hostname>    Имя машины клиента. Если пусто, используется IP адрес в виде ASCII
                   строки, или значение полученное по BOOTP/DHCP.

     <device>      Имя сетевого устройства. Если тут пусто, все устройства будут использованы
                   для RARP/BOOTP/DHCP запросов, и все настройки будут получены из первого
                   пришедшего ответа. Если вы имеете только одно сетевое устройство, можно спокойно
                   оставить поле пустым.

     <autoconf>	Какой метод использовать для автонастройки: 'rarp', 'bootp', или 'dhcp'.
                   Если значение 'both', 'all' или пусто, все протоколы будут использованы.
                   'off', 'static' или 'none' означают запрет автонастройки.

     <dns0-ip>     IP-адрес основного DNS-сервера. Определяется автоматически при включенном autoconf.
                   Значение доступно в /proc/net/pnp с префиксом "nameserver ".

     <dns1-ip>     IP-адрес запасного DNS-сервера, аналогично <dns0-ip>.

     <ntp0-ip>     IP-адрес NTP-сервера. Определяется автоматически при включенном autoconf.
                   Значение доступно в /proc/net/ipconfig/ntp_servers, ядром не используется.

Полное объяснение параметров можно почитать в документации ядра (на английском).

Примеры:

     ip=127.0.0.1:::::lo:none  --> Разрешить lo интерфейс.
     ip=192.168.1.1:::::eth2:none --> Статический eth2 интерфейс.
     ip=:::::eth0:dhcp --> Разрешить dhcp протокол для настройки интерфейса eth0.

Примечание Используйте имена устройств ядра (например, `eth0`) для параметра `<device>`; постоянные имена (например, `enp2s0`) не будут работать. Подробнее смотрите Настройка сети#Сетевые интерфейсы.

BOOTIF=

Если у вас несколько сетевых карт, в этом параметре можно указать MAC-адрес интерфейса, с которого вы загружаетесь. Это часто бывает полезно, так как нумерация интерфейсов может измениться, или в сочетании с опцией pxelinux IPAPPEND 2 или IPAPPEND 3. Если не указан, будет использоваться `eth0`.

Пример

    BOOTIF=01-A1-B2-C3-D4-E5-F6  # Обратите внимание на ведущий "01-" и верхний регистр.

nfsroot=

Если параметр `nfsroot` НЕ передан, будет использовано значение по умолчанию `/tftpboot/%s`.

     nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

Описание параметров:

     <server-ip>   IP адрес NFS сервера. Если параметр отсутствует
                   адрес по умолчанию определяется по переменной
                   `ip' (см. ниже). Одно из применений этого параметра -
                   использование разных серверов для
                   RARP и NFS. Обычно можете оставить этот параметр пустым.

     <root-dir>    Путь к директории, которая будет корневой на клиенте. Если тут
                   написано "%s", то оно будет заменено на ASCII представление IP
                   клиента.

     <nfs-options> Стандартные опции NFS. Все опции разделены запятыми.
                   Если опция отсутствует будут использованы следующие значения по умолчанию:
                           port            = как скажет portmap демон на сервере
                           rsize           = 1024
                           wsize           = 1024
                           timeo           = 7
                           retrans         = 3
                           acregmin        = 3
                           acregmax        = 60
                           acdirmin        = 30
                           acdirmax        = 60
                           flags           = hard, nointr, noposix, cto, ac

Полное описание параметров можно почитать в `mkinitcpio -H net` (на английском).

### При использовании LVM

Если ваш корень находится на LVM, смотрите Install Arch Linux on LVM#Adding mkinitcpio hooks.

### При зашифрованном корневом разделе

Если у вас зашифрованный корень, смотрите dm-crypt/System configuration#mkinitcpio для информации о том, какие хуки нужно добавлять.

### /usr на отдельном разделе

Если у вас `/usr` на отдельном разделе, вы должны соблюдать следующие требования:

- Добавьте хук `fsck`, а в файле `/etc/fstab` укажите для `passno` значение `2`, чтобы запускалась проверка этого раздела при загрузке системы. Без этого хука `/usr` проверяться не будет.
- Если не используется хук systemd, добавьте хук `usr`, который будет монтировать раздел `/usr` после монтирования корневой ФС.

## Советы и рекомендации

### Отключение создания fallback-образа initramfs

Создание fallback-образов можно отключить:

- Измените строку `PRESETS=('default' 'fallback')` на `PRESETS=('default')` в соответствующих файлах .preset в каталоге `/etc/mkinitcpio.d/`.
- Удалите fallback-образ initramfs из каталога `/boot/`.
- Обновите настройки вашего загрузчика.

Важно Отключение генерации fallback-образа initramfs лишит вас дополнительного способа загрузить систему в случае проблем со стандартным образом initramfs. Перед отключением убедитесь, что у вас под рукой есть загрузочный установочный носитель, который можно будет использовать для восстановления системы.

## Решение проблем

### Распаковка образа

Если вам интересно посмотреть, что находится внутри образа initramfs, вы можете распаковать его.

Образ initramfs является архивом SVR4 CPIO, созданным с помощью команд `find` и `bsdcpio` и опционально сжатым с форматом сжатия, понятным ядру. Подробнее о сжатии смотрите в разделе #COMPRESSION.

mkinitcpio включает в себя инструмент lsinitcpio(1), позволяющий посмотреть и/или извлечь содержимое образов initramfs.

Просмотр списка файлов в образе:

    # lsinitcpio /boot/initramfs-linux.img

Извлечение всех файлов в текущий каталог:

    # lsinitcpio -x /boot/initramfs-linux.img

Более удобный обзор самых важных частей образа:

    # lsinitcpio -a /boot/initramfs-linux.img

### Изменение и упаковка образа

После распаковки архива описанным выше способом вы можете изменить файлы и упаковать всё обратно. Вызовите функцию `build_image` из скрипта `/usr/bin/mkinitcpio` с параметрами

    build_image выходной-файл сжатие

Это можно сделать путём создания нового скрипта с содержимым функции `build_image` и его вызова с описанными выше параметрами. Он упакует содержимое текущего каталога в `выходной-файл`.

Важно Перед перезаписью файла `/boot/initramfs-linux.img` стоит переименовать старый файл, чтобы была возможность отменить изменения. Будьте готовы к тому, что какая-нибудь ошибка помешает загрузке системы. В таком случае вам понадобится загрузиться с другой системы или Live CD, чтобы восстановить оригинал, запустить mkinitcpio для перезаписи ваших изменений или вручную исправить ошибки.

### «/dev must be mounted», хотя он и так примонтирован

mkinitcpio считает `/dev` примонтированным при наличии `/dev/fd/`. Если всё выглядит хорошо, его можно «создать» вручную:

    # ln -s /proc/self/fd /dev/

(Очевидно, `/proc` тоже должен быть примонтирован. mkinitcpio всё равно это требует и тоже это проверяет.)

### Possibly missing firmware for module XXXX

В процессе сборки initramfs после обновления ядра вы можете заметить предупреждения:

    ==> WARNING: Possibly missing firmware for module: 'название_модуля'

Если эти предупреждения появляются во время генерации default-образа, это может означать, что действительно требуется установка дополнительных файлов прошивок. Для часто встречающихся устройств достаточно установить пакет linux-firmware. Другие пакеты, предоставляющие файлы прошивок, приведены в таблице ниже; также можно попробовать поискать их в официальных репозиториях или в AUR.

Если же предупреждения появляются только во время генерации fallback-образа, есть три варианта:

- Просто проигнорировать предупреждения, если вы уверены, что они не касаются нужного вам оборудования.
- Если вы хотите, чтобы предупреждения исчезли, можно установить недостающие файлы прошивок. Большинство необязательных прошивок предоставляются мета-пакетом mkinitcpio-firmwareAUR. Также можно отдельно установить только нужные пакеты:

  Модуль | Пакет
  --- | ---
  aic94xx | aic94xx-firmwareAUR
  ast | ast-firmwareAUR
  bfa | linux-firmware-qlogic
  bnx2x | linux-firmware-broadcom
  liquidio | linux-firmware-liquidio
  mlxsw_spectrum | linux-firmware-mellanox
  nfp | linux-firmware-nfp
  qat_420xx | linux-firmware-intel
  qed | linux-firmware-qlogic
  qla1280 | linux-firmware-qlogic
  qla2xxx | linux-firmware-qlogic
  wd719x | wd719x-firmwareAUR
  xhci_pci xhci_pci_renesas | upd72020x-fwAUR

- Если вы хотите избавиться от предупреждений, но не хотите захламлять систему неиспользуемыми файлами прошивок, можно отключить создание fallback-образа initramfs.

На месте недоступных файлов прошивок можно создать файлы-пустышки, чтобы подавить предупреждения:

    # echo "Device not available" > /usr/lib/firmware/qat_420xx.bin
    # echo "Device not available" > /usr/lib/firmware/qat_420xx_mmp.bin

### No PS/2 controller found

На некоторых материнских платах (в основном старых, но также и некоторых новых) контроллер i8042 не определяется автоматически. Это бывает редко, но некоторые люди всё же могут оказаться с неработающей клавиатурой. Вы можете заранее обнаружить эту ситуацию. Если у вас есть порт PS/2 и вы получаете сообщение `i8042: PNP: No PS/2 controller found. Probing ports directly`, добавьте `atkbd` в массив `MODULES`.[2]

### Стандартная процедура восстановления

При неправильно сформированном начальном RAM-диске систему скорее всего не получится загрузить. В таком случае выполните описанную ниже процедуру восстановления системы:

#### Загрузка выполняется на одной машине и терпит неудачу на другой

Хук `autodetect` фильтрует ненужные модули ядра в основном образе initramfs путём сканирования `/sys` и модулей, загруженных на момент запуска хука. Если вы переносите каталог `/boot` на другую машину и загрузка терпит неудачу на стадии early userspace, это может происходить из-за того, что новое оборудование не определилось из-за отсутствующих модулей ядра. Обратите внимание, что для USB 2.0 и 3.0 нужны разные модули ядра.

Чтобы исправить это, сначала попробуйте выбрать fallback-образ в вашем загрузчике, поскольку его содержимое не фильтруется хуком `autodetect`. После загрузки выполните mkinitcpio на новой машине, чтобы пересобрать основной образ с корректными модулями. Если fallback-образ не решил проблему, попробуйте загрузиться в Arch Linux live CD/USB, выполнить chroot в установленную систему и выполнить mkinitcpio на новой машине. В крайнем случае, попробуйте вручную добавить модули в initramfs.

### Cannot open access to console, the root account is locked

Хук `systemd` блокирует учётную запись root. Для включения можно установить initcpio-hook-shadowcopyAUR, добавить хук `shadowcopy` после хука `systemd` в файле `/etc/mkinitcpio.conf` и пересобрать образы командой `mkinitcpio -P`. Подробнее в репозитории на GitHub.

## Смотрите также

- Документация ядра Linux: initramfs, "What is rootfs?"
- Документация ядра Linux: initrd
- Статья на Википедии: initrd

Categories:

- Boot process (Русский)
- Kernel (Русский)
- Arch projects (Русский)
- Commands (Русский)

mkinitcpio (Русский)
Add topic