El proceso de arranque de Linux se explica en pasos simples
Este tutorial describe el proceso de arranque de Linux en detalle, como las etapas involucradas, qué scripts se ejecutan, qué archivos de configuración se leen y su orden, desde el momento de encender el sistema hasta que aparece el indicador de inicio de sesión.
1) Inicialización de BIOS
BIOS o el sistema básico de entrada y salida es un programa de firmware que realiza un nivel muy básico de interacción con el hardware. Este es el primer programa que toma el control cuando se enciende la computadora. El BIOS realiza una prueba en todos los componentes de hardware y periféricos denominada POST o «Autoprueba de encendido». Inicializa el hardware necesario para arrancar.
Una vez que POST se ejecuta correctamente, el BIOS busca un dispositivo de arranque en una lista de dispositivos. El BIOS moderno le permite configurar el orden de estos dispositivos (a veces llamado preferencia de arranque) que el BIOS comprueba para el arranque. Estos dispositivos de arranque pueden ser una unidad de disquete, un CDROM, un disco duro, una interfaz de red u otro medio extraíble (como una unidad flash USB).
El BIOS busca el sector de arranque en el dispositivo de arranque. El sector de arranque es el primer sector físico del dispositivo de almacenamiento y contiene el código necesario para arrancar la máquina.
2) El registro de arranque maestro
En el caso de discos duros y muchos otros medios de almacenamiento masivo, el sector de arranque es MBR. MBR consta de 512 bytes en el primer sector del disco duro. Es importante tener en cuenta que MBR no se encuentra dentro de ninguna partición. MBR precede a la primera partición. El diseño de MBR es el siguiente:
• Los primeros 446 bytes contienen código de arranque.
• Los siguientes 64 bytes contienen información de partición para 4 particiones (16×4). Es por eso que los discos duros pueden tener solo 4 particiones primarias ya que el MBR puede almacenar información solo para 4 particiones. Entonces, si necesita más de 4 particiones en el disco duro, una de las particiones primarias debe extenderse y, a partir de estas particiones extendidas, se crean particiones lógicas.
• Los últimos 2 bytes son para la firma MBR, también llamada número mágico. (Por lo tanto, un total de 446 + 64 + 2 = 512 bytes).
| =================== | ====== | ====== | ====== | ====== | === |
| 446 | 16 | 16 | 16 | 16 | 2 |
| =================== | ====== | ====== | ====== | ====== | === |
Los primeros 446 bytes de MBR contienen el código que ubica la partición desde donde arrancar. El resto del proceso de arranque se realiza desde esa partición. Esta partición contiene un programa de software llamado ‘cargador de arranque’ para arrancar el sistema.
3) Acerca de GRUB
Según gnu.org, «un gestor de arranque es el primer programa de software que se ejecuta cuando se inicia una computadora». GRUB o GRand Unified Bootloader es el programa de carga de arranque para sistemas operativos tipo Linux. Hay dos versiones principales de Grub disponibles (Grub versión 1 y 2). Actualmente, la mayoría de las distribuciones de Linux han comenzado a usar grub versión 2. Una característica principal de grub es que se puede instalar usando la imagen de Linux y no hay necesidad de ejecutar el sistema operativo.
Grub es un gestor de arranque de varias etapas (Stage1, Stage 1.5 y Stage 2). Las 3 etapas para la versión 1 y la versión 2 de grub se explican a continuación.
Etapas de la versión 1 de Grub
La etapa 1 puede cargar la etapa 2 directamente, pero normalmente está configurada para cargar la etapa 1.5. GRUB Stage 1.5 se encuentra en los primeros 30 kilobytes del disco duro inmediatamente después del MBR y antes de la primera partición. Si este espacio no está disponible (tabla de particiones inusuales, controladores de disco especiales, disco GPT o LVM), la instalación de la etapa 1.5 fallará. La imagen de la etapa 1.5 contiene controladores del sistema de archivos. Esto permite que la etapa 1.5 cargue directamente la etapa 2 desde cualquier ubicación conocida en el sistema de archivos, por ejemplo, desde / boot / grub. La etapa 2 cargará el archivo de configuración predeterminado y cualquier otro módulo necesario.
Etapas de la versión 2 de Grub
Etapa 1 -> boot.img se almacena en el MBR (u opcionalmente en cualquiera de los registros de arranque de volumen) y se dirige a la siguiente etapa mediante una dirección LBA48 (se omite el límite de 1024 cilindros de GRUB heredado) y en el momento de la instalación , está configurado para cargar el primer sector de core.img
Etapa 1.5 -> core.img se escribe por defecto en los sectores entre el MBR y la primera partición, cuando estos sectores están libres y disponibles. Por razones heredadas, la primera partición de un disco duro no comienza en el sector 1 (el recuento comienza con 0) sino en el sector 63 dejando un espacio de 63 sectores de espacio vacío, que no es parte de ninguna partición del sistema de archivos y por lo tanto, no es propenso a problemas relacionados con él. Una vez ejecutado, core.img cargará su archivo de configuración y cualquier otro módulo necesario, particularmente los controladores del sistema de archivos. En el momento de la instalación, se genera a partir de diskboot.img y se configura para cargar la etapa 2.
Consulte la parte inferior de esta página para proceso de arranque usando grub versión 2
Etapa 2 -> los archivos que pertenecen a la etapa 2 se guardan en el directorio / boot / grub-, que es un subdirectorio del directorio / boot /.
Errores de la etapa de inicio de Grub
Grub Stage 1 Errors: Hard Disk Error Floppy Error Read Error Geom Error
Grub Stage 1.5 Errors: The Stage 1.5 handles errors by printing an error number in the form of "Error":
Grub Stage 2 Errors: Selected item won't fit into memory Selected disk doesn't exist Disk read error Disk write error Disk geometry error Attempt to access block outside pa No such partition Bad filename (must be absolute path name or block list) Bad file or directory type File not found Inconsistent filesystem structure Filesystem compatibility error, can't read whole file Error while parsing number Device string unrecognizable Invalid device requested Loading below 1MB is not supported Unsupported Multiboot features requested Unknown boot failure Must load Multiboot kernel before modules Must load Linux kernel before initrd Cannot boot without kernel loaded Unrecognized command Bad or incompatible header on compressed file Bad or corrupt data while decompressing file Bad or corrupt version of stage1/stage2
Aquí hay una muestra de grub.conf:
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (2.6.18-238.el5) root (hd0,0) kernel /vmlinuz-2.6.18-238.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-238.el5.img title Windows XP Pro rootnoverify (hd0,1) chainload +1
GRUB le permite elegir de una lista de sistemas operativos disponibles. Los diferentes sistemas operativos tienen un título diferente en grub.conf. En correspondencia con este archivo de configuración, se le pedirá al usuario del menú de GRUB que elija entre dos opciones: Red Hat Enterprise Linux Server (2.6.18-238.el5) y Windows XP Pro. Los comandos que siguen al título son los comandos que se ejecutan en segundo plano cuando se selecciona una entrada en el menú de GRUB. Por ejemplo, cuando el usuario selecciona la primera opción de Red Hat Enterprise Linux, se ejecutan los siguientes tres comandos:
root (hd0,0) kernel /vmlinuz-2.6.18-238.el5 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-238.el5.img
En correspondencia con esta entrada del menú, el primer comando, es decir, «root (hd0,0)», especifica la partición en la que se encuentran la imagen del kernel comprimida y el archivo initrd.
El segundo comando, es decir, «kernel /vmlinuz-2.6.18-238.el5 ro root = / dev / VolGroup00 / LogVol00», indica qué imagen del kernel usar (en este caso, vmlinuz-2.6.18-238.el5). Los argumentos de este comando son ‘ro’ y ‘root’. ‘root’ especifica el dispositivo en el que se encuentra el directorio raíz del sistema de archivos (es decir, el directorio /); ‘ro’ significa que esta partición debe montarse en modo de solo lectura (es decir, el kernel monta la partición raíz en modo de solo lectura). Tenga en cuenta que la partición para el sistema de archivos raíz y la partición en la que reside esta imagen del núcleo (es decir, la partición de arranque) son diferentes.
El tercer comando es la ubicación de initrd. Antes de entrar en detalles sobre qué es initrd, veamos un problema causado en el momento del arranque.
El problema del módulo de pollo / huevo e initrd
El kernel necesita montar el sistema de archivos raíz (como se especifica en el segundo comando anterior). Este sistema de archivos puede estar en alguna partición con una de las siguientes capacidades:
• Logical Volume Management • Software RAID • NFS (Network File System) • Some other encrypted partition
El kernel de Linux no tiene estas características compiladas. Pero están presentes como módulos. Entonces, el kernel necesita cargar estos módulos para montar el sistema de archivos raíz. Estos módulos están presentes en el directorio / lib / modules /, que está presente en el propio sistema de archivos raíz. Pero este sistema de archivos raíz aún no está montado (eso es lo que hemos estado intentando hacer hasta ahora). Entonces, ¿cómo puede el kernel acceder a los módulos para montar un sistema de archivos que están presentes en el propio sistema de archivos (sin montarlo)?
El kernel y GRUB proporcionan una solución a través de initrd, el disco RAM inicial. Contiene los módulos necesarios para montar el sistema de archivos, y solo se incluyen los módulos necesarios para ese sistema de archivos.
GRUB también admite la carga en cadena, el método utilizado para pasar el control a otro cargador de arranque. GRUB utiliza Chainloading para iniciar sistemas operativos como Windows. Esto se puede verificar en el archivo de configuración anterior, bajo el título Windows XP Pro.
4) Inicialización del kernel
Después de la etapa 2 de GRUB, se conoce la ubicación del kernel y los módulos necesarios a través de initrd. Ahora el el kernel se carga en la memoria y se inicializa. La imagen initrd se compila y se monta en la memoria. Sirve como un sistema de archivos raíz temporal y ayuda al kernel a arrancar correctamente sin montar ningún sistema de archivos raíz. Ahora que todos los controladores están cargados en la memoria y el kernel se ha iniciado, el kernel monta el sistema de archivos raíz en modo de solo lectura e inicia el primer proceso.
5) El proceso init
El ‘init’ es el primer proceso iniciado por el kernel (proceso de inicialización). Es el padre de todos los procesos. El PID (ID de proceso) del proceso de inicio es siempre 1. Este proceso persiste hasta que la computadora se detiene. Es responsable de todo el estado del sistema. La configuración de este proceso se almacena en su archivo de configuración, / etc / inittab (tabla de inicialización del sistema). Antes de profundizar en los detalles de este archivo y continuar con el proceso de arranque, analicemos los niveles de ejecución.
6) niveles de ejecución
El nivel de ejecución es el estado en el que se inicia un sistema. Puede arrancar en un modo de usuario único, modo multiusuario, con redes y con gráficos, etc. Los siguientes son los niveles de ejecución predeterminados definidos por Linux:
0: Halt or shutdown the system 1: Single user mode 2: Multi-user mode, without networking 3: Full multi user mode, with NFS (typical for servers) 4: Officially not defined; Unused 5: Full multi user with NFS and graphics (typical for desktops) 6: Reboot
Hay algunos niveles de ejecución adicionales, que rara vez se utilizan, como:
s,S or single: Alternate single user mode emergency: Bypass rc.sysinit (discussed later in this article)
Resumiendo los niveles de ejecución: El nivel de ejecución 1 se utiliza con fines de mantenimiento, porque es un nivel de ejecución muy limitado. Solo los scripts mínimos se ejecutan en este nivel de ejecución. Solo el usuario root puede iniciar sesión. Ningún otro usuario puede iniciar sesión en este nivel de ejecución. El nivel de ejecución 2 es más relajado que el nivel de ejecución 1. Aquí, todos los usuarios pueden iniciar sesión, pero el servicio de red no se está ejecutando. El nivel de ejecución 3 proporciona un entorno de trabajo completo. Todos los usuarios pueden iniciar sesión, la red está habilitada. El nivel de ejecución 4 es solo para fines experimentales. En el nivel de ejecución 5, la consola gráfica está disponible. El nivel de ejecución ‘0’ es el estado de detención del sistema, y cambiar al nivel de ejecución 6 reiniciará el sistema.
Ahora que tenemos claros los niveles de ejecución, continuemos nuestra discusión sobre el proceso init y su archivo de configuración, ‘inittab’.
El archivo ‘inittab’ de RHEL es:
# # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon
El formato general de las entradas en este archivo es:
id: nivel de ejecución (s): acción: proceso
"id" is the unique sequence of characters for identifying an entry in this file. "runlevels" are the runlevels for which that entry is applicable. "action" is the action that is to be taken for the runlevel. "process" specifies the process that is to be executed.
Ahora, veamos algunas entradas en este archivo. La primera línea sin comentar, es decir, «id: 3: initdefault:» especifica el nivel de ejecución predeterminado en el que se iniciará el sistema. Según este archivo, el sistema se iniciará en el nivel de ejecución 3 de forma predeterminada. Una línea más importante es la línea de inicialización del sistema (la que tiene id: si)
si::sysinit:/etc/rc.d/rc.sysinit
Esta línea le dice al proceso init que ejecute el script «/etc/rc.d/rc.sysinit». Este es el primer script ejecutado por init durante el proceso de arranque.
7) Secuencia de comandos rc.sysinit
Cuando este script se ejecuta, solicita al usuario una configuración interactiva (presione ‘I’ para ingresar al inicio interactivo). Este script realiza muchas funciones para el sistema que incluyen:
• Configuración del nombre de host
• Comprueba y monta sistemas de archivos (/ proc, / sys y otros en / etc / fstab).
• Habilita SWAP
• Establece SELinux
• Configura los parámetros del kernel desde sysctl.conf
• Configura el reloj del sistema
• Carga los módulos necesarios
• Establecer un camino mínimo
• Inicializa los puertos seriales y otros puertos necesarios
• Habilita RAID y LVM
• Y el sistema de archivos raíz, que se montó anteriormente como solo lectura (como se especifica en el archivo de configuración de GRUB), se verifica y se vuelve a montar en lectura-escritura.
Una vez ejecutado este script, se ejecutan los archivos específicos del nivel de ejecución, de acuerdo con «/ etc / inittab». En nuestro archivo, el nivel de ejecución predeterminado era 3. Entonces, la línea correspondiente a este nivel de ejecución es:
l3:3:wait:/etc/rc.d/rc 3
Hay directorios correspondientes a cada nivel de ejecución en el directorio «/etc/rc.d». De acuerdo con esta línea, se ejecutan los scripts en el directorio /etc/rc.d/rc3.d. Hagamos una lista de los archivos en este directorio. (Otros directorios como rc1.d, rc2.d … tienen archivos similares en ellos).
[root@redhat-server ~]# ls -l /etc/rc.d/rc3.d/ total 304 lrwxrwxrwx 1 root root 17 Jul 3 03:51 K01dnsmasq -> ../init.d/dnsmasq lrwxrwxrwx 1 root root 24 Jul 3 03:51 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd lrwxrwxrwx 1 root root 24 Jul 3 03:54 K02NetworkManager -> ../init.d/NetworkManager lrwxrwxrwx 1 root root 16 Jul 3 03:50 K05conman -> ../init.d/conman lrwxrwxrwx 1 root root 19 Jul 3 03:51 K05saslauthd -> ../init.d/saslauthd lrwxrwxrwx 1 root root 17 Jul 3 03:52 K05wdaemon -> ../init.d/wdaemon lrwxrwxrwx 1 root root 16 Jul 3 03:50 K10psacct -> ../init.d/psacct lrwxrwxrwx 1 root root 13 Jul 3 03:53 K20nfs -> ../init.d/nfs lrwxrwxrwx 1 root root 14 Jul 3 03:53 K24irda -> ../init.d/irda lrwxrwxrwx 1 root root 19 Jul 3 03:53 K35vncserver -> ../init.d/vncserver lrwxrwxrwx 1 root root 17 Jul 3 03:56 K35winbind -> ../init.d/winbind lrwxrwxrwx 1 root root 20 Jul 3 03:51 K50netconsole -> ../init.d/netconsole lrwxrwxrwx 1 root root 16 Jul 5 10:10 K50vsftpd -> ../init.d/vsftpd lrwxrwxrwx 1 root root 20 Jul 3 03:53 K69rpcsvcgssd -> ../init.d/rpcsvcgssd lrwxrwxrwx 1 root root 16 Jul 3 03:56 K73ypbind -> ../init.d/ypbind lrwxrwxrwx 1 root root 14 Jul 3 03:52 K74ipmi -> ../init.d/ipmi lrwxrwxrwx 1 root root 14 Jul 3 03:49 K74nscd -> ../init.d/nscd lrwxrwxrwx 1 root root 14 Jul 3 04:00 K74ntpd -> ../init.d/ntpd lrwxrwxrwx 1 root root 15 Jul 3 03:49 K80kdump -> ../init.d/kdump lrwxrwxrwx 1 root root 15 Jul 3 03:52 K85mdmpd -> ../init.d/mdmpd lrwxrwxrwx 1 root root 20 Jul 3 03:49 K87multipathd -> ../init.d/multipathd lrwxrwxrwx 1 root root 24 Jul 3 03:51 K88wpa_supplicant -> ../init.d/wpa_supplicant lrwxrwxrwx 1 root root 14 Jul 3 03:52 K89dund -> ../init.d/dund lrwxrwxrwx 1 root root 18 Jul 3 03:49 K89netplugd -> ../init.d/netplugd lrwxrwxrwx 1 root root 14 Jul 3 03:52 K89pand -> ../init.d/pand lrwxrwxrwx 1 root root 15 Jul 3 03:49 K89rdisc -> ../init.d/rdisc lrwxrwxrwx 1 root root 14 Jul 3 03:53 K91capi -> ../init.d/capi lrwxrwxrwx 1 root root 25 Jul 3 03:52 K99readahead_later -> ../init.d/readahead_later lrwxrwxrwx 1 root root 23 Jul 3 03:52 S00microcode_ctl -> ../init.d/microcode_ctl lrwxrwxrwx 1 root root 25 Jul 3 03:52 S04readahead_early -> ../init.d/readahead_early lrwxrwxrwx 1 root root 15 Jul 3 03:54 S05kudzu -> ../init.d/kudzu lrwxrwxrwx 1 root root 16 Jul 3 03:51 S07iscsid -> ../init.d/iscsid lrwxrwxrwx 1 root root 19 Jul 3 03:49 S08ip6tables -> ../init.d/ip6tables lrwxrwxrwx 1 root root 18 Jul 3 03:49 S08iptables -> ../init.d/iptables lrwxrwxrwx 1 root root 18 Jul 3 03:51 S08mcstrans -> ../init.d/mcstrans lrwxrwxrwx 1 root root 14 Jul 3 03:53 S09isdn -> ../init.d/isdn lrwxrwxrwx 1 root root 17 Jul 3 03:51 S10network -> ../init.d/network lrwxrwxrwx 1 root root 16 Jul 3 03:49 S11auditd -> ../init.d/auditd lrwxrwxrwx 1 root root 21 Jul 3 03:51 S12restorecond -> ../init.d/restorecond lrwxrwxrwx 1 root root 16 Jul 3 03:51 S12syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 18 Jul 3 03:49 S13cpuspeed -> ../init.d/cpuspeed
Algunos archivos de este directorio comienzan con ‘S’ y otros con ‘K’. Los archivos que comienzan con ‘S’ corresponden a los scripts que deben ‘iniciarse’ en ese nivel de ejecución en particular, y los que tienen ‘K’ corresponden a los que deben ser ‘eliminados’. Estos archivos son solo enlaces suaves a scripts en el directorio «/etc/rc.d/init/d» (un enlace suave apunta a «/etc/rc.local», que en sí mismo es un enlace suave a «/etc/rc.d / rc / local «). Los scripts en «/etc/rc.d/init.d/» son demonios. Los demonios son los procesos que se ejecutan en segundo plano y brindan algún tipo de servicio. Por ejemplo, http daemon (httpd) proporciona un servicio web.
El script «/etc/rc.local» se ejecuta después de que se hayan ejecutado todos estos scripts. Si hay un comando o secuencia de comandos que desea que se ejecute al iniciar el sistema, puede incluirlo en esta secuencia de comandos.
[root@redhat-server ~]# cat /etc/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local
Ahora que todos estos scripts se han ejecutado correctamente, aparece el mensaje de inicio de sesión.
Red Hat Enterprise Linux Server release 5.6 (Tikanga) Kernel 2.6.18-238.el5 on an i686 redhat-server login:
Bootloader Grub Versión 2 Desglose los pasos del proceso de arranque de Linux
1.Hardware Power Up , CPU gets into real mode and jumps to fixed location 0xFFFF0 i.e., hardwired in the CPU circuit. 2.BIOS program (ROM) stored in that location will be executed 3.BIOS code will select the boot device (hard disk , CD ROM , Floppy , USB etc ) that we have configured. 4.Once BIOS undestands the boot device , BIOS code will load the MBR to RAM. grub-install is the program that write data into MBR. 5.BIOS code jumps to the start address of the loaded MBR 6.The core.img from /boot/grub/core.img is loaded in memory. Once core.img has been loaded it can use search.mod to find all further /boot/grub files 7.The executed core.img code now initialises all the modules that are built into it (linked into core.img); one of these modules will be a filesystem driver capable of reading the filesystem on which directory /boot/grub lives. 8.You can link config file into core.img if you need booting through pxe , remote nfs etc. In normal cases, it is not required. 9.Core.img now loads file /boot/grub/normal.mod dynamically from disk , this module provides an interactive command-line. 10.Grub will load a file /boot/grub/grub.cfg which is a shell script and it will then configure the standard Grub boot menu. 11.In grub.cfg "linux /vmlinuz-linux root=/dev/sda3 ro" , "linux" module loads a kernel into memory
Conclusión
Gracias por leer y proporcione sus sugerencias en la sección de comentarios a continuación. También puede descargar la versión pdf del proceso de arranque de Linux para referencia futura.
Leer también: