mkinitcpio (Français)
mkinitcpio est un script Bash utilisé pour créer un environnement initial ramdisk. Extrait de la page de manuel mkinitcpio(8) :
- Le ramdisk initial est par essence un très petit environnement (early userspace) qui charge divers modules du noyau et configure les choses nécessaires avant de céder le contrôle à
init
. Cela permet d'avoir, par exemple, des systèmes de fichiers racine chiffrés et des systèmes de fichiers racine sur une matrice RAID logicielle. mkinitcpio permet une extension facile avec des «hooks» personnalisés, a une autodétection à l'exécution, et beaucoup d'autres fonctionnalités.
Traditionnellement, le noyau était responsable de toutes les tâches de détection et d'initialisation du matériel au début du processus de démarrage avant de monter le système de fichiers racine et de passer le contrôle à init
. Cependant, au fur et à mesure des progrès technologiques, ces tâches sont devenues de plus en plus complexes.
De nos jours, le système de fichiers racine peut se trouver sur un large éventail de matériel, des disques SCSI aux disques SATA en passant par les disques USB, contrôlés par une variété de contrôleurs de disques de différents fabricants. En outre, le système de fichiers racine peut être chiffré ou compressé, dans une matrice RAID logicielle ou un groupe de volumes logiques. La façon la plus simple de gérer cette complexité est de passer la gestion dans l'espace utilisateur : un ramdisk initial. Consultez également : /dev/brain0 » Blog Archive » L'espace utilisateur initial dans Arch Linux.
mkinitcpio a été développé par les développeurs d'Arch Linux et à partir de contributions de la communauté. Consultez le dépôt Git public.
Installation
Installez le paquet mkinitcpio, qui est une dépendance du paquet linux, donc la plupart des utilisateurs l'auront déjà installé.
Les utilisateurs avancés peuvent souhaiter installer la dernière version de développement de mkinitcpio depuis Git avec le paquetage mkinitcpio-gitAUR.
É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"
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 la prise en charge 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 type 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 la prise en charge 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 la prise en charge pour le RAID logiciel | Nécessite le paquet mdadm Le hook mdadm_udev lui est préféré. |
|
mdadm_udev | x | Fournit la prise en charge 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 la prise en charge 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 prends en charge 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
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
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
kernel
ou linux
dans les entrées du menu de votre chargeur d'amorçage, 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>]
- 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