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.
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:
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.
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.
BIOS:
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:
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.
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í.
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.
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).
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.
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]
Una vez que ha generado todos los procesos dados, init entra en modo de suspensión y espera uno de los tres eventos:
Esto se refiere al programa de inicio de estilo UNIX System V. Otros programas de inicio pueden comportarse de manera diferente.