Peu importe ce que vous faites, vous l'avez initramfs
. Il est impossible de s'en passer - c'est le seul système de fichiers qui vous est imposé. De kernel.org :
Qu'est-ce que rootfs?
Rootfs
est un cas particulier de ramfs
(ou tmpfs
, si cela est permis), qui est
toujours présent 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 du 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 à la tmpfs
place 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
archiveintégré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 fait une configuration puis est retourné au noyau, tandis que le programme init de initramfs ne devrait pas retourner au noyau. (Si / init a besoin de 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 de la commutation 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 General Setup dans menuconfig, et vivant dans usr / Kconfig) peut être utilisée pour spécifier une source pour l'archive initramfs, qui sera automatiquement incorporée dans le binaire résultant. Cette option peut pointer vers une archive cpio gzippée existante, 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'accès root n'est pas requis 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 répertoire linux-2.6. *. Voir Documentation / early-userspace / README pour plus de détails.)
Le noyau ne dépend pas des outils cpio 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 appelle scripts / gen_initramfs_list.sh) et procède à l'empaquetage de ce répertoire à l'aide du fichier de configuration (en le nourrissant dans usr / gen_init_cpio, qui est créé à partir de usr / gen_init_cpio.c). Le code de création de cpio au moment de la construction du noyau est entièrement autonome, et l'extracteur au démarrage du noyau est également (évidemment) autonome.