Proceso de arranque de Linux

El proceso de arranque de Linux son los pasos mediante los cuales se preparan los sistemas operativos basados ​​en Linux . Este proceso es en muchos aspectos similar al arranque de BSD y otros sistemas similares a Unix de los que se origina.

Descripción general del proceso

Cuando la computadora arranca, hay una transferencia de control en serie desde el firmware del sistema de la computadora ( BIOS o UEFI ) al gestor de arranque , y de éste al kernel . Luego, el kernel inicia el planificador (para realizar múltiples tareas) y ejecuta el programa init (que configura el entorno del usuario y permite la interacción y el inicio de sesión del usuario), después de lo cual el kernel queda inactivo hasta que recibe una llamada externa.

Principales pasos de descarga:

  1. El firmware del sistema de la computadora realiza la verificación inicial y la inicialización del hardware .
  2. En el caso del BIOS, el firmware se carga en la RAM y ejecuta el código de arranque desde una de las particiones del dispositivo de arranque especificado, que contiene la fase 1 del gestor de arranque de Linux. La fase 1 carga la fase 2 (código de cargador significativo). Algunos cargadores de arranque pueden usar una etapa intermedia (llamada fase 1.5 ) para esto, ya que es posible que los discos modernos de gran capacidad no se lean correctamente sin código adicional. En el caso de UEFI, se inicia el cargador de arranque cargado desde la partición de servicio (EFS), que se selecciona de acuerdo con la configuración de prioridad de arranque definida en la memoria no volátil de la computadora. En este caso, es posible cargar no solo un cargador de arranque especializado, sino que también puede cargar el kernel de Linux directamente (para esto, el kernel debe construirse con la opción EFI_STUB).
  3. El gestor de arranque a menudo presentará al usuario un menú de opciones de arranque disponibles. Después de la selección o después de un tiempo de espera especificado, el gestor de arranque carga el kernel.
  4. El kernel cargado se descomprime en la memoria, configura las funciones del sistema, como operar el hardware necesario y administrar las páginas de memoria, y luego realiza una llamada a start_kernel().
  5. Después de eso , start_kernel()realiza la configuración básica del sistema (interrupciones, otras funciones de administración de memoria, inicialización de dispositivos, controladores, etc.) y luego genera un proceso inactivo , un despachador y, por separado, un proceso de inicio (que se ejecuta en el espacio del usuario). ).
  6. El programador comienza a administrar el sistema de manera más eficiente mientras el kernel permanece inactivo.
  7. El proceso init ejecuta los scripts necesarios que configuran todos los servicios y estructuras que no son del núcleo, lo que creará un entorno de usuario y le presentará una pantalla de inicio de sesión.

Cuando se produce un cierre, se llama a init para finalizar los programas de nivel de usuario de forma controlada, también de acuerdo con los scripts. Después de eso, init se cierra y el kernel realiza su propio apagado.

Fase del cargador

Al arrancar a través de BIOS: Las fases del cargador de arranque difieren según la plataforma. Debido a que los primeros pasos de inicio son independientes del sistema operativo, el proceso de inicio generalmente comienza así:

A partir de ahora, la descarga continúa. La primera fase carga el resto del código del cargador, que generalmente pregunta qué sistema operativo (o tipo de sesión) desea ejecutar el usuario. El código del gestor de arranque se genera a partir de un archivo de configuración /etc/lilo.conf (для LILO)que define los sistemas disponibles. Este archivo contiene, en particular, información sobre la partición de arranque y la ubicación del kernel para cada uno de estos sistemas, así como opciones de arranque adicionales, si las hubiera. Como resultado de la elección, el kernel apropiado se carga en la RAM , el sistema de archivos inicial mínimo se configura desde el archivo de imagen ( initrd ) y luego, junto con los parámetros apropiados, el control se transfiere al nuevo sistema operativo.

LILO y GRUB tienen ciertas diferencias: [1]

