# Mkinitcpio (Русский)

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

- systemd (Русский)
- Kernel modules

## Введение

mkinitcpio - следующее поколение программ для создания initramfs. У нее есть много преимуществ перед mkinitrd и mkinitramfs.

- Использует klibc и kinit, разработанные авторами ядра Linux для уменьшения накладных расходов на ранней стадии загрузки.
- Может использовать udev для определения апаратных средств, что предотвращает загрузки большого количества лишних модулей.
- Возможность расширять функциональность при помощи специальных обработчиков, которые могут быть включены в другие пакеты.
- Поддерживает lvm2, dm-crypt, raid, swsusp и suspend2 и загрузку с устройств usb mass storage.
- Много опций передается прямо из строки аргументов ядра.
- mkinitcpio позволяет включать образ ram-диска в образ ядра.

mkinitcpio разработан phrakture и tpowa с помощью community.

## Установка mkinitcpio

### Из текущего репозитория

mkinitcpio находится в репозитории current. Вы можете установить его командой

    # pacman -S mkinitcpio

### Из git

Последнюю development версию mkinitcpio, можно получить из git командой

    # git clone git://projects.archlinux.org/mkinitcpio.git

## Для ядер >=2.6.17

Будет создано 2 образа во время установки/обновления:

Если вы используете kernel26

    /boot/kernel26.img --> образ с необходимыми драйверами для загрузки на этом компьютере
    /boot/kernel26-fallback.img --> образ со всем драйверами

Если вы используете kernel26beyond

    /boot/kernel26beyond.img --> образ с необходимыми драйверами для загрузки на этом компьютере
    /boot/kernel26beyond-fallback.img --> образ со всем драйверами

Настройте свой загрузчик на использование нужного образа.

### Предупреждения

#### Пользователям lvm2, raid и encrypt

Важно: lvm2, raid и encrypt НЕ ВКЛЮЧЕНЫ по умолчанию. Прочитайте эту страницу чтобы узнать как их включить и настроить.

#### Пользователям более одного контроллера дисков

Важно: Если у вас более одного контроллера дисков использующих одно пространство имен устройств (например 2 SCSI/SATA или IDE контроллера) и они требуют разных модулей, укажите правильный порядок в MODULES="" в файле /etc/mkinitcpio.conf и в вашем файле конфигурации fallback, иначе устройства могут поменяться местами и вы получите kernel panic при загрузке. Более правильный путь - использовать Persistent block device naming, чтобы быть уверенным, что вы смонтировали действительно то, что хотели.

#### Незагружаемые модули

Важно: Если вам нужно загрузить один из следующих модулей для нормального монтирования корневого раздела, поместите его в MODULES="" в /etc/mkinitcpio.conf и в файл конфигурации fallback.

- SCSI КОНТРОЛЛЕРЫ (status stock kernel 2.6.18)

      scsi_transport_sas ultrastor qlogicfas eata BusLogic pas16 wd7000 sym53c416
      g_NCR5380_mmio fdomain u14-34f dtc initio in2000 imm t128 aha1542 aha152x
      atp870u g_NCR5380 NCR53c406a qlogicfas408 megaraid_mm advansys

### Редактирование файлов конфигурации

### Модификация основного образа

Чтобы изменить начальные значения главного образа отредактируйте следующий файл:

    /etc/mkinitcpio.conf

mkinitcpio использует этот файл по умолчанию.

### Редактирование fallback образа

Чтобы изменить начальные значения fallback образа, отредактируйте /boot/mkinitcpio.d/kernel26-fallback.conf и выставьте файл который вы отредактировали в NoUpgrade = в '/etc/pacman.conf'. Это должно быть нормально, если вы не используете специальные настройки вида lvm или raid.

### Настройка обработчиков (HOOKS)

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

    HOOKS="foo1 foo2 foo3 bar1 bar2"

#### Доступные обработчики

