Proceso de inicio de Linux en SysV

El proceso de inicio de un equipo pasa por varias fases, en su última fase del arranque, el Kernel de Linux lanzará el proceso con PID 1 denominado init que a su vez ejecutara una serie de scripts que permitirán el inicio del sistema operativo y finalizando el ciclo de arranque.

El Kernel intentará ejecutar init en las siguientes ubicaciones:

  • /sbin/init
  • /etc/init
  • /bin/init
  • /bin/sh

En caso de no encontrarlo se generará un evento de Kernel Panic que provocará que el sistema se detenga.

Fichero /etc/inittab

El proceso init es el encargado de lanzar una serie de procesos siguiendo los criterios marcados por el nivel de ejecución (runlevel) configurado en el fichero /etc/inittab. En Systemd y Upstart se lee de otros ficheros.

El contenido del fichero /etc/inittab varía dependiendo de la distribución que se utilice pero su estructura siempre es la misma, cada línea de definición tiene la siguiente estructura:

Identificador:nivel:modo_accion:comando

La función de cada campo es la siguiente:

  • Identificador: Es una identificación única de la línea, este identificador no debe repetirse.
  • nivel: El o los niveles de ejecución.
  • modo_accion: Define la forma en la que se ejecutará el campo “Comando”
  • comando: El comando que se ejecutará en el nivel o nivele elegidos.

Los identificadores más comunes son:

  • initdefault: Es donde se define el nivel de ejecución del sistema.
  • sysinit: Se utiliza para ejecutar scripts de inicialización del sistema independientemente del nivel de ejecución del sistema.
  • wait: Ejecuta el script (comando) del cuarto campo y espera a que finalice.
  • respawn: Ejecuta el script (comando) del cuarto campo y lo deja funcionando en segundo plano y sigue procesando las líneas del fichero inittab,

Niveles de ejecución (runlevels)

Los niveles de ejecución representan un conjunto de scripts o procesos que se lanzarán en el inicio del sistema operativo. Por defecto se definen 8 niveles de ejecución:

  • Runlevel 0 (reservado): Es utilizado para parar el sistema.
  • Runlevel 1 (reservado): Es utilizado para poner el sistema en modo “single user”.
  • Runlevel 2-5: Se utiliza para poner el sistema en multiusuario, en número depende de la distribución.
  • Runlevel 6: Reinicia el sistema.
  • Runlevel 7-9: Es utilizado para personalizaciones, no tiene un uso en concreto.
  • Runlevel S: Internamente se usa “s” o “S” Usado en el inicio del sistema para ponerlo en modo “single user”.
  • Runlevel A, B y C: Son los modos llamados “on demand” y se utilizan para llamar a los scripts asociados a estos modos, pero no cambia el modo actual del sistema.

A través del comando runlevel podemos el que nivel de ejecución hay actualmente, si no se ha cambiado desde el inicio del sistema además de mostrar el nivel mostrará una “N” en caso contrario el primer digito indicará el nivel anterior.

En el siguiente ejemplo se muestra que el sistema se ha iniciado en el runlevel 5:

runlevel

Con el comando telinit [num_level] podremos cambiar el nivel de ejecución (con el comando init [num_level] realizará la misma función)

Por cada runlevel existe un directorio /etc/rc[num_level].d donde estarán los enlaces simbólicos a los script de inicio de procesos en /etc/init.d. Estos enlaces simbólicos deben tener una nomenclatura que previamente está establecida:

[modo][orden][nombre]

Dónde:

  • Modo: Puede ser “S” que significa que se ejecutar en el inicio del runlevel y “K” que se ejecutara en la parada del runlevel o del sistema.
  • Orden: Un número que identifica el orden de ejecución, los números más bajos se ejecutaran antes.
  • Nombre: Nombre identificativo al script que pertenece en /etc/inittab

Ejemplo del directorio para el nivel de ejecución 2 (/etc/rc2.d)

Activación/desactivación de servicios init

Tal cual hemos comentado antes, para que el servicio se ejecute en el nivel de ejecución este tiene que tener un enlace simbólico desde el directorio /etc/rc[num_level].d al directorio de los scripts /etc/init.d para crear estos enlaces disponemos de dos comandos dependiendo de la distribución de Linux:

  • Debian: update-rc.d
  • RedHat: chkconfig

update-rc.d

Ejemplos básicos de uso:

Creación de enlaces por defecto (enlaza para inicio en los niveles 2 a 5 y parada en los niveles 0,1 y 6)

# update-rc.d servicio defaults

 Supresión de enlaces

# update-rc.d servicio remove

 chkconfig

Ejemplos básicos de uso:

 Creación de enlaces de gestión de servicios

# chkconfig --add servicio

# chkconfig servicio on

Supresión de enlaces de gestión de servicios

# chkconfig --del servicio

# chkconfig servicio off

 Comprobación de los estados de un servicio según los niveles

# chkconfig --list servicio

Comando service

Una vez cargado el sistema se puede interactuar con los servicios a través de sus scripts pasando el parámetro start/stop/status además también disponemos el comando service que nos permitirá realizar la mista tarea:

Para comprobar el estado de un servicio:

# service [nombre_servicio] status

Para parar un servicio:

# service [nombre_servicio] stop

Para iniciar un servicio:

# service [nombre_servicio] start

Se puede comprobar que servicios están activos con el comando

# service –status-all

 También valdrían los siguientes comandos para ver los servicios enlazados:

# for init scripts: ls /etc/init.d/ 

# for runlevel symlinks:ls /etc/rc*.d/

Por ultimo comentar el archivo rc.local que es el último archivo que se carga después de los scripts de inicio, se puede utilizar para personalizaciones del sistema.