Al arrancar a través de UEFI: en UEFI, el gestor de arranque se inicia inmediatamente en modo protegido (32 bits o 64 bits) y, de hecho, todas las fases del gestor de arranque se cargan a la vez (teniendo en cuenta el arranque desde la partición de servicio, no es necesario para que el cargador de arranque se divida en fases separadas y las coloque en diferentes lugares). De lo contrario, el proceso de carga e inicialización del kernel no difiere de la versión del BIOS.

GRUB

BIOS:

  1. La BIOS lee el gestor de arranque de fase 1 desde el MBR (Master Boot Record). [cuatro]
  2. Carga el resto del gestor de arranque (2ª fase). Si la segunda fase está en un disco grande, en ocasiones se carga una fase intermedia 1.5, que contiene un código adicional que permite leer cilindros con números superiores a 1024 ( discos LBA ). El cargador de fase 1.5 se almacena (si es necesario) en el MBR o en la partición de arranque. [cuatro]
  3. La segunda fase del gestor de arranque se ejecuta y muestra el menú de inicio de GRUB. También le permite seleccionar un entorno de tiempo de ejecución y ver la configuración del sistema.
  4. Cuando se selecciona un sistema operativo, se carga y se le transfiere el control. [cuatro]

GRUB admite el arranque directo y en cadena, así como LBA, ext2 y "un verdadero entorno preoperatorio orientado a comandos en máquinas x86". Dispone de tres interfaces: menú de selección, editor de ajustes y consola de mando. [cuatro]

UEFI:

  1. Cargado desde la partición de servicio EFS, GRUB (una versión especial de un archivo binario que puede iniciar UEFI) contiene todos los componentes necesarios para acceder al sistema de archivos /boot donde se encuentran la configuración y los archivos adicionales del cargador de arranque.
  2. Muestra el menú del gestor de arranque y muestra el menú de inicio de GRUB. También le permite seleccionar un entorno de tiempo de ejecución y ver la configuración del sistema.
  3. Cuando se selecciona un sistema operativo, se carga y se le transfiere el control. [cuatro]

LILO

LILO es más antiguo que GRUB y su funcionamiento es casi idéntico, excepto que no contiene una interfaz de línea de comandos. Por lo tanto, todos los cambios deben realizarse en su configuración y escribirse en el MBR, después de lo cual se reinicia el sistema. Por lo tanto, una mala configuración puede hacer que el disco no se pueda iniciar sin el uso de un dispositivo de inicio separado ( disquete , etc.) que contenga un programa para corregir el error. [3] Además, LILO no reconoce sistemas de archivos; en cambio, las direcciones de los archivos de imágenes se almacenan directamente en el MBR, [3] y el BIOS se usa para acceder a ellos directamente.

Cargar

Otra forma de iniciar Linux es desde DOS o Windows 9x , donde el kernel de Linux reemplazará por completo la copia en ejecución del sistema operativo. Esto puede ser útil si el hardware debe estar incluido en el software y los programas correspondientes existen solo para DOS y no para Linux, siendo el software propietario del fabricante y un secreto comercial. Este método de arranque no es particularmente relevante, ya que Linux tiene controladores para muchos dispositivos de hardware, aunque ha sido bastante útil en el pasado.
Otro ejemplo es cuando Linux está en un dispositivo de almacenamiento que no está diseñado para iniciarse desde el BIOS: DOS o Windows pueden cargar los controladores apropiados para eludir esta limitación del BIOS y luego iniciar Linux desde allí.

Fase central

El kernel de Linux gestiona las funciones principales, como la gestión de la memoria, el administrador de tareas , las E/S , la comunicación entre procesos y la gestión general del sistema. La descarga se realiza en dos etapas: en la primera, el kernel (en forma de un archivo de imagen comprimido) se carga en la RAM y se desempaqueta, luego se configuran funciones básicas como la administración básica de la memoria. Luego, el control se transfiere por última vez al proceso principal de inicio del kernel. Una vez que el núcleo está completamente operativo (es decir, cargado y ejecutado su código), encuentra e inicia el proceso de inicio, que configura de forma independiente el espacio del usuario y los procesos necesarios para que funcione el entorno del usuario y el eventual inicio de sesión en el sistema. El propio núcleo entra en modo inactivo y está listo para recibir llamadas de otros procesos.

