Ejecutar un comando durante el arranque de la máquina

per Victor Carceler darrera modificació 2022-05-19T15:52:08+01:00

VirtualBox_Gateway_19_05_2022_13_15_29.pngEn las distribuciones de GNU/Linux actuales el arranque está controlado por systemd, pero antes de su desarrollo se utilizaba mayormente el estilo de arranque de System V con sus niveles de ejecución. Todo ese mundo antiguo ha sido reemplazado por systemd que ofrece múltiples ventajas y características nuevas pero aún queda un vestigio del pasado que resulta muy práctico.

El fichero /etc/rc.local

En el antiguo estilo de arranque de System V el fichero /etc/rc.local era un script que se ejecutaba al completarse el arranque.

Por ejemplo un fichero /etc/rc.local en el que se activa el NAT en una interfaz de red puede ser:

#!/bin/bash

iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

exit 0

Así el administrador podía escribir allí los comando que quería que se ejecutasen automáticamente una vez que la máquina hubiera arrancado.

Compatibilidad de systemd: rc-local.service

Esta función tan práctica no tiene equivalente directo en el mundo de systemd, pero systemd-rc-local-generator se encarga de proporcionar compatibilidad con el antiguo fichero /etc/rc.local.

Cuando arrancamos con systemd se comprueban dos condiciones:

  • Que exista el fichero /etc/rc.local.
  • Que sea un fichero ejecutable.

Si se cumplen estas condiciones se generará la unidad rc-local.service que ejecutará el script cuando se alcance network.target(en paralelo con el resto de unidades).

Así es suficiente con crear el fichero /etc/rc.local con permiso de ejecución y escribir en su interior para tener un comportamiento similar al sistema antiguo.

Como ejemplo, en Ubuntu 22.04 la unidad rc-local.service generada contiene:

[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

La página de manual de systemd-rc-local-generator nos advierte de que esta es una función de compatibilidad con el sistema tradicional y no una manera de lanzar servicios. Para lanzar servicios será necesario crear la unidad que los controla.