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:
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.