La différence entre initrd et initramfs?

Pour autant que je sache, initrd agit comme un périphérique de bloc, nécessitant ainsi un pilote de système de fichiers (tel que ext2). Le noyau doit avoir au moins un module intégré pour détecter le système de fichiers initrd. Dans cet article, présentant initramfs, un nouveau modèle pour les disques RAM initiaux , Il est écrit que:

Mais les ramdisks gaspillent encore plus de mémoire en raison de la mise en cache. Linux est conçu pour mettre en cache tous les fichiers et les entrées de répertoire lus ou écrits pour bloquer les périphériques, donc Linux copie les données vers et depuis le disque le "cache de page" (pour les données de fichier), et le "cache dentry" (pour les entrées de répertoire). L'inconvénient du ramdisk prétendant être un périphérique de bloc est-il traité comme un périphérique de bloc.

Qu'est-ce que page cache et dentry cache? Dans le paragraphe, cela signifie-t-il que les données ont été dupliquées parce que ramdisk est traité comme un périphérique de bloc, donc toutes les données sont mises en cache?

En contraste, ramfs:

Il y a quelques années, Linus Torvalds avait un idée soignée: et si le cache de Linux peut être monté comme un système de fichiers? Gardez simplement les fichiers en cache et ne vous en débarrassez jamais jusqu'à ce qu'ils soient supprimés ou que le système redémarre? Linus a écrit un petit wrapper autour du cache appelé "ramfs", et d'autres les développeurs du noyau ont créé une version améliorée appelée "tmpfs" (qui peut écrire les données pour échanger de l'espace et limiter la taille d'un montage donné point de sorte qu'il se remplit avant de consommer toute la mémoire disponible). Initramfs est une instance de tmpfs.

Ces systèmes de fichiers basés sur la ram se développent ou se rétrécissent automatiquement la taille des données qu'ils contiennent. Ajout de fichiers à un ramfs (ou extension fichiers existants) alloue automatiquement plus de mémoire, et la suppression ou tronquer les fichiers libère cette mémoire. Il n'y a pas de duplication entre bloquer le périphérique et le cache, car il n'y a pas de périphérique de bloc. La copie dans le cache est la seule copie des données. Le meilleur de tous, ce n'est pas nouveau code, mais une nouvelle application pour le code de mise en cache Linux existant, qui signifie qu'il ajoute presque pas de taille, est très simple et est basé sur infrastructure extrêmement bien testée.

En somme, ramfs est juste un fichier ouvert et chargé en mémoire, n'est-ce pas?

Deux initrd et ramfs sont compressés au moment de la compilation, mais la différence est, initrd est un périphérique bloc déballé pour être monté par le noyau au démarrage, alors que ramfs est décompressé par cpio dans la mémoire. Suis-je la corriger? Ou est-ce que ramfs est un système de fichiers très minimal?

Enfin, jusqu'à ce jour, le initrd l'image est toujours présentée dans le dernier noyau. Cependant, est-ce que initrd en fait le ramfs utilisé aujourd'hui et le nom est juste à des fins historiques?

47
demandé sur Amumu 2012-05-15 18:38:26

2 réponses

Cache Dentry (et inode)

Sous-système de fichiers sous Linux a trois couches. Le VFS (virtual filesystem), qui implémente l'interface des appels système et gère les points de montage et les autorisations par défaut et les contrôles de limites. Ci-dessous se trouvent les pilotes pour les systèmes de fichiers individuels et ceux-ci s'interfacent à leur tour avec les pilotes pour les périphériques de bloc (disques, cartes mémoire, etc.; les interfaces réseau sont une exception).

L'interface entre VFS et filesystem sont plusieurs classes (c'est C simple, donc des structures contenant des pointeurs vers des fonctions et autres, mais c'est une interface orientée objet conceptuellement). Les trois principales classes sont inode, qui décrit un 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 fichier est ouvert par un processus. Une fois monté, le pilote du système de fichiers crée inode et dentry pour sa racine et les autres sont créés à la demande lorsque le processus veut accéder à un fichier et finalement expiré. C'est un cache dentry et inode.