Etapa de arranque del kernel

El kernel generalmente se inicia como un archivo de imagen comprimido en formato zImage o bzImage usando zlib . Contiene un programa principal que realiza una configuración de hardware mínima, desempaqueta la imagen completa en memoria alta y monta el disco RAM si se proporciona. [5] Después de eso, ejecuta el inicio del kernel a través ./arch/x86/boot/headde un proceso startup_32()(para procesadores de la familia x86).

Etapa de inicio del kernel

Fuente: descripción de IBM del proceso de arranque de Linux   (inglés) + versión traducida del mismo sitio Detalles del proceso de arranque de Linux  (ruso)

La función de inicio del kernel (también llamada swapper o proceso 0 ) organiza la gestión de la memoria ( tablas de páginas y paginación de memoria), determina el tipo de procesador y las funciones adicionales (como la presencia de un coprocesador matemático ) y luego cambia a una funcionalidad independiente de la arquitectura. del kernel de Linux llamando a start_kernel().

start_kernel()realiza muchas tareas de inicialización. Establece controladores de interrupción ( IRQ ), luego configura la memoria, inicia el proceso de inicio (el primer proceso en modo de usuario) y luego inicia la tarea inactiva llamando a cpu_idle(). Tenga en cuenta que el proceso de inicio del kernel también monta el disco RAM inicial ("initrd") que se cargó previamente como un sistema de archivos raíz temporal durante la fase de inicio. Esto permite que los módulos de controladores se carguen sin depender de otros dispositivos físicos y controladores, y mantener el tamaño del kernel pequeño. El sistema de archivos raíz se reemplaza posteriormente con una llamada pivot_root()que desmonta el sistema de archivos temporal y lo reemplaza con el sistema de archivos raíz real tan pronto como este último esté disponible. A continuación, se libera la memoria utilizada por el sistema temporal.

Por lo tanto, el kernel inicializa los dispositivos, monta el sistema de archivos especificado por el gestor de arranque en modo de solo lectura e inicia el /sbin/initproceso init ( ), que se designa como el primer proceso iniciado por el sistema (con ID de proceso PID  = 1). [1] El kernel muestra los mensajes correspondientes (al montar el sistema de archivos) e init (al iniciar el proceso del mismo nombre). El kernel también puede ejecutar un initrd para manejar configuraciones e inicializar dispositivos antes de montar el sistema de archivos raíz. [una]

Según Red Hat , los detalles del proceso de arranque en esta etapa se pueden resumir de la siguiente manera: [2]

Cuando el kernel arranca, inmediatamente inicializa y configura la memoria de la computadora y configura varios hardware conectados al sistema, incluidos todos los procesadores, subsistemas de E/S y dispositivos de almacenamiento. Luego busca la imagen initrd comprimida en una ubicación predeterminada en la memoria, la descomprime, la monta y carga los controladores necesarios. A continuación, inicializa los dispositivos virtuales asociados con el sistema de archivos, como LVM o arreglos RAID de software , antes de desmontar la imagen de disco initrd y recuperar cualquier memoria previamente ocupada por la imagen. Luego, el kernel crea un dispositivo raíz, monta la partición raíz de solo lectura y libera la memoria no utilizada. En este momento, el kernel está cargado en la memoria y está operativo. Sin embargo, dado que no existen programas de usuario que proporcionen una entrada significativa al sistema, es poco lo que se puede hacer con él.

Ahora que las interrupciones están habilitadas, el despachador puede asumir el control general del sistema para habilitar la multitarea preventiva, y el proceso de inicio continúa cargando el entorno del usuario en el espacio del usuario.

proceso de inicio (solo tipo UNIX System V)

