linux - La diferencia entre initrd e initramfs?
filesystems kernel (2)
Hasta donde yo sé, initrd
actúa como un dispositivo de bloques, por lo que requiere un controlador del sistema de archivos (como ext2
). El kernel debe tener al menos un módulo incorporado para detectar el sistema de archivos de initrd
. En este artículo, Introducing initramfs, un nuevo modelo para discos RAM iniciales , está escrito que:
Pero los ramdisks realmente desperdician aún más memoria debido al almacenamiento en caché. Linux está diseñado para almacenar en caché todos los archivos y entradas de directorio leídos o escritos en dispositivos bloqueados, por lo que Linux copia datos hacia y desde el disco RAM en la "memoria caché de página" (para datos de archivo) y la "caché dentry" (para entradas de directorio) . La desventaja del ramdisk que pretende ser un dispositivo de bloque es que se trata como un dispositivo de bloque.
¿Qué es el page cache
y el dentry cache
? En el párrafo, ¿significa que los datos se duplicaron porque ramdisk
se trata como un dispositivo de bloques, por lo tanto, todos los datos se almacenan en caché?
En contraste, ramfs
:
Hace unos años, Linus Torvalds tenía una idea clara: ¿y si la caché de Linux se pudiera montar como un sistema de archivos? Simplemente mantenga los archivos en caché y nunca se deshaga de ellos hasta que se eliminen o el sistema se reinicie. Linus escribió un pequeño envoltorio alrededor del caché llamado "ramfs", y otros desarrolladores del kernel crearon una versión mejorada llamada "tmpfs" (que puede escribir los datos para intercambiar espacio y limitar el tamaño de un punto de montaje dado para que se llene antes de consumir) toda la memoria disponible). Initramfs es una instancia de tmpfs.
Estos sistemas de archivos basados en RAM crecen o disminuyen automáticamente para adaptarse al tamaño de los datos que contienen. Agregar archivos a una ramfs (o ampliar los archivos existentes) asigna automáticamente más memoria, y eliminar o truncar archivos libera esa memoria. No hay duplicación entre el dispositivo de bloque y el caché, porque no hay un dispositivo de bloque. La copia en el caché es la única copia de los datos. Lo mejor de todo es que este no es un código nuevo, sino una nueva aplicación para el código de caché de Linux existente, lo que significa que casi no agrega tamaño, es muy simple y se basa en una infraestructura extremadamente probada.
En resumen, ramfs
solo está abierto y cargado en la memoria, ¿no?
Tanto initrd
como ramfs
se comprimen en tiempo de compilación, pero la diferencia es que initrd
es un dispositivo de bloque desempaquetado para ser montado por el kernel en el arranque, mientras que ramfs
se desempaqueta a través de cpio en la memoria. ¿Estoy en lo correcto? ¿O es ramfs
un sistema de archivos muy mínimo?
Finalmente, hasta el día de hoy, la imagen initrd
aún se presenta en el núcleo más reciente. Sin embargo, ¿ese initrd
realidad es el ramfs
usado hoy en día y el nombre solo tiene un propósito histórico?
Caché de Dentry (y inode)
El subsistema del sistema de archivos en Linux tiene tres capas. El VFS (sistema de archivos virtual), que implementa la interfaz de llamadas del sistema y maneja cruces de puntos de montaje y permisos por defecto y controles de límites. Debajo están los controladores para sistemas de archivos individuales y aquellos a su vez se conectan con los controladores para dispositivos de bloques (discos, tarjetas de memoria, etc., las interfaces de red son excepciones).
La interfaz entre VFS y el sistema de archivos son varias clases (es simple C, por lo que las estructuras que contienen punteros a funciones y tal, pero es una interfaz orientada a objetos conceptualmente). 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
para su raíz y los otros se crean a petición cuando el proceso quiere acceder a un archivo y finalmente expira. Eso es un caché dentry e inode.
Sí, significa que para cada archivo abierto y cualquier directorio hasta la raíz, tiene que haber estructuras de inode
y dentry
asignadas en la memoria del kernel que lo representa.
Caché de página
En Linux, cada página de memoria que contiene datos de usuario está representada por page
estructura de page
unificada. Esto podría marcar la página como anónima (puede intercambiarse para intercambiar espacio si está disponible) o asociarla con inode
en algún sistema de archivos (puede ser escrita y regrabada desde el sistema de archivos) y puede ser parte de cualquier cantidad de memoria mapas, es decir, visibles 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 de sistema de lectura y escritura de forma regular, la mayoría de las interfaces utiliza funciones genéricas que también usan páginas. Hay funciones genéricas, que cuando se solicita la lectura de archivos, asigna páginas y llama al sistema de archivos para completarlas, una por una. Para el sistema de archivos basado en dispositivos de bloque, solo calcula las direcciones apropiadas y delega este relleno en el controlador de dispositivo de bloque.
ramdev (ramdisk)
Ramdev es un dispositivo de bloque regular. Esto permite superponer cualquier sistema de archivos encima, pero está restringido por la interfaz del dispositivo de bloque. Y eso tiene solo 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 bloque reales como discos, tarjetas de memoria, almacenamiento masivo USB y similares, pero para ramdisk significa que los datos existen en memoria dos veces, una vez en la memoria del ramdev y una vez en la memoria asignada por el llamador.
Esta es la forma antigua de implementar initrd
. Desde tiempos en que el initrd fue 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 indispensable para que funcione (como tal, es una excelente documentación de lo que deberían hacer los métodos de inode, dentry y file). Los archivos solo existen si hay inodo y dentry correspondientes en la memoria caché de inode, creados cuando el archivo se crea y nunca caducan a menos que se elimine el archivo. Las páginas están asociadas a archivos cuando los datos se escriben y se comportan como anónimos (los datos se pueden almacenar para intercambiar, las estructuras de page
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 debido a eso un poco más rápido también. Simplemente utiliza las estructuras de datos, que sirven como caché para cualquier otro sistema de archivos, ya que es el almacenamiento primario.
Esta es la nueva forma de implementar initrd
( initramfs
, pero la imagen 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 libres de crear archivos allí y mmap, simples y eficientes) y recientemente incluso /tmp
y /run
(o /var/run
) a menudo tienen tmpfs montados especialmente en computadoras portátiles para evitar que los discos tengan que girar o evitar el desgaste en el caso de los SSD.
Creo que tienes razón en todo.
La diferencia es fácil de ver si sigues los pasos necesarios al arrancar:
initrd
- Se
ramdev
un dispositivo de bloqueramdev
. Es un dispositivo de bloque basado en ram, que es un disco duro simulado que usa memoria en lugar de discos físicos. - El archivo
initrd
se lee y descomprime en el dispositivo, como si hicierazcat initrd | dd of=/dev/ram0
zcat initrd | dd of=/dev/ram0
o algo similar. - El
initrd
contiene una imagen de un sistema de archivos, por lo que ahora puede montar el sistema de archivos de la forma habitual: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. - ¡Hecho!
initramfs
- Se monta un
tmpfs
:mount -t tmpfs nodev /root
. El tmpfs no necesita un controlador, siempre está en el kernel. No se necesita ningún dispositivo, no hay controladores adicionales. -
initramfs
no está comprimido directamente en este nuevo sistema de archivos:zcat initramfs | cpio -i
zcat initramfs | cpio -i
, o similar. - ¡Hecho!
Y sí, todavía se llama initrd
en muchos lugares, aunque es un initramfs
, particularmente en los cargadores de arranque, ya que para ellos es solo un BLOB. La diferencia la toma el SO cuando arranca.