Je pense que vous avez raison en tout.
La différence est facile à voir si vous suivez les étapes nécessaires lors du démarrage :
initrd
- Un
ramdev
périphérique de bloc est créé. Il s'agit d'un périphérique bloc basé sur RAM, c'est-à-dire un disque dur simulé qui utilise de la mémoire au lieu de disques physiques. - Le
initrd
le fichier est lu et décompressé dans l'appareil, comme si vous faisiezzcat initrd | dd of=/dev/ram0
ou quelque chose de similaire. - Le
initrd
contient une image d'un système de fichiers, vous pouvez donc maintenant monter le système de fichiers comme d'habitude :mount /dev/ram0 /root
. Naturellement, les systèmes de fichiers ont besoin d'un pilote, donc si vous utilisez ext2, le pilote ext2 doit être compilé dans le noyau. - Terminé !
initramfs
- Un
tmpfs
est monté :mount -t tmpfs nodev /root
. Le tmpfs n'a pas besoin de pilote, il est toujours sur le noyau. Aucun périphérique nécessaire, aucun pilote supplémentaire. - Le
initramfs
est décompressé directement dans ce nouveau système de fichiers :zcat initramfs | cpio -i
, ou similaire. - Terminé !
Et oui, il s'appelle toujours initrd
dans de nombreux endroits bien qu'il s'agisse d'un initramfs
, en particulier dans les chargeurs de démarrage, car pour eux, il s'agit simplement d'un BLOB. La différence est faite par le système d'exploitation lorsqu'il démarre.
Cache Dentry (et inodes)
Le sous-système de système de fichiers sous Linux comporte trois couches. Le VFS (système de fichiers virtuel), qui implémente l'interface des appels système et gère les points de montage croisés et les vérifications des autorisations et des limites par défaut. En dessous se trouvent les pilotes des systèmes de fichiers individuels et ceux-ci s'interfacent à leur tour avec les pilotes des périphériques blocs (disques, cartes mémoire, etc. ; les interfaces réseau sont exceptionnelles).
L'interface entre VFS et le système de fichiers comprend plusieurs classes (c'est du C pur, donc des structures contenant des pointeurs vers des fonctions et autres, mais c'est conceptuellement une interface orientée objet). Les trois principales classes sont inode
, qui décrit tout objet (fichier ou répertoire) dans un système de fichiers, dentry
, qui décrit l'entrée dans un répertoire et file
, qui décrit le fichier ouvert par un processus. Une fois monté, le pilote du système de fichiers crée inode
et dentry
car sa racine et les autres sont créées à la demande lorsque le processus veut accéder à un fichier et finit par expirer. C'est un dentry et un cache d'inodes.
Oui, cela signifie que pour chaque fichier ouvert et tout répertoire jusqu'à la racine, il doit y avoir inode
et dentry
structures allouées dans la mémoire du noyau le représentant.
Cache de pages
Sous Linux, chaque page mémoire contenant des données utilisateur est représentée par un page
unifié structure. Cela peut marquer la page comme anonyme (peut être échangée contre un espace d'échange si disponible) ou l'associer à inode
sur certains systèmes de fichiers (peut être réécrit et relu à partir du système de fichiers) et il peut faire partie de n'importe quel nombre de cartes mémoire, c'est-à-dire visible dans l'espace d'adressage d'un processus. La somme de toutes les pages actuellement chargées en mémoire constitue le cache de pages.
Les pages sont utilisées pour implémenter l'interface mmap et bien que les appels système de lecture et d'écriture réguliers puissent être implémentés par le système de fichiers par d'autres moyens, la majorité des interfaces utilise une fonction générique qui utilise également des pages. Il existe des fonctions génériques qui, lorsque la lecture d'un fichier est demandée, allouent des pages et appellent le système de fichiers pour les remplir, une par une. Pour le système de fichiers basé sur un périphérique bloc, il calcule simplement les adresses appropriées et délègue ce remplissage au pilote de périphérique bloc.
ramdev (disque virtuel)
Ramdev est un périphérique de bloc régulier. Cela permet de superposer n'importe quel système de fichiers, mais cela est limité par l'interface de périphérique de bloc. Et cela a juste des méthodes pour remplir une page allouée par l'appelant et l'écrire en retour. C'est exactement ce qui est nécessaire pour les vrais périphériques de bloc comme les disques, les cartes mémoire, le stockage de masse USB et autres, mais pour le disque virtuel, cela signifie que les données existent en mémoire deux fois, une fois dans la mémoire du ramdev et une fois dans la mémoire allouée par le appelant.
C'est l'ancienne façon d'implémenter initrd
. Depuis des temps où initrd était rare et exotique.
tmpfs
Tmpfs est différent. C'est un système de fichiers factice. Les méthodes qu'il fournit à VFS sont le strict minimum absolu pour le faire fonctionner (en tant que tel, c'est une excellente documentation de ce que les méthodes inode, dentry et file doivent faire). Les fichiers n'existent que s'il existe un inode et un dentry correspondants dans le cache d'inodes, créés lors de la création du fichier et n'ayant jamais expiré à moins que le fichier ne soit supprimé. Les pages sont associées à des fichiers lorsque des données sont écrites et se comportent autrement comme des pages anonymes (les données peuvent être stockées pour être échangées, page
les structures restent utilisées tant que le fichier existe).
Cela signifie qu'il n'y a pas de copies supplémentaires des données en mémoire et que tout est beaucoup plus simple et, de ce fait, légèrement plus rapide également. Il utilise simplement les structures de données, qui servent de cache pour tout autre système de fichiers, comme stockage principal.
C'est la nouvelle façon d'implémenter initrd
(initramfs
, mais l'image s'appelle toujours simplement initrd
).
C'est aussi le moyen d'implémenter la "mémoire partagée posix" (ce qui signifie simplement que tmpfs est monté sur /dev/shm
et les applications sont libres d'y créer des fichiers et de les mmaper; simple et efficace) et depuis peu /tmp
et /run
(ou /var/run
) ont souvent des tmpfs montés spécialement sur les ordinateurs portables pour empêcher les disques de tourner ou éviter une certaine usure en cas de SSD.