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' rdevutilitaire 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 /devrépertoire, il n'y a évidemment pas de /devré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-rootou un UUID de volume.
Plus tard, le initrdest entré en scène. Avec le noyau, le chargeur de démarrage chargerait l' initrdimage, 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_rootappel système pour que le noyau permute /et/initrd, puis exécutez /sbin/initsur la vraie racine, qui démonterait /initrdet 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 initramfsscripts de démarrage montent la vraie racine dans /root, suppriment tous les fichiers dans la racine tmpfs, puis chrootdans /rootet exécutent /sbin/init.