Linux: Los runlevels

LinuxEntenderemos un runlevel (o nivel de ejecución) como la ejecución de unos determinados daemons que a su vez proporcionan unos servicios concretos. En la instalación de un servidor es habitual diseñar una configuración para que en determinados momentos se puedan ofrecer determinados servicios y en otros no. Para permitir este tipo de funcionamiento, el sistema operativo nos proporciona diferentes niveles de ejecución que podremos adaptar a nuestras necesidades.

Si bien podemos configurar el número de niveles de ejecución que queremos y la funcionalidad de cada uno de ellos, generalmente los sistemas tipo UNIX nos proporcionan 6 diferentes con las siguientes propiedades:

Nivel

Funcionalidad

0 El nivel de ejecución 0 está configurado para parar el sistema.
1 Este nivel es denominado como single user, ya que sólo permite la entrada al sistema al root del mismo. Se arrancan los daemons mínimos y sirve para tareas de mantenimiento.
2-5 Los niveles del 2 al 5 están destinados para ser configurados según las necesidades de cada instalación. Al instalar el sistema, por defecto todos son iguales. Estos niveles también se llaman multiusuario, ya que, por defecto, permiten que más de un usuario trabaje en el sistema.
6 El último nivel está preparado para reiniciar el sistema. Es muy parecido al 0 pero se añade una función de reinicio.

El comando necesario para cambiar de nivel de ejecución es init (le pasamos como parámetro el nivel de ejecución que queramos) y para ver en cuál estamos, runlevel.

Los comandos halt, reboot, shutdown o poweroff lo único que hacen es llamar al nivel de ejecución 0 ó 6 realizando, antes, alguna operación concreta (podéis ver su manual para más información). Sólo el usuario root del sistema puede utilizar todos estos comandos.

El modo como se organizan estos daemons en cada nivel de ejecución es muy simple. Cada nivel de ejecución tiene un directorio situado en /etc/rcX.d/ donde la X es el número de nivel. En estos directorios encontramos enlaces simbólicos a los shell scripts de los daemons situados en /etc/init.d/ (para crear un enlace simbólico a un shell script ejecutaremos “ln –s /etc/init.d/shellScriptDeseado nombreEnlace”), que nos sirven para indicar al sistema si queremos iniciar o parar el daemon al que apuntan. Con el mismo nombre del enlace se identifica la acción que vamos a realizar: si el enlace empieza por “S” (start) indicamos que queremos iniciar el daemon, mientras que se empieza por “K” (kill) indica que queremos pararlo. Si el nombre no empieza por ninguna de estas letras, el sistema no hace nada con él. Después de esta letra se pone un número de 2 cifras entre 00 y 99, que indica el orden de inicio o parada de estos. Este orden es importante, ya que algunos daemons necesitan que otros estén en ejecución antes de ser iniciados.

Al cambiar de nivel de ejecución, el sistema inspeccionará los daemons del directorio correspondiente y empezará, primero, parando los daemons indicados y después iniciará los demás. Lo único que se hace es llamar al daemon pasándole como parámetro start o stop, de modo que si paramos alguno que no se esté ejecutando en el momento de parada, no pasaría nada porque el mismo shell script lo tiene en cuenta. Esto nos sirve para poder cambiar de nivel de ejecución sin tener en cuenta el nivel anterior al que estábamos. En la siguiente tabla podemos ver un ejemplo de configuración para 2 niveles de ejecución:

Nivel de ejecución 2

Daemons ejecutándose

S10sysklogd K50sshd sysklogd
S12kerneld K51apache-ssl kerneld
S20dhcpd K52tftpd dhcpd
S50proftpd K53telnet proftpd
S90apache apache

Nivel de ejecución3

Daemons ejecutándose

S10sysklogd K50dhcpd sysklog
S12kerneld K51proftpd kerneld
S20sshd K52apache sshd
S50apache-ssl K53tftpd apache-ssl
K53telnet

Como podemos ver, en cada nivel tenemos ejecutándose los daemons cuyo enlace simbólico comienza por “S”.

En el fichero /etc/inittab tenemos definida toda la configuración de los runlevels: el nivel de ejecución por defecto, el número de consolas disponibles en cada uno de ellos, etc. Cada línea del fichero es una directiva con la sintaxis:

<id> :<runlevels> : <action> : <process>.

El primer campo es el identificador de la directiva, seguidamente encontramos en qué niveles de ejecución es válida esta directiva, la acción que vamos a realizar y el proceso que se va a lanzar. En el siguiente ejemplo explicamos cómo configurar algunas de estas directivas:

# El nivel de ejecución por defecto (en este caso, el 2)
id:2:initdefault:

# Scripts a ejecutar al arrancar el sistema (antes
# de entrar en el nivel de ejecución por defecto)
si::sysinit:/etc/init.d/rcS

# Programa que se llama al entrar en el nivel de ejecución
# single user (la acción wait indica que se lanza el
# proceso y no se hace nada más)
~~:S:wait:/sbin/sulogin

# Configuración de los diferentes niveles de ejecución
# disponibles en el sistema
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

# Comando a ejecutar al apretar CTRL+ALT+DEL
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Definición de las consolas abiertas en cada
# nivel de ejecución (la acción respawn indica
# que al terminar la ejecución del proceso
# getty se lance otra vez)
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Como vemos, en este fichero se configura todo lo referente a los niveles de ejecución de manera muy flexible, por lo que podemos cambiar lo que nos interese para adaptarlo mejor a nuestras necesidades. Fijémonos en que, aunque aquí definamos el nivel de ejecución por defecto, también lo podríamos especificar al arrancar el sistema con Grub. Esto es muy útil, por ejemplo, cuando tenemos problemas graves en el sistema que no nos permiten arreglarlos adecuadamente; si arrancamos con el primer nivel (pasando 1 o single a Grub), sólo se iniciarán las funciones más necesarias y podremos entrar para arreglar lo que sea necesario.

Anuncios

One Response to Linux: Los runlevels

  1. Jaime M says:

    Buenas,
    perdona una cuestion. Referente a los runlevels, tengo un problema en el arranque de servicios con la SUSE 11, hay alguna diferencia respecto a anteriores versiones que me arrancaban sin problemas?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: