mkinitcpio (Русский) - ArchWiki

Jump to content

# mkinitcpio (Русский)

6 languages

- Deutsch
- English
- Français
- 日本語
- Português
- 中文（简体）

From ArchWiki

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

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

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

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

  The initial ramdisk is in essence a very small environment (early userspace) which loads various kernel modules and sets up necessary things before handing over control to init. This makes it possible to have, for example, encrypted root file systems and root file systems on a software RAID array. mkinitcpio allows for easy extension with custom hooks, has autodetection at runtime, and many other features.

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

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

mkinitcpio создан разработчиками Arch Linux и вкладами сообщества. Смотрите public Git repository.

## Установка

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

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

Примечание: Настоятельно рекомендуется читать arch-projects mailing list при использовании mkinitcpio из Git!

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

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

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

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

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

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

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

    # mkinitcpio -p linux

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

    # mkinitcpio -P

Параметр `-p` (сокращение от preset) указывает на использование preset файла из `/etc/mkinitcpio.d` (т.е. `/etc/mkinitcpio.d/linux.preset` для `linux`). preset файл определяет параметры сборки initramfs образа вместо указания файла конфигурации и выходной файл каждый раз.

Можно создать любое количество initramfs с различными конфигурациями. Необходимый 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

С версии 31 mkinitcpio также может генерировать unified kernel image.

## Настройка

`/etc/mkinitcpio.conf` - основной конфигурационный файл mkinitcpio. Кроме того, в каталоге `/etc/mkinitcpio.d` располагаются preset файлы (e.g. `/etc/mkinitcpio.d/linux.preset`).

Можно изменять шесть переменных в конфигурационном файле:

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

Примечание:

- Некоторые хуки, которые могут быть нужны для вашей системы, вроде lvm2, mdadm, и encrypt, НЕ включены по умолчанию. Смотрите раздел #HOOKS, чтобы узнать, как их включить и настроить.
- Если у вас более одного контроллера дисков, использующих одно пространство имён устройств (например, 2 SCSI/SATA или IDE контроллера), и они требуют разных модулей, используйте постоянные имена для блочных устройств, чтобы быть уверенным, что вы смонтировали действительно то, что хотели. Без этого устройства могут поменяться местами и вы получите kernel panic при загрузке.

### MODULES

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

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

Примечание:

- При использовании 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` должно быть достаточным для большинства простых установок с одним диском. Для корневых устройств, которые являются многоуровневыми или многоблочными устройствами, такими как LVM, mdadm или dm-crypt, см. cоответствующие страницы вики для дальнейшей необходимой конфигурации.

#### Build hooks

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

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

    $ mkinitcpio -L

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

    $ mkinitcpio -H udev

#### Runtime hooks

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

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

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

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

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

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

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

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

busybox init | systemd init | Build hook | Runtime hook
--- | --- | --- | ---
base | Устанавливает все начальные каталоги, базовые утилиты и библиотеки. Всегда ставьте этот хук первым, за исключением случаев, когда вы действительно знаете, что делаете, если не используется хук systemd. Предоставляет busybox recovery shell при использовании совместно с хуком systemd. Примечание: Командная оболочка восстановления недоступна, так как аккаунт root в initramfs заблокирован. Смотрите FS#70408. | –
udev | systemd | Добавляет udev, udevadm и небольшое подмножество правил udev в образ. | Udev автоматически создает файл устройства для корня и загружает необходимые модули для его работы. Рекомендуется использовать.
usr | Добавляет поддержку отделного `/usr` раздела. Подробнее: #/usr на отдельном разделе | Монтирует раздел `/usr` после монтирования корневой файловой системы.
resume | – | Необходим для работы спящего режима (suspend to disk). Смотрите Ждущий и спящий режимы.
btrfs | -- | Sets the required modules to enable Btrfs for using multiple devices with Btrfs. This hook is not required for using Btrfs on a single device. | Runs `btrfs device scan` to assemble a multi-device Btrfs root file system when udev hook or systemd hook is not present. The btrfs-progs package is required for this hook.
autodetect | Уменьшает размер initramfs, пытаясь определить, какие модули вам нужны, сканируя sysfs. Проверьте список модулей, которые он добавил. Он должен запускаться раньше других подсистем. Все обработчики, выполняемые до него, будут включать все модули. | –
modconf | Добавляет конфигурационные файлы modprobe из `/etc/modprobe.d/` и `/usr/lib/modprobe.d/` | –
block | Добавляет все модули блочных устройств, ранее предоставляемые другими хуками (fw, mmc, pata, sata, scsi, usb, virtio). | –
net | не реализован | Добавляет поддержку сети. Установите mkinitcpio-nfs-utils для использования этого хука. Подробнее: #При использовании net | Требуется для корневой файловой системы через NFS.
dmraid | ? | Поддержка корневой файловой системы на fakeRAID массивах. Необходимо установить пакет dmraid. Обратите внимание, что необходимо использовать `mdadm` с хуком mdadm_udev с fakeRAID если ваш контроллер поддерживает это. Подробнее: #При использовании RAID | Находит и монтирует fakeRAID блочные устройства, используя `dmraid`.
mdadm_udev | Обеспечивает поддержку для сборки RAID массивов с помощью udev. Необходимо установить пакет mdadm. Если вы используете этот хук с массивом FakeRAID, рекомендуется включить `mdmon` в секции `BINARIES`. Подробнее: #При использовании RAID | –
keyboard | Добавляет модули, необходимые для работы клавиатур. Используйте этот хук, если необходимо использовать USB-клавиатуру на ранней стадии загрузки (для ввода пароля от заширфованных данных или для работы в командной оболочке). В качестве побочного эффекта также могут быть добавлены модули для некоторых устройств ввода без клавиатуры, но на это не следует полагаться. Заменяет старый хук usbinput. Примечание: Для систем, которые загружаются с различными конфигурациями оборудования (например, ноутбуки с внешней клавиатурой или внутренней клавиатурой или headless-системы), этот хук необходимо поместить перед autodetect, чтобы иметь возможность использовать клавиатуру во время загрузки, например, чтобы разблокировать зашифрованное устройство при использовании хука `encrypt`. | –
keymap | sd-vconsole | Добавляет в initramfs раскладки, указанные в `/etc/vconsole.conf`. При использовании шифрования системы добавляйте его перед хуком `encrypt`. | Загружает раскладки, указанные в `/etc/vconsole.conf`.
consolefont | Добавляет в initramfs консольный шрифт, указанный в `/etc/vconsole.conf`. | Загружает шрифт, указанный в `/etc/vconsole.conf`.
encrypt | sd-encrypt | Добавлет модуль ядра `dm_crypt` и `cryptsetup`. Требуется пакет cryptsetup. Примечание: Обратите внимание на замечания для хука keyboard выше для разблокировки зашифрованного устройства во время загрузки, а также примечания о файловых системах в #MODULES, если вы используете файл для разблокировки. | Определяет и подключает зашифрованый корневой раздел. Смотрите #Настройка во время выполнения для дальнейшей настройки. Для sd-encrypt смотрите dm-crypt/System configuration#Using systemd-cryptsetup-generator.
lvm2 | Добавляет поддержку `lvm`. Требует установленного пакета lvm2. Необходим, если корневая файловая система на LVM. | –
fsck | Добавляет исполняемый файл fsck и необходимые обработчики файловых систем для проверки корневой файловой системы (и `/usr`, если он на отдельном разделе) перед монтированием. Если стоит после хука autodetect, то будут добавлены только обработчики для вашей корневой файловой системы. Использование этого хука настоятельно рекомендуется и обязательно с отдельным `/usr` разделом. При включении этого хука крайне рекомендуется также включить все необходимые модули для обеспечения работы вашей клавиатуры в early userspace. Использование этого хука требует, чтобы rw передавался в командной строке ядра (обсуждение). Смотрите fsck (Русский)#Проверка при загрузке для подробностей. | –
filesystems | Включает в образ модули необходимых файловых систем. Этот хук обязателен, если Вы не указываете модули файловых систем в MODULES. | –

### COMPRESSION

Ядро поддерживает несколько форматов для сжатия initramfs - gzip, bzip2, lzma, xz, lzo, lz4 и zstd. По умолчанию mkinitcpio использует zstd; имейте в виду, что сжатие zstd работает в многопоточном режиме (с опцией `-T0`, которая запускает столько же потоков, сколько ядер в процессоре).

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

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

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

### COMPRESSION_OPTIONS

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

    COMPRESSION_OPTIONS=(-9)

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

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

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

### init from base hook

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

      root=/dev/sda1                                                # /dev node
      root=LABEL=CorsairF80                                         # метка
      root=UUID=ea1c4959-406c-45d0-a144-912f4e86b207                # UUID
      root=PARTUUID=14420948-2cea-4de7-b042-40f67c618660            # GPT UUID раздела

  Примечание: Следующие параметры загрузки изменяют поведение `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` после монтирования корневой ФС.

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

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

Если вам интересно посмотреть, что находится внутри образа 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: wd719x
    ==> WARNING: Possibly missing firmware for module: aic94xx
    ==> WARNING: Possibly missing firmware for module: xhci_pci

Они появляются у большинства пользователей Arch Linux, так как соответствующие прошивки не поставляются пакетом linux-firmware. Если вы не используете устройства, которым нужны эти прошивки, вы можете игнорировать эти сообщения. На данный момент единственным решением для скрытия предупреждений модулей wd719x и aic94xx является установка пакетов с этими самыми прошивками. Для aic94xx установите aic94xx-firmwareAUR. Для wd719x установите wd719x-firmwareAUR. Для xhci_pci установите upd72020x-fwAUR. Смотрите связанное обсуждение здесь.

Самые распространённые файлы прошивок поставляются пакетом linux-firmware. Другие файлы прошивок можно поискать в официальных репозиториях или AUR.

### No PS/2 controller found

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

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

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

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

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

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

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

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

Categories:

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