Oui, cela signifie que pour chaque fichier ouvert et tout répertoire jusqu'à la racine, il doit y avoir des structures inode et dentry allouées dans la mémoire du noyau qui le représentent.

Cache de Page

Sous Linux, chaque page mémoire contenant des données userland est représentée par une structure page unifiée. Cela peut marquer la page comme anonyme (peut être échangé pour échanger l'espace si disponible) ou l'associer à inode sur un système 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 est le cache de page.

Les pages sont utilisées pour implémenter l'interface mmap et tandis que les appels système réguliers de lecture et d'écriture peuvent ê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, que lorsque la lecture du fichier est demandée allouer des pages et appelez le système de fichiers pour les remplir, un par un. Pour le système de fichiers basé sur un périphérique de bloc, il calcule simplement les adresses appropriées et délègue ce remplissage au pilote de périphérique de bloc.

Ramdev (ramdisk)

Ramdev est un périphérique de bloc régulier. Cela permet de superposer n'importe quel système de fichiers au-dessus de celui-ci, mais il 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. C'est exactement ce qui est nécessaire pour le vrai bloc des dispositifs comme les disques, les cartes mémoire, le stockage de masse USB et autres, mais pour ramdisk 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 l'appelant.

C'est l'ancienne façon de mettre en œuvre initrd. De temps où initrd était rare et exotique occurence.

Tmpfs

Tmpfs est différent. C'est un mannequin système de fichiers. Les méthodes qu'il fournit à VFS sont le strict minimum absolu pour le faire fonctionner (en tant que tel, c'est excellent documentation de ce que les méthodes inode, dentry et file devraient faire). Les fichiers n'existent que s'il y a inode et dentry correspondants dans le cache d'inode, créés lorsque le fichier est créé et jamais expiré sauf si le fichier est 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, les structures page 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 l'ensemble la chose est beaucoup plus simple et en raison de cela un peu plus rapide aussi. Il utilise simplement les structures de données, qui servent de cache pour tout autre système de fichiers, car c'est le stockage primaire.

C'est la nouvelle façon de mettre en œuvre initrd (initramfs, mais l'image est encore appelé tout à l' initrd).

C'est aussi la façon d'implémenter "posix shared memory" (ce qui signifie simplement que tmpfs est monté sur /dev/shm et que les applications sont libres de créer des fichiers et de les mmap; simple et efficace) et récemment même /tmp et /run (ou /var/run) ont souvent des tmpfs montés en particulier sur les ordinateurs portables pour empêcher les disques d'avoir à tourner ou éviter une certaine usure en cas de SSD.

42
répondu Jan Hudec 2012-05-16 07:05:21

, je pense que vous avez raison en tout.

La différence est facile à voir si vous suivez les étapes nécessaires au démarrage:

initrd

  • un périphérique de bloc ramdev est créé. C'est un périphérique de bloc basé sur la ram, c'est-à-dire un disque dur simulé qui utilise de la mémoire au lieu de disques physiques.
  • le fichier initrd est lu et décompressé dans le périphérique, comme si vous l'aviez fait zcat initrd | dd of=/dev/ram0 ou quelque chose de similaire.
  • le initrd contient une image d'un système de fichiers, donc maintenant vous pouvez 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 {[6] } est décompressé directement dans ce nouveau système de fichiers: zcat initramfs | cpio -i, ou similaire.
  • Terminé!

Et oui, il est toujours appelé initrd dans de nombreux endroits bien que ce soit un initramfs, en particulier dans les chargeurs de démarrage, comme pour eux, il est juste un BLOB. La différence est faite par le système d'exploitation quand il démarre.

52
répondu rodrigo 2012-05-15 15:50:29