Estoy tratando de entender el proceso de arranque de una máquina en su conjunto desde el momento en que presionas el botón de encendido. Hay una pieza desde el gestor de arranque hasta la etapa initramfs que no entiendo muy bien entre algunos otros bits más pequeños.
Dada esta configuración de Grub para una entrada, tomada de una instalación predeterminada de Ubuntu reciente:
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo 'Loading Linux x.y.z ...'
linux /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset
echo 'Loading initial ramdisk ...'
initrd /initrd.img-x.y.z
¿Qué hace esto realmente en términos del estado del sistema y la memoria? Entiendo que la tarea de Grub es "cargar y ejecutar el núcleo" y tiene su propio conjunto de módulos para acceder a los archivos en los dispositivos (o red) para acceder a ellos. En el ejemplo aquí insmod
s, set root
y search
- pero esto es solo desde la perspectiva de Grub, y no se comparte con el núcleo, ¿verdad?
También supongo que Grub está cargando (¿una copia?) Del núcleo en la memoria ( linux
comando ) y lo está pateando para iniciar la ejecución. (aparentemente, dos pasos diferentes, entonces, ¿cómo?) Los parámetros dados se pueden leer en el núcleo e interpretar (¿es esta una gran cadena asignada a la memoria en algún lugar?) y proporcionan las opciones para organizar las cosas solicitadas.
También veo esta initrd
opción. Esto apunta a mis initramfs comprimidos con gzip, necesarios para arrancar el dispositivo raíz real especificado por root=
. Pero, ¿cómo se proporciona este initramfs al núcleo? No se le pasa ninguna dirección de memoria a donde pueda cargarla, ni puede acceder a ella, ya que ya está cargada antes de que se inicie el núcleo. Parte de la documentación del kernel dice que se puede acceder a este 'dispositivo' del sistema de archivos initramfs /dev/ram0
, pero no veo cómo se convierte en un archivo de dispositivo accesible para empezar. Supongo que sucede algo bajo el agua que no veo.
Tampoco veo cómo esto se relaciona con otros cargadores de arranque, incluidas las plataformas integradas, por ejemplo, usando U-boot / Coreboot. ¿Está haciendo lo mismo que Grub (las mismas direcciones de memoria estándar?) Y en qué medida se comparan con Grub con respecto a la carga de kernel / initrd?
Para aclarar mis preguntas, creo que entiendo por qué existen las diferentes etapas de arranque y qué transiciones tienen lugar, sin embargo, no veo cómo se llevan a cabo y cuáles son las responsabilidades exactas de cada una de las etapas. Tengo la sensación de que me estoy perdiendo algún "estándar" al que todo se reduce.
Agradecería alguna explicación sobre esto.
fuente
boot
comando implícito al final de la secuencia. No estoy seguro de qué hace exactamente en Grub, pero si usa la línea de comandos de Grub para ingresar estos comandos manualmente, debe hacerloboot
o simplemente se quedará para siempregrub>
(o al menos, hasta que se aburra y apague la computadora) ) Los comandos anteriores "simplemente" configuran un entorno.boot
hará que la CPU salte a la dirección del núcleo cargado (inicio de ejecución). Para una entrada de menú, esto se define implícitamente. ver esto .Respuestas:
En general, tiene que haber algún tipo de protocolo porque, por lo general, no es suficiente cargar un archivo en la memoria y saltar a una ubicación específica, sino que debe pasar argumentos adicionales como los parámetros del kernel, es decir, acceder a los argumentos de memdisk desde DOS .
Como esto depende del hardware (el brazo es diferente de x86, por ejemplo), debe encontrar la información correcta; consulte este artículo sobre el brazo de arranque o el protocolo de arranque Linux / x86 para ver algunos ejemplos.
fuente
El gestor de arranque almacena el initrd en una ubicación en la memoria y le dice al núcleo la dirección de memoria de la imagen initrd. La mayoría de los sistemas linux modernos usan el esquema initramfs usando dracut , que en realidad es un archivo cpio (en lugar de una imagen de disco) que se descomprime en un sistema de archivos tmpfs creado por el núcleo poco después de la ejecución.
fuente