Ubuntu Peronista@TTBP

Este es un espejo en el Tilde Blog Project del blog original Ubuntu Peronista. Se encuentra disponible en Tildeverso únicamente con fin histórico.



11 july 2022

¿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 de tener un archivo /etc/rc.local y que el mismo sea ejecutable. Para ello ingresamos:

sudo nano /etc/rc.local

Y le podríamos pegar el siguiente contenido básico:

!/bin/sh -e

#

Archivo /etc/rc.local

Este script se ejecuta al final del runlevel multiusuario.

Asegúrese que este script finalice con la línea "exit 0" si tiene éxito

o en cualquier otro valor si tiene un error.

Ingrese bajo esta línea lo que quiera ejecutar antes de dar inicio a los usuarios.

----- fin del archivo ------

exit 0

Naturalmente podríamos agregar antes de en las líneas previas a exit 0 cualquier comando que necesitemos. Guardamos con Ctrl+o y salimos del editor con Ctrl+x. Ahora en la terminal haremos ejecutable al archivo rc.local con 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.