Mkinitcpio

De ArchwikiFR


À propos

mkinitcpio est un script shell utilisé pour créer un environnement qui se chargera en premier en mémoire :

  • Il utilise BusyBox pour fournir un ensemble d'outils de base dans le ramdisk.
  • Il peut utiliser udev pour la détection à chaud du matériel, ça évite ainsi le chargement d'une liste de modules par défaut.
  • Il possède un système d'extensions (hooks) permettant d'effectuer des actions supplémentaires pendant le démarrage du noyau.
  • Il supporte lvm2, dm-crypt pour par exemple, les volumes luks, raid, swsup, TuxOnIce (suspend2), réveil ainsi que le boot depuis des volumes usb.
  • Plusieurs caractéristiques peuvent directement être configurées depuis la ligne du noyau sans avoir à re-générer l'image.
  • mkinitcpio peut inclure l'image dans le noyau afin d'avoir un fichier unique contenant noyau et image.

Installation

Le paquet mkinitcpio est installé par défaut.

État par défaut

Lors de l'installation, mkinicpio a été lancé et a généré 2 fichiers:

  • /boot/initramfs-linux.img -> correspond à ce qui est défini dans le fichier de configuration moins ce qui n'est pas détecté par le hook autodetect.
  • /boot/initramfs-linux-fallback.img -> contient strictement ce qui est définit dans le fichier de configuration.

Configuration

Le fichier de configuration est /etc/mkinitcpio.conf

Le fichier est composé de 6 variables:

Modules

Vous pouvez inclure ici tous les modules nécessaires, ils seront chargés avant toute autre action.
En théorie, le hook udev s'occupe de charger les modules au boot, mais ce dernier peut être enlevé et remplacé par une liste des modules.

MODULES="pata_acpi ata_generic scsi_mod ahci ata_piix"
Note: Un module peut se voir ajouter un ? pour ignorer les erreurs le concernant.

Binaires

Les fichiers inclus dans cette variable seront intégrés dans l'image de même que les bibliothèques dont ils dépendent.

BINARIES="un_binaire_quelconque"

Fichiers

Les fichiers inclus dans cette variable seront tout simplement copiés.

FILES="un_fichier_quelconque"

Hooks

Les hooks correspondent aux scripts d'extension, chacun ayant une action à la création de l'image et/ou une action pendant le démarrage, et pour la plupart ils ajoutent des modules pouvant être chargés par udev si ce dernier détecte le matériel correspondant.

Pour toute information complémentaire (et forcément plus à jour):

mkinitcpio -L # pour avoir la liste
mkinitcpio -H <hook>
Hook Modules ou fichiers ajoutés Installation Démarrage Remarque
base Met en place la structure des répertoires et copie les utilitaires.
systemd Met en place la configuration de base de systemd. Le hook base reste nécessaire avant lui pour assurer un shell de secours. Particulièrement requis si vous utilisez des hooks spécifiques à systemd (tels sd-*). Si vous utilisez lvm2, préférez le hook sd-lvm2. Ce hook remplace base, usr, udev, timestamp et resume.
btrfs x Rajoute les modules nécessaires pour le support du système de fichiers Btrfs. Permet de monter les partitions de type Btrfs au démarrage. Nécessite le paquet btrfs-progs. Si vous n'utilisez pas le hook udev, exécutez btrfs device scan pour assembler un système de fichier racine multi-périphériques.
udev Rajoute udev à l'image. Détecte et charge les modules nécessaires pour entre autre créer et utiliser votre partition racine.
autodetect Permet d'alléger l'image en enlevant les modules dont le matériel n'est pas détecté. Tous hooks placé avant autodetect sera installé en entier.
modconf x Rajoute les dossiers /etc/modprobe.d et /usr/lib/modprobe.d
block x Rajoute les modules nécessaires pour les périphériques de bloc. Ce hook remplace fw, mmc, pata, sata, scsi, usb et virtio.
keyboard x Pour un clavier usb disponible au boot
net x  Ce hook est fourni par mkinitcpio-nfs-utils.
Si le périphérique réseau est une carte pcmcia, il faut inclure le hook correspondant.
pcmcia x
filesystems x Détecte le module correspondant à votre système de fichier et le passe à kinit. reiser4 n'est pas détecté automatiquement, il faut le rajouter manuellement.
lvm2 x Active les volumes lvm2
dmraid Rajoute le support du RAID pseudo-matériel (Fake RAID) pour les périphériques du système de fichiers racine. Nécessite le paquet dmraid. Il peut être préférable d'utiliser mdadm avec le hook mdadm_udev à la place.
mdadm x Fournit le support pour le RAID logiciel Nécessite le paquet mdadm
Le hook mdadm_udev lui est préféré.
mdadm_udev x Fournit le support pour le RAID logiciel et l'assemblage des volumes par le biais d'udev. Nécessite le paquet mdadm
encrypt x Détecte et déverrouille les partitions chiffrées Nécessite le paquet cryptsetup
sd-encrypt x S'utilise quand le hook systemd est utilisé. Voir la page de manuel systemd-cryptsetup-generator(8). Détecte et déverrouille les partitions chiffrées avec le hook systemd.
resume Essaie de relancer après une hibernation, compatible avec tuxonice et swsup.
keymap x Rajoute le fichier de la disposition du clavier définie dans le fichier /etc/vconsole.conf. Charge la disposition du clavier.
consolefont x Rajoute le fichier de la police définie dans le fichier /etc/vconsole.conf. Charge la police.
sd-vconsole x Quand le hook systemd est utilisé, rajoute le fichier de la disposition du clavier ainsi que de la police définie dans le fichier /etc/vconsole.conf. Charge la disposition du clavier ainsi que la police pour le hook systemd. Remplace les hooks keymap et consolefont.
fsck x Rajoute l'utilitaire fsck au ramdisk.
Si ce hook est placé après autodetect, seul le fcsk.* spécifique à votre système de fichier racine sera ajouté.
Lance le fsck sur le / et le /usr si ce dernier est séparé. Fortement recommandé si /usr est à part.
shutdown Démonte les périphériques avant l'extinction. Fortement recommandé si /usr est à part.
usr Ajoute le support d'un /usr séparé Monte le /usr juste après le /

