Dans les temps anciens, le noyau était codé en dur pour connaître le nombre majeur / mineur de périphérique de la racine fs et monté ce périphérique après avoir initialisé tous les pilotes de périphériques, qui ont été intégrés au noyau. L' rdev
utilitaire peut être utilisé pour modifier le numéro de périphérique racine dans l'image du noyau sans avoir à le recompiler.
Finalement, les chargeurs de démarrage sont arrivés et pouvaient passer une ligne de commande au noyau. Si l' root=
argument était passé, cela indiquait au noyau où se trouvait la racine fs au lieu de la valeur intégrée. Les pilotes devaient accéder à ce qui devait encore être intégré dans le noyau. Bien que l'argument ressemble à un nœud de périphérique normal dans le /dev
répertoire, il n'y a évidemment pas de /dev
répertoire avant que le fs racine ne soit monté, donc le noyau ne peut pas rechercher un nœud de développement là-bas. Au lieu de cela, certains noms de périphériques bien connus sont codés en dur dans le noyau afin que la chaîne puisse être traduite en numéro de périphérique. Pour cette raison, le noyau peut reconnaître des choses comme /dev/sda1
, mais pas des choses plus exotiques comme /dev/mapper/vg0-root
ou un UUID de volume.
Plus tard, le initrd
est entré en scène. Avec le noyau, le chargeur de démarrage chargerait l' initrd
image, qui était une sorte d'image de système de fichiers compressée (image extz gzippée, image romfs gzippée, squashfs est finalement devenue dominante). Le noyau décompresserait cette image dans un disque virtuel et monterait le disque virtuel en tant que racine fs. Cette image contient des pilotes et des scripts de démarrage supplémentaires au lieu d'un vrai init
. Ces scripts de démarrage ont effectué diverses tâches pour reconnaître le matériel, activer des éléments tels que les tableaux RAID et LVM, détecter les UUID et analyser la ligne de commande du noyau pour trouver la vraie racine, qui pourrait maintenant être spécifiée par l'UUID, l'étiquette de volume et d'autres choses avancées. Il a ensuite monté le vrai root fs dans /initrd
, puis exécuté l' pivot_root
appel système pour que le noyau permute /
et/initrd
, puis exécutez /sbin/init
sur la vraie racine, qui démonterait /initrd
et libérerait alors le ramdisk.
Enfin, nous avons aujourd'hui le initramfs
. Ceci est similaire à initrd
, mais au lieu d'être une image de système de fichiers compressée qui est chargée dans un disque virtuel, il s'agit d'une archive cpio compressée. Un tmpfs est monté en tant que racine et l'archive y est extraite. Au lieu d'utiliser pivot_root
, qui était considéré comme un hack sale, les initramfs
scripts de démarrage montent la vraie racine dans /root
, suppriment tous les fichiers dans la racine tmpfs, puis chroot
dans /root
et exécutent /sbin/init
.