# mkinitcpio (Français)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Related articles

- systemd
- Kernel modules
- mkinitcpio/Minimal initramfs
- Boot debugging
- dracut
- Booster

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
- BINARIES
- FILES
- HOOKS
- COMPRESSION
- COMPRESSION_OPTIONS

### 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 formats de compression, 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

Attention: La compression au format zstd est supportée à partir de Linux v5.9, et est le format par défaut depuis mkinitcpio v30.

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

Attention: 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[broken link: invalid section], 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:

- RARP
- BOOTP
- DHCP

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

Categories:

- Initramfs (Français)
- Kernel (Français)
- Arch projects (Français)
- Commands (Français)

Hidden category:

- Pages with broken section links