Inicialización y mecanismo de caché en el kernel de Linux

Recibí actualizaciones para mi sistema operativo Linux basado en Debian y, en el medio, el sistema se bloqueó. Se reinició automáticamente, después de eso, todo lo que pude ver fue una pantalla negra y tenía una interfaz de línea de comandos y escribí una palabra, «initramfs».
image00

Sale del menú de inicio de initramfs. Inicié un CD en vivo de ubuntu (la misma versión) y abrí la terminal sin instalar el sistema operativo. Luego ejecuté algunos comandos que son los siguientes:

# for find out the partition drive in
# which the crashed OS is installed.
sudo fdisk -l|grep Linux|grep -Ev 'swap'  

# to list all superblocks in the partition.
sudo dumpe2fs /dev/sda2 | grep superblock  

# this command will repair the OS by 
# alternate superblock and ‘y’ flag is
# used to allow the terminal to fix.
sudo fsck -b 32768 /dev/sda2 -y  

Reparación sin usar CD en vivo
También puede ir al modo de recuperación, pero no podrá escanear la partición completa donde está instalado su sistema operativo y mostrará el menú de inicio de initramsfs. Entonces puedes dar el comando:

fsck /dev/partition \name \where \your \OS \is \installed -y

Se solucionó, pero este error dejó una pregunta: ¿Qué es initramfs?

El mecanismo

En la memoria RAM, se reserva algo de espacio para los archivos del sistema y también para administrar los cachés. Ramfs es uno de los sistemas de archivos que exporta los mecanismos de almacenamiento en caché del disco de Linux como un sistema de archivos basado en RAM de tamaño variable dinámicamente. Este tipo de mecanismos se utilizan para acelerar el acceso a los directorios. Cuando se monta el disco, los archivos almacenados en caché también se montarán como archivos del sistema. El beneficio de ramfs es que requiere una cantidad muy inferior de memoria en el disco. Con los mecanismos normales, los archivos almacenados en caché se eliminan cuando la VM intenta reasignar la memoria, pero con ramfs, la VM no puede liberar la memoria.

raíces

Rootfs es una instancia especial de ramfs. No puede desmontar rootfs porque hay controladores de señales que se ejecutan en paralelo que aseguran que el sistema no se caiga. Está hecho para verificar y manejar una lista vacía, entonces es más fácil para el kernel asegurarse de que ciertas listas no puedan quedar vacías.
Los núcleos de Linux contienen un archivo de formato cpio comprimido con gzip (es una utilidad general de archivado de archivos), que se extrae en rootfs cuando se inicia el núcleo. Después de extraer, el kernel verifica si rootfs contiene un archivo «init», y si es así, lo ejecuta como PID (es un número único que identifica cada uno de los procesos en ejecución en un sistema operativo).
Ahora hay dos posibilidades,
Caso #1:Si se encuentra, este proceso de inicio es responsable de llevar el sistema al resto del camino, incluida la ubicación y el montaje del dispositivo raíz real (si lo hay).

Caso n.º 2: si rootfs no contiene un programa de inicio después de extraer el archivo cpio incrustado, el núcleo recurrirá al código anterior para ubicar y montar una partición raíz, luego ejecutará alguna variante de /sbin/init fuera de que.

Relación con cpio

La opción de configuración CONFIG_INITRAMFS_SOURCE (en Configuración general en menuconfig y viviendo en usr/Kconfig) se puede usar para especificar una fuente para el archivo initramfs, que se incorporará automáticamente al binario resultante. Esta opción puede apuntar a un archivo cpio comprimido con gzip existente, un directorio que contiene archivos para archivar o una especificación de archivo de texto. Una ventaja del archivo de configuración es que no se requiere acceso raíz para establecer permisos o crear Nodes de dispositivos en el nuevo archivo.

El kernel no depende de herramientas cpio externas. Si especifica un directorio en lugar de un archivo de configuración, la infraestructura de compilación del kernel crea un archivo de configuración desde ese directorio (usr/Makefile llama a scripts/gen_initramfs_list.sh) y procede a empaquetar ese directorio usando el archivo de configuración (alimentándolo a usr/gen_init_cpio, que se crea a partir de usr/gen_init_cpio.c). El código de creación de cpio en tiempo de compilación del kernel es completamente autónomo, y el extractor en tiempo de arranque del kernel también es autónomo.

Instrucciones a Initramfs
Cree un archivo hello.c con el código:

#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char *argv[])
{
  printf("Hello world!\n");
  sleep(999999999);
}

Ahora da los comandos:

gcc -static hello.c -o init
echo init | cpio -o -H newc | gzip > test.cpio.gz 

qemu -kernel /boot/vmlinuz -initrd test.cpio.gz /dev/zero

Al depurar un sistema de archivos raíz normal, es bueno poder arrancar con «init = /bin/sh». El equivalente de initramfs es “rdinit = /bin/sh”.

Mi nota: estaba totalmente molesto porque estaba a punto de perder todos los datos, pero ese no es el caso cuando entendí por qué se necesita. La cultura de código abierto te da la libertad de aprender cualquier cosa, entonces es tu responsabilidad ayudar a desarrollarla y no ignorarla. Las contribuciones de código abierto son la mejor manera que puede hacer por la sociedad, incluso si no se destaca, disfrutando de la satisfacción cuando su código o contribución benefició a la gente.

Este artículo es una contribución de Krishnan Iyer . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *