SysV

Rafa Morales 11 Septiembre 2013
8min
0
Linux

En el pasado, muchas de las distribuciones de Linux han usado el sistema de inicio de scripts System V (SysV). En estos sistemas, el kernel lanza un proceso llamado init, que lee sus ficheros de configuración y, siguiendo esas instrucciones, lanza una serie de scripts que pueden variar de un runlevel a otro. Vamos a detallar a continuación cuál es su forma de trabajar.

El script /etc/init.d/rc o /etc/rc.d/rc cumple la crucial tarea de ejecutar los scripts asociados al runlevel con el que se va a trabajar.

Este script identifica en primer lugar los scripts a lanzar en un determinado rulevel gracias al fichero /etc/inittab, en el que existirán líneas con el siguiente formato, donde id es un número que identifica la entrada, sin ningún otro valor, runlevels son los números de los runlevels en los que se ejecutará, action será lo que el script general debe de ejecutar con ese script en particular, y process será el nombre del script a ejecutar con los parámetros que se necesiten.

id:runlevels:action:process
t1:12345:respawn:/sbin/getty 9600 tty1 linux

La segunda forma posible para identificar los scripts de un determinado runlevel que se deben de ejecutar es almacenando los scripts concretos del runlevel X (siendo X cualquier número que identifique al runlevel) en el directorio /etc/rcX.d/ o /etc/rc.d/rcX.d/ o /etc/init.d/rcX.d/.

Si comprobamos el contenido de estos directorios nos daremos cuenta de que contienen varios enlaces simbólicos a ficheros que se encuentran normalmente en el directorio /etc/init.d/, o /etc/rc.d/ o /etc/rc.d/init.d/, normalmente con fines organizativos.

Estos enlaces simbólicos poseen siempre nombres que siguen una estructura muy característica:

  • El primer carácter que nos encontramos es una K (Kill) o una S (Start).

  • A continuación tenemos dos caracteres numéricos para indicar un orden entre ellos.

  • Y finalmente tenemos un nombre sin ninguna regla preestablecida, pero que suele ser exactamente igual al nombre del fichero que apunta el enlace simbólico.

Por ejemplo:

K05network

Cuando pasamos a un nivel de ejecución dado, el script general lo que hace es ejecutar primeramente los scripts que comienzan por K con el parámetro stop y siguiendo el orden numérico indicado en el nombre de menor a mayor número. Cuando terminan todos, comienzan a ejecutarse los scripts que comienzan por S con el parámetro start e, igualmente, siguiendo el orden de menor a mayor número.

Por ejemplo, si en el directorio rc5.d tenemos los siguientes enlaces simbólicos:

S01network --> /etc/init.d/network
S05nfs --> /etc/init.d/nfs
K01ypbind --> /etc/init.d/ypbind

El orden de ejecutar estos scripts será por tanto:

/etc/init.d/ypbind stop
/etc/init.d/network start
/etc/init.d/nfs start

Hay que tener en cuenta que al ejecutarse en orden estricto, es conveniente tener en cuenta qué scripts se ejecutan antes y después del que estamos modificando. Por ejemplo deberíamos saber que si nuestro script ejecutara alguna herramienta que necesite de la red para funcionar, debería ejecutarse, con posterioridad al script que arranca la red.

Como hemos comentado anteriormente, para que cada uno de los scripts pueda ser ejecutado como script de arranque o de parada, estos tienen que admitir los dos parámetros start y stop en su ejecución. Aparte de estos dos parámetros, los scripts suelen ser capaces de procesar las opciones restart, reload, force-reload y status, cuyo significado se explica con más detalle a continuación:

  • start: Iniciar el servicio.

  • stop: Parar el servicio.

  • restart: Con el servicio en ejecución, pararlo y reiniciarlo; en caso contrario, iniciarlo.

  • reload: Leer la configuración del servicio nuevamente sin parada y reinicio del servicio

  • force-reload: Leer nuevamente la configuración del servicio si éste lo soporta; en caso contrario igual que restart.

  • status: Mostrar estado actual.

Por tanto, nosotros podemos utilizar estos parámetros para arrancar o detener de forma manual cualquier servicio del sistema del que tengamos instalado su script en los directorios anteriores.

/etc/init.d/smb restart

Por tanto, nosotros podemos utilizar estos parámetros para arrancar o detener de forma manual cualquier servicio del sistema del que tengamos instalado su script en los directorios anteriores.

