El mes pasado observamos, de manera superficial, el proceso de arranque de GNU/Linux, algo que resulta muy interesante no solo para resolver problemas que se presenten sino también como un valor añadido a nuestro conocimiento sobre este sistema operativo. Un proceso que comienza en el más bajo nivel de abstracción hasta llegar a un alto nivel de programación. Hoy veremos, gracias a los amigos de The Geek Stuff, cada uno de esos pasos en detalle a fin de crear una base de conocimiento muy importante para nosotros como profesionales especializados en este sistema.
Al presionar el botón de encendido de nuestra computadora y luego de unos segundos (dependiendo del hardware) veremos el inicio de sesión de GNU/Linux. ¿Te has preguntado qué sucede tras el telón desde que la encendemos hasta que aparece la ventana de login aparece?
Las siguientes son las 6 etapas del proceso de arranque de una típica distribución de GNU/Linux.
1. BIOS
BIOS significa Basic Input/Output System (Sistema Básico de Entrada y Salida).
Realiza algunas revisiones de integridad al sistema.
Busca, carga y ejecuta el programa de arranque (boot loader).
Echa una mirada buscando el boot loader en floppy, cd-rom, o disco duro. En esta etapa podemos presionar una tecla (regularmente F12 o F2, esto depende del sistema) durante el arraque el BIOS para cambiar la secuencia de arranque.
Una vez que el boot loader es detectado y cargado en memoria, el BIOS le entrega el control.
Entonces, en pocas palabras, el BIOS carga y ejecuta el boot loader que se encuentra en el MBR.
2. MBR
MBR significa Master Boot Record.
Está localizado en el primer sector de un disco arrancable. Casi siempre /dev/hda, o /dev/sda
El tamaño en bytes del MBR ronda los 512 o menos. Tiene 3 componentes: 1) Información primaria del boot loader en sus primeros 446 bytes, 2) Información de la tabla de partición en los siguientes 64 bytes, y 3) Revisión de validación del MBR en los últimos 2 bytes.
Contiene información acerca de GRUB (o LILO en los sistemas antiguos).
Entonces, en pocas palabras, MBR carga y ejecuta el GRUB boot loader.
3. GRUB
GRUB significa Grand Unified Bootloader.
Si tenemos varios kernels instalados en nuestro sistema, podemos seleccionar cuál de ellos deseamos ejecutar.
Aunque depende si tenemos varios sistemas operativos instalados, casi siempre GRUB muestra un menú por varios segundos, si no presionamos alguna tecla, este carga la imagen del kernel establecida por defecto en el fichero de configuración de GRUB.
GRUB tiene conocimiento acerca del sistema de archivos (LILO nunca tuvo la capidad de hacer esto).
El fichero de configuración de GRUB es /boot/grub/grub.conf o /boot/grub/grub.cfg (/etc/grub.conf es un enlace a este). El siguiente es un ejemplo del fichero grub.conf de CentOS.
#boot=/dev/sda default=0 timeout=5 splashimage=(hd0, 0)/boot/grub/splash.xpm.gz hiddenmenutitle CentOS (2.6.18-194.el5PAE) root (hd0, 0) kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ initrd /boot/initrd-2.6.18-194.el5PAE.img
Como podemos ver contiene el kernel y la imagen initrd.
Entonces, en pocas palabras, GRUB carga y ejecuta el Kernel y la imagen initrd.
4. Kernel
El Kernel monta el sistema de archivos raiz como lo especifica «root=» en el fichero de configuración de GRUB.
Ejecuta el programa /sbin/init.
Desde que init fue el primer programa en ser ejecutado por el Kernel, tiene el identificador de proceso (PID) número 1. Esto lo podemos ver con el comando top o haciendo un ‘ps -ef | grep init’.
initrd significa Initial RAM Disk.
initrd es utilizado por el kernel como un sistema de archivos raiz temporal hasta que el kernel es cargado y el sistema de archivos real es montado. Además contiene controladores necesarios compilados dentro de sí, lo que ayuda a accesar las particiones de los discos y cualquier otro hardware.
5. Init
Init da una mirada al fichero /etc/inittab (Debian, Ubuntu y distros derivadas este fichero no existe porque utilizan algo llamado upstart) para decidir el runlevel a ejecutar.
Estos son los runlevels disponible:
0 – halt1 – Single user mode2 – Multiuser, without NFS3 – Full multiuser mode4 – unused5 – X116 – reboot
Init identifica el initlevel por defecto desde /etc/inittab y utiliza esto para cargar todos los programas apropiados.
Con el comando ‘grep initdefault /etc/inittab’ podemos ver cuál es el runlevel por defecto de nuestro sistema
Si queremos dañarlo, podemos cambiar el runlevel por defecto a 0 o 6. Pero como sabemos lo que significan los runlevels 0 y 6, es probable que no lo hagamos.
Comúnmente el runlevel por defecto es 3 o 5.
6. Runlevel programs
Cuando el sistema está arrancando, podemos ver los servicios iniciando. Por ejemplo: «Starting sendmail …. OK». Estos son los programas del runlevel, ejecutados desde el direcotorio correspondiente como fue definido en el runlevel.
Dependiendo de la configuración de init por defecto, el sistema ejecutará los programas desde un de los siguientes directorios, según sea el caso:
Run level 0 – /etc/rc.d/rc0.d/ Run level 1 – /etc/rc.d/rc1.d/ Run level 2 – /etc/rc.d/rc2.d/ Run level 3 – /etc/rc.d/rc3.d/ Run level 4 – /etc/rc.d/rc4.d/ Run level 5 – /etc/rc.d/rc5.d/ Run level 6 – /etc/rc.d/rc6.d/
Notemos que aquí hay también enlaces simbólicos disponibles para esos directorios dentro de /etc directamente. Entonces, /etc/rc0.d es enlazado a /etc/rc.d/rc0.d.
Bajo los directorios /etc/rc.d/rc*.d/, podemos ver programas cuyos nombres comienzan con S y K.
Los programas que comienzan con S son utilizados durante el arraque. S de «startup».
Los programas que comienzan con K son utilizados durante el apagado. K de «kill».
Hay números justo después de las letras S y K en los nombres de los programas. Esos son la secuencia numérica en la que son iniciados o terminados.
Por ejemplo, S12syslog es para iniciar el daemon syslog, el cual tiene una secuencia de 12. S80sendmail inicia el daemon de sendmail, el cual tiene una secuencia de 80. Por lo que podemos inferir que syslog será iniciado antes de sendmail.