Les documents du noyau expliquent comment empaqueter une image dans le noyau lui-même. De kernel.org :
Qu'est-ce que rootfs?
Rootfs
est une instance spéciale de ramfs
(ou tmpfs
, si elle est activée), qui est
toujours présente dans les systèmes 2.6. Vous ne pouvez pas démonterrootfs
pour à peu près la même raison que vous ne pouvez pas tuer le processus d'initialisation; plutôt que d'avoir un code spécial pour rechercher et gérer une liste vide, il est plus petit et plus simple pour le noyau de s'assurer que certaines listes ne peuvent pas devenir vides.
La plupart des systèmes montent simplement un autre système de fichiers rootfs
et l'ignorent. La quantité d'espace qu'une instance vide de ramfs occupe est minuscule.
Si CONFIG_TMPFS est activé, rootfs
utilisera tmpfs
au lieu de ramfs
par défaut. Pour forcer ramfs
, ajoutez "rootfstype=ramfs"
à la ligne de commande du noyau.
Qu'est-ce que initramfs?
Tous les noyaux Linux 2.6 contiennent une archive au"cpio"
formatgzippé, qui est extraite au rootfs
démarrage du noyau. Après extraction, le noyau vérifie pour voir sirootfs
contient un fichier"init"
, et s'il l'exécute comme PID 1. Si trouvé, ceinit
processus est responsable de mettre le système le reste du chemin, y comprislocalisation etmontage du dispositif réel racine ( si seulement). Sirootfs
ne contient pas deinit
programme après que l'cpio
archiveincorporée yest extraite, le noyau passera à l'ancien code pour localiser et monter une partition racine, puis exécutera une variante/sbin/init
de celle-ci.
Tout cela diffère de l'ancien initrd à plusieurs égards:
L'ancien initrd était toujours un fichier séparé, tandis que l'archive initramfs est liée à l'image du noyau linux. (Le répertoire linux - * / usr est consacré à la génération de cette archive lors de la construction.)
L'ancien fichier initrd était une image du système de fichiers gzippé (dans certains formats de fichier, comme ext2, qui nécessitait un pilote intégré au noyau), tandis que la nouvelle archive initramfs est une archive cpio gzippée (comme tar plus simple, voir cpio (1) et Documentation / early-userspace / buffer-format.txt). Le code d'extraction cpio du noyau n'est pas seulement extrêmement petit, c'est aussi du texte et des données __init qui peuvent être supprimés pendant le processus de démarrage.
Le programme exécuté par l'ancien initrd (qui s'appelait / initrd, pas / init) a effectué une configuration puis est retourné au noyau, tandis que le programme init de initramfs ne devrait pas retourner au noyau. (Si / init doit transférer le contrôle, il peut sur-monter / avec un nouveau périphérique racine et exécuter un autre programme init. Voir l'utilitaire switch_root ci-dessous.)
Lors du basculement d'un autre périphérique racine, initrd pivot_root puis démontait le ramdisk. Mais initramfs est rootfs: vous ne pouvez ni pivot_root rootfs, ni le démonter. Au lieu de cela, supprimez tout de rootfs pour libérer de l'espace (find -xdev / -exec rm '{}' ';'), surmontez rootfs avec la nouvelle racine (cd / newmount; mount --move. /; Chroot.), attachez stdin / stdout / stderr au nouveau / dev / console et exécutez le nouveau init.
Comme il s'agit d'un processus remarquablement persévérant (et implique la suppression de commandes avant de pouvoir les exécuter), le package klibc a introduit un programme d'aide (utils / run_init.c) pour faire tout cela pour vous. La plupart des autres packages (tels que busybox) ont nommé cette commande "switch_root".
Remplissage des initramfs:
Le processus de construction du noyau 2.6 crée toujours une archive initramfs au format cpio compressé et la relie au binaire du noyau résultant. Par défaut, cette archive est vide (consommant 134 octets sur x86).
L'option de configuration CONFIG_INITRAMFS_SOURCE (dans la configuration générale dans menuconfig,
et vivant dans usr/Kconfig
) peut être utilisée pour spécifier une source pour l'
initramfs
archive, qui sera automatiquement incorporée dans le binaire résultant. Cette option peut pointer vers une archive * gzippée * existantecpio
, un répertoire contenant des fichiers à archiver ou une spécification de fichier texte telle que l'exemple suivant:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Exécutez " usr/gen_init_cpio
" (après la construction du noyau) pour obtenir un message d'utilisation documentant le format de fichier ci-dessus.
Un avantage du fichier de configuration est que l' root
accès n'est pas nécessaire pour définir les autorisations ou créer des nœuds de périphérique dans la nouvelle archive.
(Notez que ces deux exemples d'entrées de "fichier" s'attendent à trouver des fichiers nommés " init.sh
" et " busybox
" dans un répertoire appelé " initramfs
", sous le linux
répertoire -2.6. *. Voir Documentation / early-userspace / README pour plus de détails.)
Le noyau ne dépend pas d' cpio
outils externes . Si vous spécifiez un répertoire au lieu d'un fichier de configuration, l'infrastructure de construction du noyau crée un fichier de configuration à partir de ce répertoire ( usr/Makefile
appels scripts/gen_initramfs_list.sh
) et procède à l'empaquetage de ce répertoire à l'aide du fichier de configuration (en l'alimentant vers usr/gen_init_cpio
, qui est créé à partir de usr/gen_init_cpio.c
). Le cpio
code de création au moment de la construction du noyau est entièrement autonome, et l'extracteur au démarrage du noyau est également (évidemment) autonome.