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