El proceso de inicio de Linux es el proceso de inicialización de múltiples etapas que se realiza durante el inicio de una instalación de Linux . Es en muchos aspectos similar al BSD y otros procesos de arranque estilo Unix , de los cuales deriva.
Arrancar una instalación de Linux implica múltiples etapas y componentes de software, incluida la inicialización del firmware , la ejecución de un cargador de arranque , la carga y el inicio de una imagen del kernel de Linux y la ejecución de varios scripts y demonios de inicio . Para cada una de estas etapas y componentes existen diferentes variaciones y enfoques; por ejemplo, GRUB , coreboot o Das U-Boot se pueden utilizar como cargadores de arranque (los ejemplos históricos son LILO , SYSLINUX o Loadlin ), mientras que los scripts de inicio pueden ser init tradicionales-style, o la configuración del sistema se puede realizar a través de alternativas modernas como systemd o Upstart .
Descripción general
Las primeras etapas del proceso de inicio de Linux dependen en gran medida de la arquitectura de la computadora. El hardware compatible con IBM PC es una arquitectura en la que Linux se usa comúnmente; en estos sistemas, el BIOS juega un papel importante, que puede no tener análogos exactos en otros sistemas. En el siguiente ejemplo, se asume hardware compatible con IBM PC:
- El BIOS realiza tareas de inicio específicas para la plataforma de hardware real . Una vez que se enumera el hardware y el hardware necesario para el arranque se inicializa correctamente, el BIOS carga y ejecuta el código de arranque desde el dispositivo de arranque configurado.
- El cargador de arranque a menudo presenta al usuario un menú de posibles opciones de arranque y tiene una opción predeterminada, que se selecciona después de un tiempo. Una vez realizada la selección, el cargador de arranque carga el kernel en la memoria, le proporciona algunos parámetros y le da control.
- El kernel, si está comprimido, se descomprimirá solo. A continuación, configura las funciones del sistema, como el hardware esencial y la paginación de la memoria, y las llamadas
start_kernel()
que realizan la mayor parte de la configuración del sistema (interrupciones, el resto de la gestión de la memoria, la inicialización del dispositivo y del controlador, etc.). Luego inicia, por separado, el proceso inactivo , el planificador y el proceso de inicio , que se ejecuta en el espacio del usuario . - El init consiste en scripts que son ejecutados por el shell (sysv, bsd, runit) o archivos de configuración que son ejecutados por los componentes binarios (systemd, upstart). Init tiene niveles específicos (sysv, bsd) u objetivos (systemd), cada uno de los cuales consta de un conjunto específico de servicios (demonios). Estos proporcionan diversos servicios y estructuras que no son del sistema operativo y forman el entorno del usuario. Un entorno de servidor típico inicia un servidor web, servicios de base de datos y redes.
- El entorno de escritorio típico comienza con un demonio, llamado administrador de pantalla, que inicia un entorno gráfico que consiste en un servidor gráfico que proporciona una pila gráfica subyacente básica y un administrador de inicio de sesión que brinda la capacidad de ingresar credenciales y seleccionar una sesión. Una vez que el usuario ha introducido las credenciales correctas, el administrador de sesiones inicia una sesión. Una sesión es un conjunto de programas como elementos de la interfaz de usuario (paneles, escritorios, applets, etc.) que, juntos, pueden formar un entorno de escritorio completo.
Al apagar, se llama a init para cerrar toda la funcionalidad del espacio de usuario de una manera controlada. Una vez que todos los demás procesos han terminado, init realiza una llamada del sistema al kernel indicándole que apague el sistema.
Fase del cargador de arranque
La fase del cargador de arranque varía según la arquitectura de la computadora. Dado que las fases anteriores no son específicas del sistema operativo, se considera que el proceso de arranque basado en BIOS para arquitecturas x86 y x86-64 se inicia cuando el código del registro de arranque maestro (MBR) se ejecuta en modo real y el cargador de arranque de la primera etapa está cargado. En los sistemas UEFI , el kernel de Linux se puede ejecutar directamente mediante el firmware UEFI a través de EFISTUB, [1] pero generalmente se usa GRUB 2 o systemd-boot como cargador de arranque. A continuación se muestra un resumen de algunos cargadores de arranque populares:
- GRUB 2 se diferencia de GRUB 1 por ser capaz de detectar y configurar automáticamente varios sistemas operativos. El stage1 es cargado y ejecutado por el BIOS desde el Master boot record (MBR). El cargador de etapa intermedia (stage1.5, normalmente core.img) es cargado y ejecutado por el cargador de etapa1. El cargador de la segunda etapa (stage2, los archivos / boot / grub /) lo carga el stage1.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 que se elige una entrada de menú y se dan los 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 de otro cargador de arranque. En los sistemas UEFI , stage1 y stage1.5 suelen ser el mismo archivo de aplicación UEFI (como grubx64.efi para sistemas UEFI x64 ).
- systemd-boot (anteriormente Gummiboot), un cargador de arranque incluido con systemd que requiere una configuración mínima (solo para sistemas UEFI ).
- SYSLINUX / ISOLINUX es un cargador de arranque que se especializa en arrancar instalaciones completas de Linux desde sistemas de archivos FAT. A menudo se utiliza para disquetes de arranque o rescate, USB activos y otros sistemas de arranque ligeros. ISOLINUX se usa generalmente en CD en vivo de Linux y CD de instalación de arranque.
- rEFInd , un administrador de arranque para sistemas UEFI .
- coreboot es una implementación gratuita de UEFI o BIOS y generalmente se implementa con la placa del sistema , y las actualizaciones de campo proporcionadas por el proveedor si es necesario. Partes de coreboot se convierten en el BIOS del sistema y permanecen residentes en la memoria después del inicio.
- Das U-Boot es un cargador de arranque para sistemas integrados. Se utiliza en sistemas que no tienen BIOS / UEFI, sino que emplean métodos personalizados para leer el cargador de arranque en la memoria y ejecutarlo.
Los cargadores de arranque históricos, que ya no son de uso común, incluyen:
- LILO no comprende ni analiza el diseño del sistema de archivos. En su lugar,
/etc/lilo.conf
se crea un archivo de configuración ( ) en un sistema en vivo que mapea información de compensación 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 el nombre de la ruta del kernel para cada uno, así como las 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 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 para acceder a su archivo de configuración. [2] Esto le da a GRUB 1 la capacidad de 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 por humanos en lugar de confiar en compensaciones. También contiene una interfaz de línea de comandos , que facilita la reparación o modificación de GRUB si está mal configurado o dañado. [3]
- Loadlin es un cargador 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 ser encendido a través de 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 tiene controladores para una multitud de dispositivos de hardware, pero ha tenido algún uso en dispositivos móviles . Otro caso de uso es cuando Linux está ubicado en un dispositivo de almacenamiento que no está disponible para el arranque del BIOS: DOS o Windows pueden cargar los controladores apropiados para compensar la limitación del BIOS y arrancar Linux desde allí.
Fase de kernel
El kernel de Linux maneja todos los procesos del sistema operativo, como administración de memoria , programación de tareas , E / S , comunicación entre procesos y control general del sistema. Esto se carga en dos etapas: en la primera etapa, 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 la memoria. Luego, el control se cambia una última vez al proceso de inicio del núcleo principal. Una vez que el kernel está en pleno funcionamiento, y como parte de su inicio, al cargarse y ejecutarse, el kernel busca un proceso de inicio para ejecutar, que (por separado) configura un espacio de usuario y los procesos necesarios para un entorno de usuario y el inicio de sesión final. . El kernel en sí puede permanecer inactivo, sujeto a llamadas de otros procesos.
Para algunas plataformas (como ARM de 64 bits), el gestor de arranque debe realizar la descompresión del kernel.
El kernel normalmente se carga como un archivo de imagen, comprimido en formatos zImage o bzImage con zlib . Una rutina a la cabeza hace una cantidad mínima de configuración de hardware, descomprime la imagen completamente en memoria alta y toma nota de cualquier disco RAM si está configurado. [4] Luego ejecuta el inicio del kernel a través ./arch/i386/boot/head
del proceso startup_32 ()
(para procesadores basados en x86).
La función de inicio para el kernel (también llamada swapper o proceso 0) establece la administración de la 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 Linux no específico de la arquitectura. funcionalidad del kernel a través de una llamada a start_kernel()
. [5]
start_kernel ejecuta una amplia gama de funciones de inicialización. Se configura de manejo de interrupciones ( IRQ ), la memoria adicionales configura, se inicia el proceso Init (el primer proceso de espacio de usuario), y luego comienza la tarea de reposo a través de cpu_idle()
. En particular, el proceso de inicio del kernel también monta el disco RAM inicial ("initrd") que se cargó previamente como el sistema de archivos raíz temporal durante la fase de inicio. El initrd permite que los módulos de controlador se carguen directamente desde la memoria, sin depender de otros dispositivos (por ejemplo, un disco duro) y los controladores necesarios para acceder a ellos (por ejemplo, un controlador SATA). Esta división de algunos controladores compilados estáticamente en el kernel y otros controladores cargados desde initrd permite un kernel más pequeño. El sistema de archivos raíz se conmuta posteriormente mediante una llamada a la 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. A continuación, se recupera la memoria utilizada por el sistema de archivos raíz temporal.
Por lo tanto, el kernel inicializa los dispositivos, monta el sistema de archivos raíz especificado por el cargador de arranque como de solo lectura y ejecuta Init ( /sbin/init
), que está designado como el primer proceso ejecutado por el sistema ( PID = 1). [6] El kernel imprime un mensaje al montar el sistema de archivos, y Init al iniciar el proceso de inicio. También puede ejecutar opcionalmente Initrd [ aclaración necesaria ] para permitir que los asuntos relacionados con la configuración y el dispositivo ( disco RAM o similar) se manejen antes de que se monte el sistema de archivos raíz. [6]
Según Red Hat , el proceso detallado del kernel en esta etapa se resume de la siguiente manera: [2]
- "Cuando se carga el kernel, inmediatamente se inicializa y configura la memoria de la computadora y configura los diversos 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, lo descomprime, lo monta y carga todos los controladores necesarios. A continuación, inicializa los dispositivos virtuales relacionados con el sistema de archivos, como LVM o software RAID antes de desmontar la imagen del disco initrd y liberar toda la memoria que una vez ocupó la imagen del disco. . El kernel luego crea un dispositivo raíz, [ aclaración necesaria ] monta la partición raíz como de solo lectura y libera la memoria no utilizada. En este punto, el kernel se carga en la memoria y está operativo. Sin embargo, dado que no hay aplicaciones de usuario que permitan una aportación 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 programador puede tomar el control de la administración general del sistema, para proporcionar multitarea preventiva, y el proceso de inicio se deja para continuar arrancando el entorno del usuario en el espacio del usuario.
Espacio de usuario inicial
initramfs , también conocido como espacio de usuario temprano , ha estado disponible desde la versión 2.5.46 del kernel de Linux, [7] con la intención de reemplazar tantas funciones como sea posible que anteriormente el kernel hubiera realizado durante el proceso de inicio. Los usos típicos del espacio de usuario inicial 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.
Proceso de inicio
Una vez que el kernel se ha iniciado, inicia el proceso de inicio . Históricamente, este era el "SysV init", que simplemente se llamaba "init". Es probable que las distribuciones de Linux más recientes utilicen una de las alternativas más modernas, como "systemd".
Básicamente, estos se agrupan como gestión de servicios del sistema operativo .
Ver también
- SYSLINUX
- Proceso de inicio de Windows
Referencias
- ^ "Núcleo de código auxiliar de EFI - Wiki de Gentoo" . wiki.gentoo.org . Consultado el 2 de noviembre de 2020 .
- ^ a b "Documentación del producto" . Redhat.com. 2013-09-30 . Consultado el 22 de enero de 2014 .
- ^ "Documentación del producto" . Redhat.com. 2013-09-30 . Consultado el 22 de enero de 2014 .
- ^ "Descripción de IBM del proceso de arranque de Linux" . Archivado desde el original el 31 de mayo de 2008 . Consultado el 3 de abril de 2007 .
- ^ "Dentro del proceso de arranque de Linux" . www.ibm.com . 31 de mayo de 2006.
- ^ a b http://oldfield.wattle.id.au/luv/boot.html Proceso de arranque de Linux - por Kim Oldfield (2001)
- ^ "Llega Initramfs" . Consultado el 14 de noviembre de 2011 .
enlaces externos
- Greg O'Keefe - De Power Up a Bash Prompt
- Descripción de IBM del proceso de arranque de Linux en Wayback Machine (archivado el 31 de mayo de 2008) un artículo de developerWorks por M. Tim Jones
- 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