Creo que tienes razón en todo.
La diferencia es fácil de ver si sigue los pasos necesarios al iniciar:
initrd
- Un
ramdev
se crea el dispositivo de bloque. Es un dispositivo de bloque basado en RAM, es decir, un disco duro simulado que usa memoria en lugar de discos físicos. - El
initrd
el archivo se lee y se descomprime en el dispositivo, como si lo hubiera hechozcat initrd | dd of=/dev/ram0
o algo similar. - Los
initrd
contiene una imagen de un sistema de archivos, por lo que ahora puede montar el sistema de archivos como de costumbre:mount /dev/ram0 /root
. Naturalmente, los sistemas de archivos necesitan un controlador, por lo que si usa ext2, el controlador ext2 debe compilarse en el kernel. - ¡Listo!
initramfs
- A
tmpfs
está montado:mount -t tmpfs nodev /root
. El tmpfs no necesita un controlador, siempre está en el kernel. No se necesita ningún dispositivo, ni controladores adicionales. - El
initramfs
se descomprime directamente en este nuevo sistema de archivos:zcat initramfs | cpio -i
, o similar. - ¡Listo!
Y sí, todavía se llama initrd
en muchos lugares aunque es un initramfs
, particularmente en cargadores de arranque, ya que para ellos es solo un BLOB. La diferencia la marca el sistema operativo cuando arranca.
Caché de dentry (y de inodo)
El subsistema del sistema de archivos en Linux tiene tres capas. El VFS (sistema de archivos virtual), que implementa la interfaz de llamadas al sistema y maneja los puntos de montaje cruzados y las verificaciones de límites y permisos predeterminados. Debajo se encuentran los controladores para sistemas de archivos individuales y los que a su vez interactúan con controladores para dispositivos de bloque (discos, tarjetas de memoria, etc.; las interfaces de red son una excepción).
La interfaz entre VFS y el sistema de archivos son varias clases (es simple C, por lo que las estructuras contienen punteros a funciones y demás, pero conceptualmente es una interfaz orientada a objetos). Las tres clases principales son inode
, que describe cualquier objeto (archivo o directorio) en un sistema de archivos, dentry
, que describe la entrada en un directorio y file
, que describe el archivo abierto por un proceso. Cuando se monta, el controlador del sistema de archivos crea inode
y dentry
porque su raíz y los demás se crean a pedido cuando el proceso quiere acceder a un archivo y finalmente expira. Eso es un caché de inodos y dentry.
Sí, significa que para cada archivo abierto y cualquier directorio hasta la raíz tiene que haber inode
y dentry
estructuras asignadas en la memoria del kernel que lo representan.
Caché de página
En Linux, cada página de memoria que contiene datos de espacio de usuario está representada por page
unificado estructura. Esto podría marcar la página como anónima (podría intercambiarse para intercambiar espacio si está disponible) o asociarla con inode
en algún sistema de archivos (puede volver a escribirse y leerse desde el sistema de archivos) y puede ser parte de cualquier número de mapas de memoria, es decir, visible en el espacio de direcciones de algún proceso. La suma de todas las páginas cargadas actualmente en la memoria es la memoria caché de la página.
Las páginas se utilizan para implementar la interfaz mmap y, aunque el sistema de archivos puede implementar llamadas regulares de lectura y escritura por otros medios, la mayoría de las interfaces utilizan funciones genéricas que también utilizan páginas. Hay funciones genéricas, que cuando se solicita la lectura del archivo asignan páginas y llaman al sistema de archivos para completarlas, una por una. Para el sistema de archivos basado en dispositivos de bloques, solo calcula las direcciones apropiadas y delega este llenado al controlador del dispositivo de bloques.
ramdev (disco ram)
Ramdev es un dispositivo de bloque regular. Esto permite superponer cualquier sistema de archivos, pero está restringido por la interfaz del dispositivo de bloque. Y eso solo tiene métodos para completar una página asignada por la persona que llama y escribirla de nuevo. Eso es exactamente lo que se necesita para dispositivos de bloques reales como discos, tarjetas de memoria, almacenamiento masivo USB y demás, pero para ramdisk significa que los datos existen en la memoria dos veces, una en la memoria de ramdev y otra en la memoria asignada por el llamante.
Esta es la forma antigua de implementar initrd
. De tiempos en los que initrd era una ocurrencia rara y exótica.
tmpfs
Tmpfs es diferente. Es un sistema de archivos ficticio. Los métodos que proporciona a VFS son el mínimo absoluto para que funcione (como tal, es una excelente documentación de lo que deben hacer los métodos inode, dentry y file). Los archivos solo existen si hay un inodo y una entrada correspondientes en la caché de inodos, creados cuando se crea el archivo y nunca caducan a menos que se elimine el archivo. Las páginas se asocian a archivos cuando se escriben datos y, de lo contrario, se comportan como páginas anónimas (los datos se pueden almacenar para intercambiar, page
las estructuras permanecen en uso mientras exista el archivo).
Esto significa que no hay copias adicionales de los datos en la memoria y todo es mucho más simple y, por lo tanto, un poco más rápido también. Simplemente utiliza las estructuras de datos, que sirven como caché para cualquier otro sistema de archivos, como almacenamiento principal.
Esta es la nueva forma de implementar initrd
(initramfs
, pero la imagen todavía se llama simplemente initrd
).
También es la forma de implementar "memoria compartida posix" (que simplemente significa que tmpfs está montado en /dev/shm
y las aplicaciones son gratuitas para crear archivos allí y mapearlos; simple y eficiente) y recientemente incluso /tmp
y /run
(o /var/run
) a menudo tienen tmpfs montados especialmente en portátiles para evitar que los discos tengan que girar o evitar el desgaste en el caso de los SSD.