Init es el padre de todos los procesos. Su tarea principal es crear procesos con secuencias de comandos a partir de un archivo /etc/inittab. Este archivo generalmente contiene entradas que le dicen a init que genere getty para cada línea en la que los usuarios pueden iniciar sesión. También controla los procesos fuera de línea requeridos por cualquier sistema. Un nivel de ejecución es una configuración programática de un sistema que permite que solo exista un grupo determinado de procesos. Los procesos generados por init en cada uno de estos niveles de ejecución se definen en el archivo /etc/inittab. [6]

Esencialmente, init organiza y mantiene todo el espacio del usuario , lo que también incluye verificar y montar sistemas de archivos, iniciar los servicios de usuario necesarios y cambiar al espacio del usuario cuando el sistema haya terminado de iniciarse. Es similar a los procesos de inicio de Unix y BSD de los que se originó, pero en algunos casos ha sido modificado o rediseñado. En un sistema Linux típico, init tiene un parámetro conocido como runlevel , que toma valores del 1 al 6 y determina qué subsistemas habilitar. Cada nivel de ejecución tiene sus propias secuencias de comandos que rigen los diversos procesos involucrados en la configuración o eliminación de ese nivel de ejecución, y son estas secuencias de comandos las que se consideran necesarias para el proceso de arranque. Los scripts de inicio generalmente se almacenan en directorios con nombres como /etc/rc…. El archivo de configuración de nivel principal para init es /etc/inittab. [7]

Durante el arranque del sistema, comprueba si el nivel por defecto está descrito en /etc/inittab, y si no, lo solicita a través de la consola del sistema. Luego procede a ejecutar todos los scripts de arranque relevantes para ese nivel, incluida la carga de módulos, la verificación de la integridad del sistema de archivos (que se montó solo para lectura), el montaje de lectura y escritura y la configuración de la red. [una]

En particular, según Red Hat , el proceso de inicio sigue este patrón: [2]

  1. Mira un script sysinitque "establece la ruta al entorno, inicia swapel , verifica los sistemas de archivos y hace lo que sea necesario para inicializar el sistema. Estos son, en particular, los relojes del sistema y del hardware, procesos especiales para el puerto serie , y así.
  2. Init luego mira la configuración especificada para el nivel de ejecución dado .
  3. Después de eso, init instala la biblioteca de funciones inicial para el sistema. Esto determina cómo debe iniciarse o terminarse el programa y cómo debe determinarse su PID.
  4. Luego inicia todos los procesos proporcionados y crea una sesión de inicio de sesión de usuario.

Una vez que ha generado todos los procesos dados, init entra en modo de suspensión y espera uno de los tres eventos:

  1. Terminación normal o anormal de los procesos generados.
  2. Señal de falla de energía.
  3. Solicitud de /sbin/telinitpara cambiar el nivel de ejecución . [6]

Esto se refiere al programa de inicio de estilo UNIX System V. Otros programas de inicio pueden comportarse de manera diferente.

Véase también

Notas

  1. 1 2 3 4 5 Proceso de arranque de Linux - por Kim Oldfield (2001) . Consultado el 10 de diciembre de 2008. Archivado desde el original el 18 de diciembre de 2008.
  2. 1 2 3 Una mirada detallada al proceso de arranque . Consultado el 10 de diciembre de 2008. Archivado desde el original el 3 de febrero de 2009.
  3. 123 Documentación ._ _ _ Consultado el 10 de diciembre de 2008. Archivado desde el original el 5 de mayo de 2010.
  4. 1 2 3 4 5 Descripción de GRUB por Red Hat  (inglés) (HTML). Consultado el 8 de agosto de 2010. Archivado desde el original el 7 de marzo de 2009.
  5. Descripción de IBM del proceso de arranque de Linux . Consultado el 10 de diciembre de 2008. Archivado desde el original el 31 de mayo de 2008.
  6. 1 2 La página de manual del proceso init . Consultado el 10 de diciembre de 2008. Archivado desde el original el 12 de junio de 2008.
  7. Desde el encendido hasta el aviso de Bash: Init . Consultado el 26 de noviembre de 2010. Archivado desde el original el 10 de marzo de 2011.

Enlaces