¿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.