Siempre al final de cualquier runlevel se ejecuta el script /etc/rc.local, sería como un pequeño cajón de sastre en el que colocaremos todo aquello que queramos ejecutar y no sepamos dónde ponerlo.

Resumiendo, el orden de ejecución de los scripts tras la ejecución del proceso init es:

1) /etc/init.d/rc

2) /etc/rcX.d/

3) /etc/rc.local

 

Configurando scripts en los runlevels

chkconfig

Este comando nos permite visualizar y modificar los scripts asociados a un determinado runlevel.

Para mostrar cada uno de los scripts del directorio general en qué runlevel están o no activados ejecutamos:

chkconfig --list
pcmcia 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Para mostrar un script en concreto:

chkconfig --list pcmcia

Para arrancar un script que indiquemos:

chkconfig pcmcia on

Para detener un script que indiquemos:

chkconfig pcmcia off

Para devolver el script a sus valores por defecto de arranque ejecutamos el siguiente comando. Para ello el script debe contener en su interior información sobre esos niveles.

chkconfig --level reset pcmcia

Si añadimos un nuevo script al directorio de scripts general y éste posee información sobre los runlevels en los que debe ejecutarse por defecto, podemos añadirlo directamente sin tener nosotros que indicarlos. Debemos ejecutar:

chkconfig --add pcmcia

 

update-rc.d

Este comando también sirve para activar o desactivar scripts en los runlevels, pero mucho más configurable que el anterior. Tendremos que indicar el nombre del script, los niveles en los que se debe ejecutar o parar y el número de orden de ejecución. Prestad atención al punto final ya que es obligatorio.

update-rc.d cups defaults
update-rc.d cups start 20 2 3 5 . stop 20 0 1 6 .

Si sólo queremos ver qué haría el comando pero que no se ejecute añadiríamos el parámetro –n.

update-rc.d –n script start 20 2 3 5 . stop 20 0 1 6 .

Si queremos eliminar un script de todos los nieveles de ejecución sólo tendremos que ejecutar:

update-rc.d script remove
update-rc.d –f script remove

 

sysv-rc-conf

Existe una aplicación muy cómoda y sencilla que nos permite modificar los servicios que se inician en cada uno de los niveles de ejecución. Trabaja en modo terminal, pero consiste únicamente en marcar con una X aquel nivel en el que queremos que se inicie el servicio.

Esta aplicación lista todos los servicios incluidos en el directorio /etc/init.d/.

Instalamos la aplicación:

apt-get install sysv-rc-conf

Y al ejecutarla observamos la siguiente interfaz:

sysv-rc-conf

 

rcconf

Variante de la aplicación anterior pero sin posiblidad de elegir en qué niveles arrancarlos o detenerlos. Trabaja en modo terminal, pero consiste únicamente en marcar con una X aquel nivel en el que queremos que se inicie el servicio.

Instalamos la aplicación:

apt-get install rcconf

Y al ejecutarla observamos la siguiente interfaz:

rcconf

rcconf

 

Creando nuestros propios scripts

/etc/init.d/skeleton

Si queremos crear un script en SysV para un programa o servicio propio, podemos utilizar el archivo /etc/init.d/skeleton como plantilla. Guardamos este archivo bajo un nombre nuevo y editamos los nombres de programas o ficheros y las rutas. Dado el caso, también puede añadir al script nuevos componentes propios que sean necesarios para ejecutar correctamente el comando de inicio.

Tendremos que editar el bloque obligatorio INIT INFO al principio del fichero:

### BEGIN INIT INFO
# Provides: FOO
# Required-Start: $syslog $remote_fs
# Required-Stop: $syslog $remote_fs
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: Start FOO to allow XY and provide YZ
### END INIT INFO

 

Los datos a introducir en este bloque serán los siguientes:

  • Provides: Se introduce el nombre del programa o servicio que va a controlarse por medio del script.

  • Required-Start y Required-Stop: Se incluyen todos los servicios que deben ser iniciados o terminados antes del inicio o parada del servicio o programa en cuestión.

  • Default-Start y Default-Stop: Se introducen los niveles de ejecución en los que la aplicación ha de iniciarse o detenerse automáticamente.

  • Description: Una breve descripción de la aplicación.

Esta información se analiza para generar la numeración de los scripts de arranque y parada resultantes en los directorios de niveles de ejecución.