Cómo activar el soporte para rc.local de initscripts (SysVInit) en systemd

systemd2

Uno de los debates más sonados de estos últimos años en el mundo Unix es la migración de initscripts (SysVInit) a systemd. Para poner el tema en contexto, SysVInit es el método tradicional mediante el cual se carga en memoria el demonio (daemon) INIT, que continúa en ejecución hasta que el sistema operativo se apaga. INIT es el “padre” de todos los demás procesos del sistema (su Process ID (PID) es 1) y es el encargado de gestionar los procesos “huérfanos”. En los sistemas que soportan SysVInit se cuenta con una serie de scripts de inicio (init scripts o “rc”) – por lo general ubicados en /etc – que definen cómo se inicia, detiene o suspende (entre otras cosas) un demonio. La sintaxis de los scripts rc es bastante sencilla y provee al sistema de un método simple para la gestión de procesos de forma secuencial (serial).

Dentro de las alternativas para remplazar a SysVInit se encuentra systemd, que fue pensado para proveer un marco de trabajo transversal con la API de GNU/Linux, reduciendo la carga del sistema en el momento de inicio y facilitando la gestión de los procesos en espacio de usuario de forma paralela, lo que se podría entender como un “demonio de demonios”.  Los objetos gestionados por systemd se denominan “unidades” (“units”), que son representaciones estandarizadas de los recursos del sistema que pueden ser administrados y las utilidades para manipularlos con el fin de agregar una capa de abstracción y que por lo general se encuentran en /lib/systemd/system.

índicesystemd ha sido objeto de bastantes críticas por parte de la comunidad GNU/Linux, pero aún así se ha convertido en el remplazo de facto de SysVInit y la gran mayoría de distribuciones actuales ya lo incluyen por defecto. A tal nivel han llegado las discusiones que incluso el proyecto Debian (que incluyó systemd por defecto a partir de su versión 8 “Jessie”) sufrió una división interna que dió como resultado una versión de Debian sin systemd denominada “Devuan“. Por otro lado, se encuentran diferentes páginas web en las cuales se indican cómo desinstalar systemd y usar otros gestores de INIT.

Al margen de las ventajas y desventajas de usar systemd, muchos de nosotros aún usamos rc.local, un fichero en el cual se enumeraban los procesos que se cargaban al final de todos los demás demonios y que era de bastante utilidad por su sencillez.

En mi caso particular, con la actualización en la Raspberry Pi de Raspbian 7 a Raspbian 8, la gestión de demonios ya viene por defecto implementada bajo systemd y los scripts ubicados en /etc/rc.local ya no funcionan.

Para volver a tener la funcionalidad de rc.local en un sistema bajo systemd, es necesario realizar los siguientes pasos:

1. Crear el fichero /etc/systemd/system/rc-local.service

En la ruta /etc/systemd/system/rc-local.service, crear un fichero con el siguiente contenido:

[Unit]
Description=Compatibilidad con /etc/rc.local
 
[Service]
Type=oneshot
ExecStart=/etc/rc.local
RemainAfterExit=yes
 
[Install]
WantedBy=multi-user.target

Si se quiere modificar el script, una explicación detallada de todos los apartados de este fichero de unidad se puede encontrar en este artículo.

2. Convertir en ejecutable el fichero /etc/rc.local

root@raspberrypi ~ #chmod +x /etc/rc.local

3. Habilitar el servicio bajo systemd

root@raspberrypi ~ #systemctl enable rc-local

EXTRA: Cheatsheet de systemv vs SysVInit

Para empezar a habituarnos con la sintaxis de systemd, en LinOxide han creado un cheatsheet que puede servir como referencia en la administración:

systemd-vs-sysVinit-cheatsheet

Otros recursos similares para Fedora pueden ser encontrados aquí o para ArchLinux aquí.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.