El proceso de arranque en Linux | Algo de Linux

viernes, 12 de diciembre de 2008

El proceso de arranque en Linux

Voy a contar cuál es el proceso de arranque en Linux, particularizándolo para una máquina con Debian.

Todo el proceso de arranque, se desarrolla en 4 etapas:
  • Al principio, toma el control la BIOS.
  • En una segunda etapa, tomará el control el cargador de arranque.
  • En una tercera etapa, el control pasa al propio kernel Linux.
  • Y en la cuarta y última etapa tendremos en memoria los programas de usuario conviviendo junto con el propio sistema operativo, quienes tomarán el control del sistema.
Primera etapa: La BIOS.

Al encender el equipo, toma el control la BIOS. que realiza una serie de operaciones básicas de hardware.
Una vez que el hardware es reconocido y queda listo para usar, la BIOS carga en memoria el código executable del cargador de arranque y le pasa el control.

Segunda etapa: El cargador de arranque: GRUB.

Existen diferentes cargadores de arranque. En Debian, habitualmente utilizamos GRUB.
Normalmente, el cargador de arranque se guarda en el MBR (Master Boot Record), que como tiene un tamaño muy reducido (Son los primeros 512 bytes del disco), obliga a dividir el arranque en varias etapas. De este modo, la BIOS carga la primera etapa del cargador de arranque. Y, después, esta primera etapa del cargador de arranque cargará el resto del cargador de arranque.

GRUB se carga y se ejecuta en 4 etapas:
  • La BIOS carga la primera etapa del cargador, que se encuentra almacenada en el MBR.
  • La primera etapa carga el resto del cargador. Si la segunda etapa está en un dispositivo grande, se carga una etapa intermedia (llamada etapa 1.5), que contiene código extra que permite leer cilíndros mayores que 1024 o dispositivos tipo LBA.
  • La segunda etapa ejecuta el cargador y muestra el menú de inicio de GRUB, permitiendo seleccionar el SO que se desea arrancar.
  • Una vez seleccionado el sistema operativo que se quiere arrancar, se carga en memoria y se le pasa el control.
Tercera etapa: El kernel de Linux.

El proceso del kernel se realiza en dos etapas:

  • La etapa de carga.
  • La etapa de ejecución.

El kernel generalmente se almacena en un archivo comprimido. Este archivo comprimido se carga y se descomprime en memoria.

Por otra parte, también se cargan los drivers necesarios mediante el initrd. El initrd crea un sistema de archivos temporal usado en la fase de ejecución del kernel.

Una vez que el kernel se ha cargado en memoria y está listo, se lleva a cabo su ejecución.

Lo último que se lanza es el proceso init.

Cuarta etapa: El proceso init.

Al igual que todos los sistemas Unix, Debian arranca ejecutando el proceso init. El archivo de configuración de init es el fichero /etc/inittab, en el que se indica que el primer script que se debe ejecutar es el /etc/init.d/rcS.

Supongamos que se encuentra instalado el paquete sysv-rc (es lo típico), que utiliza enlaces simbólicos en los directorios rc para controlar qué servicios se inician en los diferentes niveles de ejecución.

El archivo /etc/init.d/rcS ejecuta todos los scripts situados en /etc/rcS.d/ para realizar inicializaciones tales como la comprobación y montaje de los sistemas de archivos, la carga de módulos, la inicialización de los servicios de red, la configuración del reloj, etc.

Luego, y por compatibilidad, también ejecuta todos los archivos (excepto aquellos con un `.' en su nombre) situados en /etc/rc.boot/. Este último directorio está reservado para el administrador del sistema y su utilización ha caído en desuso.

Niveles de ejecución

Una vez completado el proceso de arranque, el proceso init iniciará todos los servicios que han sido configurados para ejecutarse en el nivel de ejecución predeterminado.
Este nivel de ejecución predeterminado viene indicado por una entrada id en el /etc/inittab. En Debianel nivel de inicio predeterminado es el nivel 2 (id=2).

Debian utiliza los siguientes niveles de ejecución:
  • 0 (apagar el sistema)
  • 1 (modo monousuario)
  • 2 al 5 (modos multiusuario)
  • 6 (reiniciar el sistema)
Si estamos en un nivel de ejecución, podemos cambiar a otro utilizando el comando telinit.
Ejemplo: Si ejecutamos telinit 1 cambiaremos al modo monousuario.

Al iniciar un nivel de ejecución se ejecutan todos los scripts ubicados en el directorio /etc/rcN.d/. Donde N es un número que representa el nivel de ejecución. Ej: r2.d, rc3.d ...

Los scripts de estos directorios, se nombran siguiendo unas reglas:

La primera letra del nombre del script determina la manera en que se ejecuta el script:
  • Los scripts cuyos nombres comienzan con K se ejecutan con el argumento stop.
  • Los scripts que comienzan con S se ejecutan con el argumento start.
Después de esta primera letra se usan dos dígitos y un nombre de script.

Los scripts se ejecutan en orden, según el orden alfabético de sus nombres.

Los scripts situados en /etc/rcN (donde N es un número que representa el nivel de ejecución) son tan sólo enlaces simbólicos que apuntan a los scripts situados en /etc/init.d/


Personalizar los niveles de ejecución

Habilitar un servicio.- Para habilitar un servicio llamado servicio en el nivel de ejecución N crearemos un enlace simbólico /etc/rcN.d/Sxyservicio al script servicio alojado en ../init.d/.
El número de secuencia xy debe ser igual al asignado al servicio cuando fue instalado el paquete.
Ejemplo: ln -s /etc/rc2.d/S99proftpd ../init.d/proftpd

Deshabilitar un servicio.- Para deshabilitar un servicio, renombraremos el enlace simbólico de modo que su nombre comience con K y no con S y su número de secuencia sea 100 menos xy.
Ejemplo: mv /etc/rc2.d/S99proftpd /etc/rc2.d/K99proftpd

En vez de cambiarle el nombre, es posible eliminar el enlace simbólico S de un servicio de un directorio de niveles de ejecución determinado. Esto no deshabilita el servicio sino que lo deja en un estado "potencial" al menos en lo que respecta al sistema init sysv-rc. Al cambiar de nivel de ejecución el servicio no se lo activará ni se lo detendrá sino que se lo dejará como estaba, independientemente si esta ejecutándose o no.

No es aconsejable realizar modificaciones a los enlaces simbólicos situados en /etc/rcS.d/.

3 comentarios:

Anónimo dijo...

excelente... !!!, la explicación, para este novato en debian, me llamaba la atención, el tema de arranque de mi querido debian, me ha dado gran satisfacción este s.o., una vez más gracias.
atte. pedro vilca

Anónimo dijo...

excelente... !!!, la explicación, para este novato en debian, me llamaba la atención, el tema de arranque de mi querido debian, me ha dado gran satisfacción este s.o., una vez más gracias.
atte. pedro vilca

Anónimo dijo...

Muy interesante y muy bien redactado. ¡Sigue así!