systemd no ejecuta /etc/rc.local?

11

Estoy usando Archlinux y comencé a probar systemd en estos días.

Sin embargo, descubrí que systemd no carga mi script /etc/rc.local.

Como se mencionó en la página Wiki, corrí systemctl enable rc-local.service, pero esto no ayudó.

El contenido de mi archivo /etc/rc.local es:

echo -n 120 > /sys/devices/platform/i8042/serio1/speed
echo -n 250 > /sys/devices/platform/i8042/serio1/sensitivity
iptables --table nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

¿Alguna sugerencia?

Felix Yan
fuente

Respuestas:

16

Arch podría no haber incluido el archivo de unidad de servicio necesario para ejecutar rc.local.

Simplemente cree un archivo /etc/systemd/system/rc-local.servicecon el siguiente contenido (copiado textualmente de mi sistema systemdora Fedora):

# Este archivo es parte de systemd.
# #
# systemd es software libre; puedes redistribuirlo y / o modificarlo
# bajo los términos de la Licencia Pública General de GNU publicada por
# la Fundación para el Software Libre; ya sea la versión 2 de la Licencia, o
# (a su elección) cualquier versión posterior.

[Unidad]
Descripción = / etc / rc. Compatibilidad local
ConditionPathExists = / etc / rc.local

[Servicio]
Tipo = bifurcación
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = tty
RemainAfterExit = yes
SysVStartPriority = 99

Luego, solo ejecuta systemctl enable rc-local.servicecomo root para habilitarlo. También puede probarlo / ejecutarlo ahora ejecutándolo systemctl start rc-local.service.

Parches
fuente
Estos dos archivos ya existen: /etc/systemd/system/multi-user.target.wants/rc-local.servicey /lib/systemd/system/rc-local.service
Felix Yan
2
Probablemente esté deshabilitado entonces. Intenta correr systemctl enable rc-local.service. Si continúa teniendo problemas, publique el resultado de systemctl status rc-local.service.
Parches
55
No puede emitir "enable" en la unidad que no tiene una sección de instalación, este ejemplo quizás no funcione
lzap
1
Por otro lado, el archivo (con suerte un enlace) en multi-user.target.wantses exactamente lo que lo habilita .
Pavel Šimerda
28

Con systemd 188-2, systemd se queja de no tener una [Install]sección y, como tal, no puede habilitar el servicio rc.local. Podría haber sido el caso con versiones anteriores, pero desde que los desarrolladores de Arch anunciaron recientemente que systemd se convertirá en el predeterminado, estoy arreglando mi sistema.

Para solucionarlo, solo agregue una sección para el objetivo multiusuario en /etc/systemd/system/rc-local.service:

[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

Crea el /etc/rc.localscript y hazlo ejecutable conchmod +x /etc/rc.local

Borromini
fuente
1
Esto se debe a que rc-local.servicenunca fue un servicio habilitado a través de, systemctl enablepero desde 2011 ha sido un servicio habilitado automáticamente por un generador . Sin embargo, Arch Linux, como se explica en unix.stackexchange.com/a/471871/5132 , no activa las opciones de compatibilidad con versiones anteriores en systemd que proporcionan el generador en primer lugar.
JdeBP
2

No olvide hacer que rc.local sea ejecutable, ¡o la capa de compatibilidad no lo ejecutará! En los ejemplos anteriores que se enumeran, ejecutaría chmod a + x para hacer que el archivo rc.local sea ejecutable. Como sigue:

$ chmod a+X /etc/systemd/system/rc-local.service 

¡Creo que otro posible problema es la ubicación de su script rc.local! Si aún no ha agregado la compatibilidad a systemd (que debería estar integrada, y parece ser por una mención anterior de que ya existe), es posible que deba verificar la ubicación de sus archivos ... En mi sistema operativo tengo rc-local en /etc/rc.d/rc.local, así que ejecuté lo siguiente:

$ sudo chmod a+x /etc/rc.d/rc.local
$ sudo systemctl restart rc-local.service
$ sudo systemctl status rc-local.service
rc-local.service - /etc/rc.d/rc.local Compatibility
      Loaded: loaded (/lib/systemd/system/rc-local.service; static)
      Active: active (exited) since Fri, 13 Apr 2012 14:42:39 -0600; 3s ago
     Process: 2285 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/rc-local.service
Rio1
fuente
44
No tiene sentido hacer que el systemdarchivo de servicio sea ejecutable, como se muestra en su primer fragmento de código. Además, en Arch Linux, la ruta del archivo es /etc/rc.local, quizás el contenido del systemdarchivo de servicio es incorrecto.
RavuAlHemio
1

Dos trampas comunes:

  1. No te olvides de hacer /etc/rc.d/rc.localejecutable. Puedes usar

    # chmod a+rx /etc/rc.d/rc.local
    

    para hacerlo ejecutable.

  2. No olvides poner una #!/bin/shlínea en la primera línea de /etc/rc.d/rc.local. Así es como deberían verse las cosas:

    #  head -1 /etc/rc.d/rc.local 
    #!/bin/sh
    # file /etc/rc.d/rc.local 
    /etc/rc.d/rc.local: POSIX shell script, ASCII text executable
    

    Si no obtiene un resultado similar, edite /etc/rc.d/rc.localpara agregar una línea en la parte superior que contenga solo #!/bin/sh.

DW
fuente
1

Si tiene /etc/rc.localun archivo ejecutable, será arrastrado al proceso de arranque por systemd-rc-local-generator/ rc-local.service.

Al menos /etc/rc.locales la ruta predeterminada que utiliza, pero la distribución la establece. Porque es principalmente para la compatibilidad con versiones anteriores, y diferentes distribuciones usaban diferentes rutas. Por ejemplo, en Fedora, el camino es /etc/rc.d/rc.local. Puede verificar la ruta de la siguiente manera:

$ systemctl cat rc-local.service
# /usr/lib/systemd/system/rc-local.service
# ...

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

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

Parece que esto no es muy conocido. Hay varias publicaciones que muestran una versión anterior del archivo, que no tiene ese comentario.

sourcejedi
fuente
1
Esto no es de hecho cierto. Como se explica en unix.stackexchange.com/a/471871/5132 , Arch no utiliza los mecanismos de compatibilidad con versiones anteriores y no tiene este generador.
JdeBP