systemd non esegue /etc/rc.local?


11

Sto usando Archlinux e ho iniziato a provare systemd in questi giorni.

Tuttavia, ho scoperto che systemd non carica il mio script /etc/rc.local.

Come accennato nella pagina Wiki, ho corso systemctl enable rc-local.service, ma questo non ha aiutato.

Il contenuto del mio file /etc/rc.local è:

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

Eventuali suggerimenti?

Risposte:


15

Arch potrebbe non aver incluso il file dell'unità di servizio necessario per l'esecuzione rc.local.

Basta creare un file /etc/systemd/system/rc-local.servicecon i seguenti contenuti (copiato letteralmente dal mio sistema Fedora):

# Questo file fa parte di systemd.
#
# systemd è un software libero; puoi ridistribuirlo e / o modificarlo
# secondo i termini della GNU General Public License come pubblicato da
# la Free Software Foundation; o versione 2 della Licenza, oppure
# (a tua scelta) qualsiasi versione successiva.

[Unità]
Descrizione = / etc / rc.local Compatibilità
ConditionPathExists = / etc / rc.local

[Servizio]
Tipo = forking
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = tty
RemainAfterExit = yes
SysVStartPriority = 99

Quindi, esegui systemctl enable rc-local.servicecome root per abilitarlo. Puoi anche testarlo / eseguirlo ora eseguendo systemctl start rc-local.service.


Questi due file esistono già: /etc/systemd/system/multi-user.target.wants/rc-local.servicee /lib/systemd/system/rc-local.service
Felix Yan il

2
Probabilmente è disabilitato allora. Prova a correre systemctl enable rc-local.service. Se continui ad avere problemi, pubblica l'output di systemctl status rc-local.service.
Patch del

5
Non è possibile emettere "abilita" sull'unità che non ha la sezione Installa, questo esempio forse non funzionerà.
lzap,

1
D'altra parte, il file (si spera un collegamento) multi-user.target.wantsè esattamente ciò che lo abilita .
Pavel Šimerda,

28

Con systemd 188-2, systemd si lamenta di non avere una [Install]sezione e di non essere in grado di abilitare il servizio rc.local. Potrebbe essere stato il caso delle versioni precedenti, ma dal momento che gli sviluppatori Arch solo recentemente annunciato systemd diventerà l'impostazione predefinita, sto sistemando il mio sistema.

Per risolvere il problema, aggiungi una sezione per il target multiutente in /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 lo /etc/rc.localscript e rendilo eseguibile conchmod +x /etc/rc.local


1
Questo perché rc-local.servicenon è mai stato un servizio abilitato tramite systemctl enablema dal 2011 è stato un servizio abilitato automaticamente da un generatore . Tuttavia Arch Linux, come spiegato in unix.stackexchange.com/a/471871/5132 , non attiva le opzioni di compatibilità con le versioni precedenti in systemd che forniscono il generatore in primo luogo.
JdeBP,


2

Non dimenticare di rendere eseguibile rc.local - altrimenti il ​​livello di compatibilità non lo eseguirà! Negli esempi sopra elencati che sono elencati - eseguiresti chmod a + x per rendere eseguibile il file rc.local. Come segue:

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

Penserei che un altro possibile problema sia la posizione del tuo script rc.local! Se non hai già aggiunto la compatibilità a systemd (che dovrebbe essere integrato - e sembra essere già menzionato in precedenza) potrebbe essere necessario ricontrollare la posizione dei tuoi file ... Sul mio sistema operativo ho rc-local su /etc/rc.d/rc.local quindi ho eseguito il seguente:

$ 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

4
È inutile rendere systemdeseguibile il file di servizio, come mostrato nel primo frammento di codice. Inoltre, su Arch Linux, il percorso del file è /etc/rc.local: forse il contenuto del systemdfile di servizio non è corretto.
RavuAlHemio,

1

Due gotcha comuni:

  1. Non dimenticare di rendere /etc/rc.d/rc.localeseguibile. Puoi usare

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

    per renderlo eseguibile.

  2. Non dimenticare di mettere una #!/bin/shriga nella prima riga di /etc/rc.d/rc.local. Ecco come dovrebbero apparire le cose:

    #  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
    

    Se non ottieni un output simile, modifica /etc/rc.d/rc.localper aggiungere una riga in alto contenente solo #!/bin/sh.


1

Se hai /etc/rc.localcome file eseguibile, verrà inserito nel processo di avvio da systemd-rc-local-generator/ rc-local.service.

Almeno /etc/rc.localè il percorso predefinito che utilizza, ma questo è impostato dalla distribuzione. Perché è principalmente per la compatibilità con le versioni precedenti e diverse distribuzioni stavano utilizzando percorsi diversi. Ad esempio su Fedora, il percorso è /etc/rc.d/rc.local. Puoi controllare il percorso come segue:

$ 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

Sembra che questo non sia molto noto. Esistono diversi post che mostrano una versione precedente del file, che non ha tale commento.


1
Questo non è in realtà vero. Come spiegato su unix.stackexchange.com/a/471871/5132 , Arch non utilizza i meccanismi di compatibilità con le versioni precedenti e non dispone di questo generatore.
JdeBP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.