lunes, 14 de mayo de 2018

¿Cómo activo /etc/rc.local con systemd en Ubuntu 18.04LTS?



Un sistema operativo ha de responder al mismo principio rector que tiene la política y que tiene la vida. Ha de mejorarse, idealmente de una manera concienzuda y escalonada, en pos de lograr la perfección en su funcionamiento y mejorar su andar.

La mayoría de los cambios suelen referirse a los aspectos "visibles" del sistema, pues - como en la política - son los que definen la preferencia del Pueblo, y son los que acarrean los votos a nuestras urnas. Estos cambios espectaculares promueven un mejor y más sencillo uso del sistema.
Sin embargo, en ciertas ocasiones también han de estudiarse y aplicarse cambios que hacen a la esquematización fundamental del sistema. Estos cambios internos raramente son percibidos por la Masa popular, pero han de llevarse a cabo a fin de afianzar los cimientos del sistema y permitir mas sólidos estructuras de software sin recurrir a andamiajes de "quita y pon" en la ingeniería de nuestro Software Libre.

Uno de estos elementos es systemd. Se trata - entre otras cosas - de un fundamental aplicativo orientado a la inicialización del sistema y sus servicios, y reemplaza a la veterana estructura de arranque que tenía GNU como sistema operativo, herederas ellas del Unix V y de las distribuciones de la universidad de Berkley (BSD). Con el tiempo muchas distribuciones de GNU con Linux han adoptado a systemd como estructura básica de arranque, y esto ha llevado a que cada vez más software de usuario (esto es, aplicaciones de uso), requieran de systemd, ya sea de forma parcial o total para su funcionamiento...
Esto podría provocar problemas con ciertas estrategias de inicio o ciertos programas que requieren de los esquemas anteriores. Uno de los más prominentes era el archivo de ejecución de inicio rc.local, al cual podríamos añorar como a una antigua novia tiratiros.
Vean señores, rc.local es un archivo de texto en el cual podíamos introducir comandos, los cuales se autoejecutarían con privilegio de administración al arrancar el sistema y antes de entregar control al usuario, omitiendo de esta forma tener que ejecutarlos posteriormente con privilegios de usuario reducidos. Por ejemplo, podíamos cargar módulos de hardware antiguo que no se detectaba automáticamente, por ejemplo placas sintonizadoras analógicas de radio FM o TV, y evitarle al usuario tener que escalar sus priviegios al de Conductor (o root) para hacerlo, con la incomodidad que ello significa y sobre todo, con el riesgo añadido a la seguridad intrínseca de nuestro sistema computado.

Pues bien, si ejecutamos una distribución de GNU con Linux que emplea el nuevo esquema Systemd para demonios de sistema (usualmente las más modernas), podríamos encontrarnos que el archivo clásico /etc/rc.local no se ejecuta ya durante el arranque de sistema.

Si tipeamos el siguiente comando en la terminal

sudo systemctl status rc-local

...el sistema podría devolvernos lo siguiente:


rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabl
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: failed (Result: exit-code) since Fri 2018-05-11 09:55:51 -03; 10h ago

 Process: 1001 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)
may 11 09:55:51 cgt systemd[1]: Starting /etc/rc.local Compatibility...
may 11 09:55:51 cgt systemd[1]: rc-local.service: Control process exited, code=exited
may 11 09:55:51 cgt systemd[1]: rc-local.service: Failed with result 'exit-code'.
may 11 09:55:51 cgt systemd[1]: Failed to start /etc/rc.local Compatibility.
may 11 20:23:06 cgt systemd[1]: /etc/systemd/system/rc-local.service:11: Support for o
may 11 20:23:37 cgt systemd[1]: /etc/systemd/system/rc-local.service:11: Support for o
may 11 20:24:21 cgt systemd[1]: /etc/systemd/system/rc-local.service:11: Support for o


...lo cual nos indica que rc.local no está activo, y si intentamos activar /etc/rc.local para que se ejecute al inicio del sistema con el comando:

sudo systemctl enable rc-local

...podríamos obtener:

The unit files have no [Install] section. They are not meant to be enabled
 using systemctl.
 Possible reasons for having this kind of units are:
 1) A unit may be statically enabled by being symlinked from another unit's
 .wants/ or .requires/ directory.
 2) A unit's purpose may be to act as a helper for some other unit which has
 a requirement dependency on it.
 3) A unit may be started when needed via activation (socket, path, timer,
 D-Bus, udev, scripted systemctl call, ...).

Como vemos arriba, el archivo pertinente rc-local.service no tiene una sección [Install]. Como tal, Systemd no podrá activarla.

En vista de este problema, os explicaré de forma Justicialista cómo activar la ejecución de scripts desde /etc/rc.local al arranque del sistema.

Primero necesitamos crear un archivo. Lo haremos con el siguiente Comando de Organización:

sudo nano /etc/systemd/system/rc-local.service

Tras ingresar nuestra contraseña de Conductor, se utilizará el editor GNI Nano para crear dicho archivo, en blanco. Debemos pegarle el siguiente texto:

[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target


Lo grabamos con Ctrl+o y salimos del editor con Ctrl+x. Cuando regresemos a al prompt, debemos aseguramos que el archivo /etc/rc.local sea ejecutable, ingresando ahora en la terminal este comando:

sudo chmod +x /etc/rc.local

Conforme /etc/rc.local tenga la capacidad de ejecutarse, debemos activar el servicio que lo dispare al momento del arranque del sistema. Ahora esto se hace con:

sudo systemctl enable rc-local

Esto no nos devolverá nada en Ubuntu, aunque en otras distribuciones podría devolver:

Created symlink from /etc/systemd/system/multi-user.target.wants/rc-local.service to /etc/systemd/system/rc-local.service.

Ahora iniciamos el servicio con:

sudo systemctl start rc-local.service

...y revisamos su status con:

sudo systemctl status rc-local.service

Debería devolvernos algo como:


 ● rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabl
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (exited) since Fri 2018-05-11 20:25:16 -03; 10s ago
  Process: 14573 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)

may 11 20:25:16 cgt systemd[1]: Starting /etc/rc.local Compatibility...
may 11 20:25:16 cgt sudo[14576]:     root : TTY=unknown ; PWD=/dev/input ; USER=root ;
may 11 20:25:16 cgt sudo[14576]: pam_unix(sudo:session): session opened for user root
may 11 20:25:16 cgt sudo[14576]: pam_unix(sudo:session): session closed for user root
may 11 20:25:16 cgt systemd[1]: Started /etc/rc.local Compatibility.



Denotando ahora la ejecución y activación del viejo y veterano esquema rc.local, para felicidad del Pueblo y de los programas o esquemas que lo pudieran necesitar.

No hay comentarios:

Publicar un comentario