Quelques exemples:

  • Configuration standard:
HOOKS="base udev autodetect modconf block filesystems"
  • Configuration avec lvm:
HOOKS="base udev autodetect modconf block lvm2 encrypt filesystems"

Compression

Le noyau support plusieurs format de compressions, vous pouvez spécifiez celui que vous voulez avec l'une de ces lignes :

COMPRESSION="gzip"
COMPRESSION="bzip2"
COMPRESSION="lzma"
COMPRESSION="xz"
COMPRESSION="lzop"
COMPRESSION="lz4" 
COMPRESSION="cat" # Pas de compression

Vous pouvez éventuellement passer des options au programme de compression. Pour une compression maximum (mais un temps de génération long) :

COMPRESSION_OPTIONS="-9"

Générer l'image

Automatique

Afin de générer les images par défaut, vous pouvez utiliser la présélection linux:

mkinitcpio -p linux
Astuce: Si vous utilisez linux-lts, vous pouvez générer de nouvelles images avec sa propre présélection:
mkinitcpio -p linux-lts

Voir ce paragraphe pour plus d'infos sur le LTS.

Manuellement

Générer une image pour le noyau par défaut:

mkinitcpio -g /boot/initramfs-linux.img

Générer une image pour un noyau que vous aurez compilé, par exemple, 2.6.28-PERSO:

mkinitcpio -g /boot/kernel26.img -k 2.6.28-PERSO

Pour l'image fallback:

mkinitcpio -g /boot/initramfs-linux-fallback.img -S autodetect

Présélection

Les présélections permettent de définir les options pour générer une ou plusieurs images en une fois, un fichier exemple est fourni par le paquet mkinitcpio : /etc/mkinitcpio.d/example.preset

Pour créer une présélection, créez un fichier avec l'extension preset dans /etc/mkinitcpio.d.
Ce fichier doit contenir les variables suivantes (le * correspond au nom que vous allez donner aux images):

  • PRESETS: liste de noms pour les images à générer.
  • *_kver: version du noyau à utiliser.
  • *_config: fichier à utiliser (ex: /etc/mkinitcpio.conf).
  • *_image: nom du fichier à générer.
  • *_options: options à passer à la commande mkinitcpio. Si vous voulez, par exemple, avoir des images (default et fallback) n'intégrant pas certains hooks, vous pouvez avoir comme lignes :
default_options="-S hook1,hook2"
fallback_options="-S autodetect,hook1,hook2"
  • ALL_*: permet de définir une option commune pour toutes les images spécifiées dans PRESETS


Paramètres de la ligne du noyau

Important: Certaines caractéristiques peuvent être paramétrées depuis la ligne de chargement du noyau (identifiée par kernel ou linux dans les entrées du menu de votre chargeur de démarrage, cf. les sections respectives GRUB, Syslinux ou GRUB legacy selon ce que vous utilisez), ces configurations correspondent à des variables.
  • disablehooks: désactive un hook ou plusieurs séparés par des , (virgule) :
    disablehooks=resume
  • earlymodules: définit un ordre de chargement des modules :
    earlymodules=mod1[,mod2[,...]]
  • rootdelay: ajoute un temps d'attente en secondes avant de poursuivre en chargeant la partition racine.
  • break: si cette option est définie à premount, l'image ouvre un shell avant de monter la racine. La définir à postmount ouvre un shell juste après.

Pour les hooks tels que mdadm, lvm etc..., les options sont plus complexes.

RAID

En utilisant le hook mdadm, la configuration est lue depuis /etc/mdadm.conf. mdadm_udev lira aussi le fichier pour les noms.

LVM

Là, pas grand chose à faire, le hook lvm2 s'occupe de détecter les volumes LVM, il suffit donc d'indiquer le volume de la racine, exemple:

root=/dev/mapper/VolGroup00-lvolroot

Partition chiffrée

Si votre racine est chiffrée, après avoir ajouté le hook encrypt, vous devez ajouter par exemple :

root=/dev/mapper/root cryptdevice=/dev/sda1:root

(en supposant que /dev/sda1 est votre partition racine).

Au démarrage, vous aurez une demande de clé secrète pour dévérouiller la partition.

Si la clé est stockée dans un fichier (pensez à rajouter le hook usb si le fichier est dans un périphérique USB):

cryptkey=device:fs-type:path

par exemple:

cryptkey=/dev/sdb1:ext2:/ma_cle

Réveil

Le hook resume permet de gagner x secondes (1 ou 2 ?) dans le sens où si vous le placez après base, le réveil s'enclenchera directement sans passer tous les hooks.

Il faut rajouter la partition contenant les données d'hibernation (typiquement votre partition de swap):

resume=/dev/sda3
# ou pour TuxOnIce
resume=swap:/dev/sda3

Réseau

Le hook net permet de booter avec une partition racine sur le réseau.

Les paramètres du réseau peuvent être définis statiquement ou par l'une des méthodes suivantes:

Pour activer le réseau lors du boot:

ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
  • client-ip: l'adresse ip. Si le paramètre est vide, se rabat sur autoconf.
  • server-ip: l'adresse ip du serveur NFS, si c'est vide, l'adresse ip du serveur ayant répondu à RARP/BOOTP/DHCP sera utilisée. Vous pouvez aussi indiquer ici l'ip du serveur RARP et utiliser le paramètre nfsroot pour y indiquer l'ip du serveur NFS.
  • gw-ip: ip de la passerelle, si vide et pas d'auto configuration, considère que le serveur est sur le réseau local.
  • netmask: masque de sous-réseau.
  • hostname: nom de la machine, sinon, l'adresse ip est utilisée en tant que nom.
  • device: nom de l'interface réseau.
  • autoconf: méthode d'auto configuration:
    • rarp, bootp ou dhcp: pour les méthodes du même nom.
    • both, all, ou vide: toutes les méthodes sont testées.
    • none, static ou off: pas d'auto configuration.
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
Note: Si nfsroot n'est pas fourni, le répertoire par défaut sera /tftpboot/%s, le %s étant l'ip de la machine.
  • server-ip: ip du serveur NFS.
  • root-dir: répertoire à monter en tant que /, un %s peut être utilisé, il sera remplacé par l'ip de la machine.
  • nfs-options: options à passer pour le montage de la partition, pour les options par défaut:
mkinitcpio -H net

Il ne reste plus qu'à dire au noyau quel périphérique prendre:

root=/dev/nfs

/usr sur une partition séparée

Si c'est votre cas, il vous faut :

  • ajouter le hook shutdown pour permettre le démontage sûr de /usr et /, ou bien activer le service mkinitcpio-generate-shutdown-ramfs.service.
  • ajouter le hook fsck et modifier le fichier /etc/fstab de façon à ce que la colonne <pass> de la ligne /usr vaille 0 (sans cela, cette partition ne sera jamais vérifiée par fsck).
  • ajouter le hook usr qui lui s'occupera du montage de cette partition après le montage de la racine.

Avancé

L'image générée n'a rien de sorcier (hormis le fait qu'elle fasse bien les choses :-)), c'est une archive cpio, vous pouvez voir ce qu'il y a dedans:

lsinitcpio /boot/initramfs-linux.img
# ou plus simple à lire
lsinitcpio -a /boot/initramfs-linux.img
# ou carrément la décompresser
lsinitcpio -x /boot/initramfs-linux.img