Hook | При установке | Во время выполнения
--- | --- | ---
base | Устанавливает базовые каталоги, klibc и основные библиотеки. Всегда используйте его, за исключением случаев, когда вы действительно знаете, что делаете. |
udev | Добавляет udev в образ ram-диска | Udev автоматически создает файл устройства для корня и загружает необходимые модули для его работы. Рекомендуется использовать.
modload |  | Альтернативный механизм автоопределения, но работает медленнее чем udev. Оставлен для совместимости, используйте udev вместо него.
autodetect | Уменьшает размер initramfs пытаясь определить какие модули вам нужны. Проверьте список модулей которые он добавил. Он должен запускаться раньше других подсистем. Все обработчики выполняемые до него будут включать все модули. |
ide | Добавляет модули IDE. Используйте если ваш корневой раздел на IDE диске. Поставьте autodetect до него, для уменьшения количества модулей | Загружает модули IDE. Вам потребуется udev или modload обработчики если вы не указали список модулей явно (см. секцию MODULES ниже).
pata | Добавляет IDE модули. Используйте если корневой раздел - IDE диск и вы хотите использовать PATA вместо IDE. Также рекомендуется autodetect | Загружает модули. Вам потребуется udev или modload если только вы не указали все в секции MODULES. PATA - новый набор IDE драйверов. При его использовании /dev/hd? меняются на /dev/sd?. См.: https://archlinux.org/news/272/
sata | Добавляет SATA модули. | Загружает SATA модули.
scsi | Добавляет SCSI модули. | Загружает SCSI модули.
usb | Добавляет USB модули для usb-storage. | Загружает USB модули.
usbinput | Добавляет USB HID модули. Используйте если нужна USB клавиатура на ранней стадии загрузки (например для ввода пароля в режиме failsafe | Загружает модули.
fw | Добавляет поддержку Firewire в образ. Нужно для FW mass storage устройств. | Загружает FW модули.
net | Добавляет модули сетевых устройств. Для pcmcia добавьте соответствующий обработчик. | Загружает модули. См. также Изменение строки параметров ядра.
pcmcia | Добавляет pcmcia модули. Требует наличия pcmciautils. | Загружает модули pcmcia.
dsdt | Добавляет пользовательский acpi dsdt файл. Запишите свой файл в `/lib/initcpio/custom.dsdt` | Ваш dsdt файл будет автоматически использован если он присутствует в initramfs.
filesystems | Добавляет драйвера файловых систем | Определяет файловые системы и загружает модули. ВНИМАНИЕ: это не работает с reiser4, вам придется добавлять драйвер этой ФС вручную.
lvm2 | Добавляет поддержку lvm. Требует установленного пакета lvm2 | Включает поддержку lvm
raid | Добавляет модули для software raid. Требует пакет mdadm. | Загружает модули и собирает raid устройства. См. секцию Изменение строки параметров ядра.
encrypt | Добавляет dm-crypt модуль и программу cryptsetup. Требует установленный пакет cryptsetup. | Определяет и разблокирует зашифрованый корневой раздел. См. секцию Изменение строки параметров ядра.
resume |  | Пытается выполнить пробуждение после "suspend to disk". Работает с swsusp и suspend2. См. также Изменение строки параметров ядра.
firmware | Добавляет файлы в `/lib/firmware`. | Загружает firmware.
keymap | Добавляет keymap и consolefonts из rc.conf. | Загружает указанную раскладку и шрифты.

#### Примеры

Эта конфигурация будет работать для большинства пользователей:

    HOOKS="base udev autodetect ide scsi sata filesystems"

Если вы хотите загружать систему на разных машинах используйте:

    HOOKS="base udev ide scsi sata filesystems"

Вы можете использовать зашифрованные тома на lvm2:

    HOOKS="base udev autodetect ide scsi sata lvm2 encrypt filesystems"

### Изменение переменной MODULES

MODULES содержит список модулей для включения в образ и загрузки. Например это нужно если вы не хотите использовать udev или modload. Тогда можно добавить все нужные модули вручную:

    MODULES="piix ide_disk reiserfs"
    HOOKS="base autodetect ide filesystems"

NOTE: Если вам нужен reiser4, вы ДОЛЖНЫ добавить его в список модулей.

### Настройка BINARIES и FILES

Эти опции добавляют в образ указанные файлы. Разница только в том, что BINARIES проверяет зависимости от библиотек, в то время как FILES просто копирует файлы.

Пример:

    FILES="/etc/modprobe.d/modprobe.conf"

    BINARIES="/usr/bin/somefile"

## Создание образа

### Пересоздание предопределенного образа / использование предустановок

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

    # mkinitcpio -p linux

Это пример для пакета linux, но вы можете выполнить аналогичную команду и для других ядер.

Если вы хотите изменить настройки образов, отредактируйте `/etc/mkinitcpio.d/linux.preset` (для пакета linux). Эти .preset файлы также будут использованы при обновлении ядра, не испортите их!

### Вручную

Создайте образ командой:

    mkinitcpio -g /boot/kernel26.img

Она создаст образ для текущего ядра в файле /boot/kernel26.img, который является образом для ядра из пакета kernel26. Пользователи kernel26beyond должны написать:

    mkinitcpio -g /boot/kernel26beyond.img

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

    mkinitcpio -g /boot/kernel26.img -k 2.6.16-ARCH

#### Перегенерация fallback-образа

Замечание: Нижеследующий текст предназначен для создания образа для текущего ядра. Для других ядер используйте ключ -k.

Fallback образ должен быть уже создан если вы установили kernel26 или kernel26beyond, но в случае если вы хотите его пересоздать используйте:

    mkinitcpio -c /boot/mkinitcpio.d/kernel26-fallback.conf -g /boot/kernel26.img

для beyond ядер

    mkinitcpio -c /boot/mkinitcpio.d/kernel26beyond-fallback.conf -g /boot/kernel26beyond.img

См. mkinitcpio -h чтобы увидеть другие опции.

Не забудьте добавить запись в загрузчик. Просто скопируйте старую запись и измените путь к initrd. Будьте аккуратны, всегда имейте провереный вариант загрузки в списке загрузчика. Вы можете использовать mkinitcpio с любыми вариантами ядер (kernel26, kernel26-beyond...).

## Изменения строки параметров ядра

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

Если вы не знаете, что такое строка параметров ядра, читайте документацию по GRUB или Lilo.

### Вход в безотказный режим

Если Вы добавите опцию

    break=y

в строку параметров ядра, то init остановится после инициализации и вы получите dash шелл. Это может быть использовано, чтобы проверить, что все хорошо. После выхода загрузка продолжится в обычном режиме.

### Запрет обработчиков

Вы можете запретить обработчики при помощи параметра disablehooks в строке параметров ядра:

    disablehooks=hook1,hook2,hook2

например,

    disablehooks=resume

### Запрет загрузки модулей

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

    disablemodules=mod1,mod2,mod3

например,

    disablemodules=ata_piix

### Использование raid

Добавьте обработчик raid в список HOOKS в /etc/mkinitcpio.conf

Параметры ядра: Укажите md массивы с помощью: md= parameter: (см. ниже). Простого добавления вашего raid массива достаточно.

     Пример: md=0,/dev/sda3,/dev/sda4 md=1,/dev/hda1,/dev/hdb1

Затем добавьте следующее в строку kernel в grub/menu.lst:

     Пример: md=0,/dev/sda3,/dev/sda4 md=1,/dev/hda1,/dev/hdb1

Т.е. это будет выглядеть так:

     kernel /vmlinuz26beyond root=/dev/md0 ro md=0,/dev/sda1,/dev/sdb1

Эта строка создает два md массива с постоянными суперблоками

Настройка:

     - для старых raid массивов без постоянных суперблоков:
        md=<номер устройства md>,<уровень raid>,<chunk size factor>,<fault level>,dev0,dev1
     - для raid массивом с постоянными суперблоками:
        md=<номер устройства md>,dev0,dev1,...,devn
     - для сборки partitionable массивов:
        md=d<md device no.>,dev0,dev1,...,devn

Параметры:

     - <номер устройства md> = номер устройства:
        0 значит md0, 1 значит md1, ...
     - <уровень raid> = -1 линейный режим, 0 striped режим
        другие режимы поддерживаются только с постоянным суперблоком
     - <chunk size factor> = (только для raid-0 и raid-1):
        Установить chunk size as 4k << n.
     - <fault level> = игнорируется
     - <dev0-devn>: т.е. /dev/hda1,/dev/hdc1,/dev/sda1,/dev/sdb1

### Использование net

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

ip=

Описание интерфейса может быть в короткой форме, которая состоит просто из имени интерфейса (eth0 или какой либо еще), или в длинной форме. Длинная форма содержит семь элементов, разделенных двоеточием:

     ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
     nfsaddrs= это алиас для ip= и может использоваться также.

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

     <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' означают запрет автонастройки.

Примеры:

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

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

root=/dev/nfs

     Если вы не используете параметр nfsroot=, вам нужно установить root=/dev/nfs
     для загрузки с автонастройкой корня в nfs.

### Использование lvm

Если ваш корень находится на lvm, вы должны добавить обработчик lvm2. Также, вы должны передать имя корневого устройства ядру в формате

    root=/dev/mapper/<имя-группы-томов>-<логическое-имя-тома>

например

    root=/dev/mapper/myvg-root

### Использование шифрования на корневом разделе

Если ваш корневой раздел зашифрован, вы должны добавить обработчик encrypt. Затем укажите ядру корневой раздел также, как если бы он не был зашифрован.

Например для sata/scsi:

    root=/dev/sda5

или для зашифрованного lvm:

    root=/dev/mapper/myvg-root

Корневое устройство автоматически поменяется на /dev/mapper/root.

#### Использование LUKS томов

Если вы используете LUKS для шифровани дисков, скрипт инициализации поймет это автоматически, если вы указали обработчик encrypt. Он спросит пароль для разблокирования тома.

Если этого не происходит, попробуйте добавить filesystem-module в список модулей в фале /etc/mkinitcpio.conf если он не вкомпилирован в ядро.

#### Использование legacy cryptsetup томов

Если вы используете legacy cryptsetup том, вы должны указать все опции, необходимые для его разблокировки в строке параметров ядра. Опции формата

    crypto=hash:cipher:keysize:offset:skip

представляют опции cryptsetup: --hash, --cipher, --keysize, --offset и --skip. Если вы пропустите опцию, будет использовано значение по умолчанию, т.е. вы можете написать просто

    crypto=::::

если вы создали том с настройками по умолчанию.

ЗАМЕЧАНИЕ: По техническим причинам невозможно проверить корректность пароля для legacy cryptsetup тома. Если вы ошибетесь, у вас просто не получится его смонтировать. Рекомендуется использовать LUKS вместо legacy cryptsetup.

#### Использование loop-aes томов

mkinitcpio пока не поддерживает loop-aes.

## Использование спящего режима (на диск)

Если вы хотите, чтобы ваш компьютер засыпал на диск, вы должны добавить обработчик resume.

#### swsusp

TODO

#### µswsusp

µswsusp пока не поддерживается.

#### suspend2

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

    resume2=swap:/dev/hda3

где /dev/hda3 ваш своп раздел. Если вы пишите память в файл, используйте

    resume2=file:/dev/hda2:0x123456

где /dev/hda2 раздел с файлом (обычно корневой раздел) и 0x123456 - смещение до файла. Вы можете получить его с помощью команд:

    echo "/suspend2_file" > /proc/suspend2/filewriter_target
    cat /proc/suspend2/resume2

где /suspend2_file - путь к файлу, куда записывается образ памяти. Это (естественно) работает и для томов lvm. Также можно использовать и зашифрованные разделы

    resume2=file:/dev/mapper/root:0x123456

где 0x123456 снова смещение. Восстановление с зашифрованного своп раздела не поддерживается.

### Примеры конфигурационных файлов загрузчиков

Если Вы используете beyond kernel, замените имена фалов kernel26.img и kernel26-fallback.img на kernel26beyond.img и kernel26beyond-fallback.img соответственно. Так же замените "vmlinuz26" на "vmlinuz26beyond".

#### GRUB

Для тех у кого /boot на отдельном разделе диска:

    # (0) Arch Linux
    title Arch Linux
    root   (hd0,3)
    kernel /vmlinuz26 root=/dev/hda4 vga=791 ro
    initrd /kernel26.img

    title Arch Linux Fallback
    root   (hd0,3)
    kernel /vmlinuz26 root=/dev/hda4 vga=791 ro
    initrd /kernel26-fallback.img

Для тех у кого /boot не на отдельном разделе диска:

    # (0) Arch Linux
    title Arch Linux
    root   (hd0,3)
    kernel /boot/vmlinuz26 root=/dev/hda4 vga=791 ro
    initrd /boot/kernel26.img

    title Arch Linux Fallback
    root   (hd0,3)
    kernel /boot/vmlinuz26 root=/dev/hda4 vga=791 ro
    initrd /boot/kernel26-fallback.img

#### LILO

Если Вы используете загрузчик LILO, то рекомендуется использовать append="root=/dev/XYZ" вместо root=/dev/XYZ. Если у Вас уже есть глобальная опция append, тогда используйте addappend.

    boot=/dev/hdX
    default = ArchLinux
    timeout=50
    vga=791
    lba32
    prompt

    # для образа автоопределения железа
    image=/boot/vmlinuz26
    label=ArchLinux
    append="root=/dev/hdXY"
    initrd=/boot/kernel26.img
    read-only

    # fallback image если другие образы не работают (Will most prob. never be used)
    image=/boot/vmlinuz26
    label=ArchLinuxFallBack
    append="root=/dev/hdXY"
    initrd=/boot/kernel26-fallback.img
    read-only

## Возможные проблемы

### piix ide контролер и ядро beyond

#### Проблема

Если mkinitcpio не хочет определять ваш жесткий диск выдавая ошибки вида "Can't find device dev(0,0)" при переключении kinit, то это скорее всего из-за конфликта между драйвером ata_piix и piix. Ядро beyond содержит несколько патчей libata которые вызывают *конфликт* ata_piix с piix.

#### Решение

Измените /etc/mkinitcpio.conf так, чтобы он содержал только одну запись: или ide, или sata, или scsi, в зависимости от того откуда вы хотите загружать систему.

## Я параноик!

Если вам действительно нужно знать, что включено в initrd, вы можете вытаскивать и класть внутрь образа файлы. Это просто cpio архив, но...

### Предупреждение о cpio

Использование cpio для извлечения опасно (от root'а), так как оно пытается извлечь файлы в /, ломая существующую систему загрузки. Для исправления, вам придется переставить все пакеты, файлы которых были перезаписаны с помощью pacman.static. Список файлов выдаст команда bsdtar -t -f kernel26.img

### Использование bsdtar для извлечения

bsdtar извлекает файлы в текущий каталог.

Используйте команду:

     bsdtar -x -f /boot/kernel26.img

Categories:

- Русский
- Boot process (Русский)