
El proceso de arranque de Linux consta de varias etapas y es, en muchos sentidos, similar a los procesos de arranque de BSD y otros sistemas tipo Unix , de los que deriva. Aunque el proceso de arranque de Linux depende en gran medida de la arquitectura del ordenador, estas arquitecturas comparten etapas y componentes de software similares, [ 1 ] incluyendo el inicio del sistema, la ejecución del gestor de arranque , la carga e inicio de una imagen del kernel de Linux y la ejecución de varios scripts de inicio y demonios . [ 2 ] Estos se agrupan en 4 pasos: inicio del sistema, etapa del gestor de arranque, etapa del kernel y proceso init. [ 3 ]
Cuando un sistema Linux se enciende o se reinicia, su procesador ejecutará un firmware/programa específico para la inicialización del sistema, como la autoprueba de encendido , invocando el vector de reinicio para iniciar un programa en una dirección conocida en flash/ROM (en dispositivos Linux embebidos), luego cargará el cargador de arranque en RAM para su posterior ejecución. [ 2 ] En computadoras personales compatibles con IBM PC (PC), este firmware/programa es un monitor BIOS o UEFI, y se almacena en la placa base. [ 2 ] En sistemas Linux embebidos , este firmware / programa se llama ROM de arranque . [ 4 ] [ 5 ] Después de ser cargado en RAM, el cargador de arranque (también llamado cargador de arranque de primera etapa o cargador de arranque primario) se ejecutará para cargar el cargador de arranque de segunda etapa [ 2 ] (también llamado cargador de arranque secundario). [ 6 ] El cargador de arranque de segunda etapa cargará la imagen del kernel en la memoria, la descomprimirá e inicializará, y luego pasará el control a esta imagen del kernel. [ 2 ] El cargador de arranque de segunda etapa también realiza varias operaciones en el sistema, como la comprobación del hardware del sistema, el montaje del dispositivo raíz, la carga de los módulos del kernel necesarios, etc. [ 2 ] Finalmente, se inicia el primer proceso del espacio de usuario ( proceso) y se realizan otras inicializaciones del sistema de alto nivel (que involucran scripts de inicio). [ 2 ]init
Para cada una de estas etapas y componentes, existen diferentes variaciones y enfoques; por ejemplo, se pueden usar GRUB , systemd-boot , coreboot o Das U-Boot como gestores de arranque (ejemplos históricos son LILO , SYSLINUX o Loadlin ), mientras que los scripts de inicio pueden ser de estilo init tradicional , o la configuración del sistema puede realizarse a través de alternativas modernas como systemd o runit .
Inicio del sistema
El arranque del sistema tiene diferentes pasos según el hardware en el que se esté iniciando Linux. [ 7 ]
El hardware compatible con IBM PC es una arquitectura en la que Linux se usa comúnmente; en estos sistemas, el firmware BIOS o UEFI juega un papel importante.
En los sistemas BIOS, el BIOS realizará una autoprueba de encendido (POST), que consiste en verificar el hardware del sistema, enumerar los dispositivos locales y, finalmente, inicializar el sistema. [ 7 ] Para la inicialización del sistema, el BIOS comenzará buscando el dispositivo de arranque en el sistema que almacena el sistema operativo. Un dispositivo de arranque puede ser un dispositivo de almacenamiento como un disquete, un CD-ROM, una unidad flash USB, una partición en un disco duro (donde un disco duro almacena varios sistemas operativos, por ejemplo, Windows y Fedora), un dispositivo de almacenamiento en la red local, etc. [ 7 ] Un disco duro para arrancar Linux almacena el Registro de arranque maestro (MBR), que contiene el cargador de arranque de primera etapa/primario para ser cargado en la RAM. [ 7 ]
En los sistemas UEFI, el kernel de Linux puede ser ejecutado directamente por el firmware UEFI a través del stub de arranque EFI, [ 8 ] pero normalmente utiliza GRUB 2 o systemd-boot como cargador de arranque. [ 9 ] [ 10 ]
Si se admite el arranque seguro UEFI , un "shim" o "precargador" suele arrancar UEFI antes del gestor de arranque o del núcleo que contiene el stub EFI. [ 11 ] Incluso si el arranque seguro UEFI está deshabilitado, este puede estar presente y arrancar en caso de que se habilite posteriormente. Simplemente actúa para agregar una base de datos de claves de firma adicional que proporciona claves para la verificación de firmas de las etapas de arranque subsiguientes sin modificar la base de datos de claves UEFI, y se encadena al paso de arranque subsiguiente de la misma manera que lo haría UEFI.
La etapa de inicio del sistema en un sistema Linux embebido comienza ejecutando el firmware/programa en la ROM de arranque en el chip , que luego carga el cargador de arranque/sistema operativo desde el dispositivo de almacenamiento como eMMC, eUFS, memoria flash NAND, etc. [ 5 ] Las secuencias de inicio del sistema varían según los procesadores [ 5 ] pero todas incluyen pasos de inicialización de hardware y prueba de hardware del sistema. [ 7 ] Por ejemplo, en un sistema con un procesador i.MX7D y un dispositivo de arranque que almacena el SO (incluido U-Boot), la ROM de arranque en el chip configura primero el controlador de memoria DDR, lo que permite que el programa de la ROM de arranque obtenga los datos de configuración del SoC del cargador de arranque externo en el dispositivo de arranque. [ 5 ] Luego, la ROM de arranque en el chip carga U-Boot en la DRAM para la etapa del cargador de arranque. [ 12 ]
Etapa del cargador de arranque
En los compatibles con IBM PC que utilizan una BIOS , el cargador de arranque de primera etapa, que es parte del registro de arranque maestro (MBR), es una imagen de 512 bytes que contiene el código de programa específico del proveedor y una tabla de particiones. [ 6 ] Como se mencionó anteriormente en la parte de introducción, el cargador de arranque de primera etapa encontrará y cargará el cargador de arranque de segunda etapa. [ 6 ] Lo hace buscando en la tabla de particiones una partición activa. [ 6 ] Después de encontrar una partición activa, el cargador de arranque de primera etapa continuará escaneando las particiones restantes en la tabla para asegurarse de que todas estén inactivas. [ 6 ] Después de este paso, el registro de arranque de la partición activa se lee en la RAM y se ejecuta como el cargador de arranque de segunda etapa. [ 6 ] La función del cargador de arranque de segunda etapa es cargar la imagen del kernel de Linux en la memoria y en el disco RAM inicial opcional. [ 13 ] La imagen del kernel no es un kernel ejecutable, sino un "archivo comprimido" del kernel , comprimido en formato zImage o bzImage con zlib . [ 14 ]
En esos sistemas, los cargadores de arranque de primera y segunda etapa suelen ser proporcionados por el Cargador de Arranque Unificado GRand (GRUB), y anteriormente por el Cargador de Linux ( LILO ). [ 13 ] GRUB 2 , que es el que se usa actualmente, se diferencia de GRUB 1 por su capacidad de detección automática de varios sistemas operativos y configuración automática. La etapa 1 es cargada y ejecutada por la BIOS desde el MBR. El cargador de etapa intermedia (etapa 1.5, generalmente core.img) es cargado y ejecutado por el cargador de etapa 1. El cargador de segunda etapa (etapa 2, los archivos /boot/grub/) es cargado por la etapa 1.5 y muestra el menú de inicio de GRUB que permite al usuario elegir un sistema operativo o examinar y editar los parámetros de inicio. Después de elegir una entrada del menú y proporcionar parámetros opcionales, GRUB carga el kernel de Linux en la memoria y le pasa el control. GRUB 2 también es capaz de cargar en cadena otro cargador de arranque.
En los sistemas UEFI , las etapas 1 y 1.5 suelen ser el mismo archivo de aplicación UEFI (como grubx64.efi para sistemas UEFI x64 ).
Además de GRUB, existen otros gestores de arranque más populares:
- systemd-boot (anteriormente Gummiboot), un gestor de arranque incluido con systemd que requiere una configuración mínima ( solo para sistemas UEFI ).
- SYSLINUX/ISOLINUX es un gestor de arranque especializado en el arranque de instalaciones completas de Linux desde sistemas de archivos FAT. Se utiliza frecuentemente en disquetes de arranque o rescate, unidades USB de arranque y otros sistemas de arranque ligeros. ISOLINUX se utiliza generalmente en CD de arranque de Linux y CD de instalación de arranque.
- rEFInd , un gestor de arranque para sistemas UEFI .
- coreboot es una implementación gratuita de UEFI o BIOS , que generalmente se instala con la placa base y, si es necesario, el fabricante proporciona actualizaciones. Parte de coreboot se integra con la BIOS del sistema y permanece en la memoria después del arranque.
- Das U-Boot es un gestor de arranque para sistemas embebidos. Se utiliza en sistemas que no disponen de BIOS/UEFI, sino que emplean métodos personalizados para cargar el gestor de arranque en la memoria y ejecutarlo.
Entre los gestores de arranque históricos, que ya no se utilizan habitualmente, se incluyen:
- LILO no entiende ni analiza la estructura del sistema de archivos. En su lugar,
/etc/lilo.confse crea un archivo de configuración ( ) en un sistema en vivo que asigna información de desplazamiento sin procesar (herramienta de mapeo) sobre la ubicación del kernel y los discos ram (initrd o initramfs). El archivo de configuración, que incluye datos como la partición de arranque y la ruta del kernel para cada una, así como opciones personalizadas si es necesario, se escribe junto con el código del cargador de arranque en el sector de arranque MBR. Cuando este sector de arranque es leído y controlado por la BIOS, LILO carga el código del menú y lo dibuja, luego usa los valores almacenados junto con la entrada del usuario para calcular y cargar el kernel de Linux o cargar en cadena cualquier otro cargador de arranque . - GRUB 1 incluye lógica para leer sistemas de archivos comunes en tiempo de ejecución con el fin de acceder a su archivo de configuración. [ 15 ] Esto le permite a GRUB 1 leer su archivo de configuración desde el sistema de archivos en lugar de tenerlo incrustado en el MBR, lo que le permite cambiar la configuración en tiempo de ejecución y especificar discos y particiones en un formato legible para humanos en lugar de depender de desplazamientos. También contiene una interfaz de línea de comandos , lo que facilita la reparación o modificación de GRUB si está mal configurado o dañado. [ 16 ]
- Loadlin es un gestor de arranque que puede reemplazar un kernel de DOS o Windows 9x en ejecución con el kernel de Linux en tiempo de ejecución. Esto puede ser útil en el caso de hardware que necesita encenderse mediante software y para el cual dichos programas de configuración son propietarios y solo están disponibles para DOS. Este método de arranque es menos necesario hoy en día, ya que Linux cuenta con controladores para una multitud de dispositivos de hardware, pero se ha utilizado en algunos dispositivos móviles . Otro caso de uso es cuando Linux se encuentra en un dispositivo de almacenamiento que no está disponible para el arranque de la BIOS: DOS o Windows pueden cargar los controladores apropiados para compensar la limitación de la BIOS y arrancar Linux desde allí.
Núcleo
La etapa del kernel ocurre después de la etapa del cargador de arranque. El kernel de Linux maneja todos los procesos del sistema operativo, como la administración de memoria , la planificación de tareas , la E/S , la comunicación entre procesos y el control general del sistema. Se carga en dos etapas : en la primera, el kernel (como un archivo de imagen comprimido) se carga en la memoria y se descomprime, y se configuran algunas funciones fundamentales, como la administración básica de memoria y una configuración mínima de hardware. [ 14 ] La imagen del kernel se descomprime automáticamente, lo cual forma parte de su rutina. [ 14 ] Para algunas plataformas (como ARM de 64 bits), la descompresión del kernel debe ser realizada por el cargador de arranque, como U-Boot. [ 17 ]
Para obtener detalles de esos pasos, tomemos un ejemplo con el microprocesador i386 . Cuando se invoca su bzImage, se llama a la función start()(de ) para realizar una configuración básica del hardware y luego llama a (ubicada en ). [ 14 ] realizará una configuración básica del entorno (pila, etc.), borrará el Bloque Iniciado por Símbolo (BSS) y luego invocará (ubicada en ) para descomprimir el kernel. [ 14 ] El inicio del kernel se ejecuta a través de una función diferente ubicada en . [ 14 ] La función de inicio para el kernel (también llamada intercambiador o proceso 0) establece la administración de memoria (tablas de paginación y paginación de memoria), detecta el tipo de CPU y cualquier funcionalidad adicional, como capacidades de punto flotante , y luego cambia a la funcionalidad del kernel de Linux no específica de la arquitectura a través de una llamada a ubicada en . [ 14 ]./arch/i386/boot/head.Sstartup_32()./arch/i386/boot/compressed/head.Sstartup_32()decompress_kernel()./arch/i386/boot/compressed/misc.cstartup_32()./arch/i386/kernel/head.Sstartup_32()start_kernel()./init/main.c
start_kernel()Ejecuta una amplia gama de funciones de inicialización. Configura el manejo de interrupciones ( IRQ ), configura aún más la memoria, monta el disco RAM inicial ("initrd") que se cargó previamente como el sistema de archivos raíz temporal durante la etapa del cargador de arranque. [ 14 ] El initrd, que actúa como un sistema de archivos raíz temporal en la RAM, permite que el kernel se arranque completamente y que los módulos del controlador se carguen directamente desde la memoria, sin depender de otros dispositivos (por ejemplo, un disco duro). [ 14 ] El initrd generalmente contiene los módulos necesarios para interactuar con los periféricos de almacenamiento, [ 14 ] por ejemplo, el controlador SATA, y admite una gran cantidad de posibles configuraciones de hardware. [ 14 ] Esta división de algunos controladores compilados estáticamente en el kernel y otros controladores cargados desde el initrd permite un kernel más pequeño. [ 14 ] initramfs , también conocido como espacio de usuario temprano, ha estado disponible desde la versión 2.5.46 del kernel de Linux, [ 18 ] con la intención de reemplazar tantas funciones como sea posible que anteriormente el kernel habría realizado durante el proceso de inicio. Los usos típicos del espacio de usuario temprano son detectar qué controladores de dispositivo se necesitan para cargar el sistema de archivos del espacio de usuario principal y cargarlos desde un sistema de archivos temporal . Muchas distribuciones usan dracut para generar y mantener la imagen initramfs.
El sistema de archivos raíz se cambia posteriormente mediante una llamada pivot_root()que desmonta el sistema de archivos raíz temporal y lo reemplaza con el uso del real, una vez que este último es accesible. [ 14 ] La memoria utilizada por el sistema de archivos raíz temporal se recupera entonces.
Finalmente, kernel_thread(en arch/i386/kernel/process.c) se llama para iniciar el proceso Init (el primer proceso en el espacio de usuario) y luego inicia la tarea inactiva a través de cpu_idle(). [ 14 ]
Así, la etapa del kernel inicializa los dispositivos, monta el sistema de archivos raíz especificado por el gestor de arranque como de solo lectura y ejecuta Init ( /sbin/init), que se designa como el primer proceso ejecutado por el sistema ( PID = 1). [ 19 ] El kernel imprime un mensaje al montar el sistema de archivos, e Init imprime un mensaje al iniciar el proceso Init. [ 19 ]
Según Red Hat , el proceso detallado del kernel en esta etapa se resume de la siguiente manera: [ 15 ]
- Cuando se carga el núcleo, este inicializa y configura inmediatamente la memoria del ordenador y configura el hardware conectado al sistema, incluyendo todos los procesadores, subsistemas de E/S y dispositivos de almacenamiento. A continuación, busca la imagen initrd comprimida en una ubicación predeterminada de la memoria, la descomprime, la monta y carga todos los controladores necesarios. Después, inicializa los dispositivos virtuales relacionados con el sistema de archivos, como LVM o RAID por software , antes de desmontar la imagen de disco initrd y liberar toda la memoria que ocupaba. El núcleo crea entonces un dispositivo raíz, monta la partición raíz en modo de solo lectura y libera la memoria no utilizada. En este punto, el núcleo está cargado en la memoria y operativo. Sin embargo, dado que no hay aplicaciones de usuario que permitan una entrada significativa al sistema, no se puede hacer mucho con él. Un arranque al estilo initramfs es similar, pero no idéntico, al arranque initrd descrito.
En este punto, con las interrupciones habilitadas, el planificador puede tomar el control de la gestión general del sistema para proporcionar multitarea preventiva, y el proceso init se encarga de continuar arrancando el entorno de usuario en el espacio de usuario.
Proceso de inicialización
Una vez que el núcleo se ha iniciado, inicia el proceso init , [ 20 ] un demonio que luego inicializa el espacio de usuario , por ejemplo, comprobando y montando sistemas de archivos , e inicia otros procesos . El sistema init es el primer demonio que se inicia (durante el arranque) y el último demonio que termina (durante el apagado ).
Históricamente, este era el " SysV init ", que simplemente se llamaba "init". Es probable que las distribuciones de Linux más recientes utilicen alguna de las alternativas más modernas, como systemd . A continuación, se presenta un resumen de los principales procesos init:
- SysV init ( también conocido simplemente como "init") es similar al proceso init de UNIX System V. En un sistema Linux estándar, init se ejecuta con un parámetro, conocido como runlevel , que toma un valor de 0 a 6 y determina qué subsistemas se ponen en funcionamiento. Cada runlevel tiene sus propios scripts que codifican los diversos procesos involucrados en la configuración o salida del runlevel dado, y son estos scripts los que se referencian según sea necesario en el proceso de arranque. Los scripts de init normalmente se encuentran en directorios con nombres como
"/etc/rc...". El archivo de configuración de nivel superior para init está en/etc/inittab. [ 21 ] Durante el arranque del sistema, comprueba si se especifica un runlevel predeterminado en /etc/inittab, y solicita el runlevel para entrar a través de la consola del sistema si no es así. Luego procede a ejecutar todos los scripts de arranque relevantes para el runlevel dado, incluyendo la carga de módulos , la comprobación de la integridad del sistema de archivos raíz (que estaba montado en solo lectura) y luego el remontaje para acceso completo de lectura y escritura, y configura la red . [ 19 ] Después de haber generado todos los procesos especificados, init entra en estado latente y espera a que ocurra uno de tres eventos: que los procesos que comenzaron terminen o mueran, una señal de falla de energía o una solicitud/sbin/telinitpara cambiar aún más el nivel de ejecución. [ 22 ]
- systemd es una alternativa moderna a SysV init. Al igual que init, systemd es un demonio que gestiona otros demonios. Todos los demonios, incluido systemd, son procesos en segundo plano . Lennart Poettering y Kay Sievers , ingenieros de software que desarrollaron inicialmente systemd, [ 23 ] buscaron superar la eficiencia del demonio init de varias maneras. Querían mejorar el marco de software para expresar dependencias, permitir que se realizara más procesamiento en paralelo durante el arranque del sistema y reducir la sobrecarga computacional del shell . Las instrucciones de inicialización de systemd para cada demonio se registran en un archivo de configuración declarativo en lugar de un script de shell. Para la comunicación entre procesos , systemd pone a disposición de los demonios en ejecución sockets de dominio Unix y D-Bus . Systemd también es capaz de una paralelización agresiva.
Véase también
Referencias
- ↑ M. Tim Jones 2006 , "Introducción", "El proceso de arranque de un sistema Linux® consta de varias etapas. Pero tanto si se trata de un ordenador de sobremesa x86 estándar como de un sistema PowerPC® integrado, gran parte del flujo es sorprendentemente similar."
- 1 2 3 4 5 6 7 M. Tim Jones 2006 , "Descripción general", "Figura 1. Vista general del proceso de arranque de Linux"
- ↑ M. Tim Jones 2006 , "El proceso de arranque de Linux se agrupa en 4 etapas, según la fuente de IBM"
- ↑ Bin, Niu; Dejian, Li; Zhangjian, LU; Lixin, Yang; Zhihua, Bai; Longlong, He; Sheng, Liu (agosto de 2020). Investigación y diseño de Bootrom compatible con el modo de arranque seguro . Simposio Internacional de Ingeniería Informática y Comunicaciones Inteligentes (ISCEIC) de 2020. págs. 5–8 . doi : 10.1109/ISCEIC51027.2020.00009 . ISBN 978-1-7281-8171-4. S2CID 231714880 .
- 1 2 3 4 Alberto Liberal De Los Ríos 2017 , pág. 28, "Proceso de inicio de Linux".
- 1 2 3 4 5 6 M. Tim Jones 2006 , "Cargador de arranque de etapa 1".
- 1 2 3 4 5 M. Tim Jones 2006 , "Inicio del sistema".
- ↑ "EFI stub kernel - Gentoo Wiki" . wiki.gentoo.org . Consultado el 2 de noviembre de 2020 .
- ↑ Kinney, Michael (1 de septiembre de 2000). "Solución de problemas de arranque de BIOS con EFI" (PDF) . págs. 47–50 . Archivado del original (PDF) el 23 de enero de 2007. Recuperado el 14 de septiembre de 2010 .
- ↑ "Microsoft niega que el arranque seguro excluya a Linux" . The Register. 23 de septiembre de 2011. Consultado el 24 de septiembre de 2011 .
- ↑ "Uso de un gestor de arranque firmado - Arch Wiki" . wiki.archlinux.org . Consultado el 5 de diciembre de 2024 .
- ↑ Alberto Liberal De Los Ríos 2017 , pág. 29, "Proceso de inicio de Linux".
- 1 2 M. Tim Jones 2006 , "Cargador de arranque de etapa 2".
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 M. Tim Jones 2006 , "Núcleo".
- 1 2 "Documentación del producto" . Redhat.com. 30 de septiembre de 2013. Archivado del original el 30 de agosto de 2008. Consultado el 22 de enero de 2014 .
- ↑ "Documentación del producto" . Redhat.com. 30 de septiembre de 2013. Consultado el 22 de enero de 2014 .
- ↑ Alberto Liberal De Los Ríos 2017 , pág. 20, "Cargador de arranque".
- ↑ Corbet, Jonathan (6 de noviembre de 2002). "Initramfs llega" . Recuperado el 14 de noviembre de 2011 .
- 1 2 3 http://oldfield.wattle.id.au/luv/boot.html Proceso de arranque de Linux - por Kim Oldfield (2001)
- ↑ M. Tim Jones 2006 , "Init".
- ↑ "Desde Power Up hasta Bash Prompt: Init" . users.cecs.anu.edu.au .
- ↑ "init" . man.he.net .
- ↑ "systemd README" . freedesktop.org . Consultado el 9 de septiembre de 2012 .
Obras citadas
- M. Tim Jones (31 de mayo de 2006). "Dentro del proceso de arranque de Linux" . IBM . Archivado del original el 11 de octubre de 2007. Recuperado el 14 de enero de 2024 .
- Alberto Liberal De Los Ríos (2017). Desarrollo de controladores de Linux para procesadores integrados (2ª ed.). Editorial Círculo Rojo; 1.ª edición (publicada el 3 de marzo de 2017). ISBN 978-8491600190.
Enlaces externos
- Lectura del código fuente del kernel de Linux , Wikiversidad
- Greg O'Keefe - De Power Up a Bash Prompt en Wayback Machine (archivado el 23 de octubre de 2009)
- Bootchart: Visualización del rendimiento del proceso de arranque
- El proceso de arranque en sistemas EFI , LWN.net , 11 de febrero de 2015, por Matt Fleming
- Procesos de arranque
- Linux
- núcleo de Linux