GNU/Linux >> Tutoriales Linux >  >> Linux

¿La diferencia entre initrd e initramfs?

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 hecho zcat 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.


Linux
  1. ¿Cuál es la diferencia entre InnoDB y MyISAM?

  2. ¿La diferencia entre [[ $a ==Z* ]] y [ $a ==Z* ]?

  3. ¿La diferencia entre Getty y Agetty?

  4. ¿La diferencia entre .exrc y .vimrc?

  5. La diferencia entre '$ . Foo' y '$ ./foo'??

¿Cuál es la diferencia entre Linux y Unix?

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?

¿Cuál es la diferencia entre DMA y E/S mapeada en memoria?

¿Cuál es la diferencia entre strtok_r y strtok_s en C?

¿Cuál es la diferencia entre unlink y rm?