Acelerando el arranque del sistema con RUNIT

Runit es un esquema de servicios supervisados. A diferencia de Sysvinit, runit permite la supervisión de servicios, y en caso de que alguno de ellos caiga, Runit tratará de levantarlo.

Utilizaremos como estándar de documentación:
# para referirnos a superusuario (root)
$ para referirnos a un usuario

1. Instalación de paquetes:

#apt-get install runit-services runit-run runit

Crear configuración de servicio a supervisar

Para que Runit monitoree y supervise un servicio, necesita algunos scripts y links particulares que se encuentran en el directorio /etc/sv (para la distribución STABLE). En caso que no exista la entrada del servicio a supervisar, crearla siguiendo estos pasos:

Suponiendo que "SERVICIO" es el daemon que se quiere instalar.

1. Crear directorio donde se encontrará la configuración de servicios a supervisiar y levantar por Runit.

# mkdir /etc/sv/${SERVICIO}/

# mkdir /etc/sv/${SERVICIO}/log

2. Creo directorio para logs de "mi_servicio"

# mkdir /var/log/${SERVICIO}

3. Creo script que se encarga de lanzar "mi_servicio"

# vi /etc/sv/${SERVICIO}/run

#!/bin/sh
exec 2>&1
# FIXME: poner el nombre adecuado del servicio a lanzar.
# verificar que los parametros que se pasan son adecuados, de acuerdo al init.d
# original.

exec servicio


4. Creo un ejecutable que se encarga de loguear mi_servicio


#!/bin/sh
set -e

# FIXME: Poner el nombre del servicio adecuado
# Tambien verificar si los logs estaran centralizados
SERVICIO=

LOG=/var/log/${SERVICIO}

test -d "$LOG" || mkdir -p -m0750 "$LOG" && chown log:adm "$LOG"

exec chpst -ulog:adm svlogd -tt "$LOG"

5. Hago los archivos, ejecutables.

# chmod +x /etc/sv/${SERVICIO}/run

# chmod +x /etc/sv/${SERVICIO}/log/run

6. Testear ${SERVICIO}

# cd /etc/sv/${SERVICIO}

# ./run

Poner el servicio bajo el monitoreo de Runit

Luego, para poder poner bajo supervisión un servicio, debemos realizar los siguiente pasos:

1. Detener el servicio, utilizando el método tradicional.

/etc/init.d/${SERVICIO} stop

2. Luego debemos realizar un divert del paquete en el que viene el servicio. Esto es para que cuando apt actualize el paquete, no modifique el script.

Esto se realiza de la siguiente manera:

# dpkg-divert --add --rename /etc/init.d/${SERVICIO}

3. Reemplazamos el script de init del servicio por un enlace simbólico a /usr/bin/sv, para lo que previamente se recomienda realizar un backup del mismo.

# cd /etc/init.d/

# ln -s /usr/bin/sv /etc/init.d/${SERVICIO}

4. Le informamos a RunIt del nuevo servicio.

# ln -s /etc/sv/${SERVICIO} /var/service/

y listo, ya deberíamos tener bajo supervisión nuestro servicio.

5. Para poder chequear que efectivamente todo funcione bien, ejecutamos

# sv status ${SERVICIO}

y deberiamos obtener algo como:

run: cron: (pid 19833) 3s

o sino, por medio del viejo método:

# /etc/init.d/${SERVICIO} status

# run: mi_servicio: (pid 19833) 4s



Es importante destacar que no todos los servicios son posible poner bajo supervisión de Runit. Debido a que Runit requiere que el nuevo servicio a supervisar funcione en FOREGROUND, u opcionalmente en modo DEBUG. Aquellos que funcionen únicamente en FOREGROUND no será posible que runit lo supervise.
Cuando un servicio corre en background, el mismo se desprende del terminal, por ejemplo: iceweasel & devolviéndonos el control y uso del terminal nuevamente, en el cual se lanzó anteriormente el navegador. En cambio cuando un servicio corre en foreground, por ejemplo: iceweasel, el terminal sigue teniendo el control del mismo, por lo cual la misma queda inutilizable, salvo por el navegador antes lanzado.

No hay comentarios.: