systemd führt /etc/rc.local nicht aus?

11

Ich benutze Archlinux und habe in diesen Tagen angefangen, systemd auszuprobieren.

Ich habe jedoch festgestellt, dass systemd mein Skript /etc/rc.local nicht lädt.

Wie auf der Wiki-Seite erwähnt, bin ich gelaufen systemctl enable rc-local.service, aber das hat nicht geholfen.

Der Inhalt meiner Datei /etc/rc.local lautet:

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

Irgendwelche Vorschläge?

Felix Yan
quelle

Antworten:

16

Arch hat möglicherweise nicht die zum Ausführen erforderliche Serviceeinheitendatei enthalten rc.local.

Erstellen Sie einfach eine Datei /etc/systemd/system/rc-local.servicemit den folgenden Inhalten (wörtlich von meinem Fedora-System kopiert):

# Diese Datei ist Teil von systemd.
#
# systemd ist freie Software; Sie können es weitergeben und / oder ändern
# unter den Bedingungen der GNU General Public License, veröffentlicht von
# die Free Software Foundation; entweder Version 2 der Lizenz oder
# (nach Ihrer Wahl) jede spätere Version.

[Einheit]
Beschreibung = / etc / rc.local Kompatibilität
ConditionPathExists = / etc / rc.local

[Bedienung]
Typ = Gabelung
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = tty
RemainAfterExit = yes
SysVStartPriority = 99

Führen Sie dann einfach systemctl enable rc-local.serviceals root aus, um es zu aktivieren. Sie können es jetzt auch testen / ausführen, indem Sie es ausführen systemctl start rc-local.service.

Patches
quelle
Diese beiden Dateien existieren bereits: /etc/systemd/system/multi-user.target.wants/rc-local.serviceund /lib/systemd/system/rc-local.service
Felix Yan
2
Es ist dann wahrscheinlich deaktiviert. Versuche zu rennen systemctl enable rc-local.service. Wenn Sie weiterhin Probleme haben, senden Sie bitte die Ausgabe von systemctl status rc-local.service.
Patches
5
Sie können "enable" nicht für Geräte ausgeben, die keinen Installationsabschnitt haben. Dieses Beispiel funktioniert möglicherweise nicht.
lzap
1
Andererseits ist die Datei (hoffentlich ein Link) multi-user.target.wantsgenau das, was sie ermöglicht .
Pavel Šimerda
28

Mit systemd 188-2 beschwert sich systemd darüber, dass kein [Install]Abschnitt vorhanden ist und der rc.local-Dienst daher nicht aktiviert werden kann. Könnte bei früheren Versionen der Fall gewesen sein, aber da Arch-Entwickler erst kürzlich angekündigt haben, dass systemd der Standard sein wird, repariere ich mein System.

Um dies zu beheben, fügen Sie einfach einen Abschnitt für das Mehrbenutzerziel hinzu 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

Erstellen Sie das /etc/rc.localSkript und machen Sie es ausführbar mitchmod +x /etc/rc.local

Borromini
quelle
1
Dies liegt daran, dass rc-local.servicenie ein Dienst über aktiviert wurde, systemctl enablesondern seit 2011 ein Dienst, der von einem Generator automatisch aktiviert wurde . Wie unter unix.stackexchange.com/a/471871/5132 erläutert, aktiviert Arch Linux jedoch nicht die Abwärtskompatibilitätsoptionen in systemd, die den Generator überhaupt erst bereitstellen.
JdeBP
2

Vergessen Sie nicht, rc.local ausführbar zu machen - sonst wird es von der Kompatibilitätsschicht nicht ausgeführt! In den oben aufgeführten Beispielen würden Sie chmod a + x ausführen, um die Datei rc.local ausführbar zu machen. Wie folgt:

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

Ich würde denken, ein weiteres mögliches Problem ist der Speicherort Ihres rc.local-Skripts! Wenn Sie die Kompatibilität zu systemd noch nicht hinzugefügt haben (die eingebaut sein sollte - und anscheinend bereits erwähnt wurde), müssen Sie möglicherweise den Speicherort Ihrer Dateien überprüfen ... Auf meinem Betriebssystem habe ich rc-local Unter /etc/rc.d/rc.local habe ich also Folgendes ausgeführt:

$ 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
quelle
4
Es ist sinnlos, die systemdServicedatei ausführbar zu machen , wie in Ihrem ersten Codefragment gezeigt. Unter Arch Linux lautet der Dateipfad /etc/rc.local- möglicherweise ist der Inhalt der systemdServicedatei falsch.
RavuAlHemio
1

Zwei häufige Fallstricke:

  1. Vergessen Sie nicht, /etc/rc.d/rc.localausführbar zu machen . Sie können verwenden

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

    um es ausführbar zu machen.

  2. Vergessen Sie nicht, eine #!/bin/shZeile in die erste Zeile von zu setzen /etc/rc.d/rc.local. So sollten die Dinge aussehen:

    #  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
    

    Wenn Sie keine ähnliche Ausgabe erhalten, bearbeiten Sie diese /etc/rc.d/rc.local, um ganz oben eine Zeile mit just hinzuzufügen #!/bin/sh.

DW
quelle
1

Wenn Sie /etc/rc.localeine ausführbare Datei haben, wird diese von systemd-rc-local-generator/ in den Startvorgang gezogen rc-local.service.

Zumindest /etc/rc.localist dies der Standardpfad, der jedoch von der Distribution festgelegt wird. Weil es hauptsächlich aus Gründen der Abwärtskompatibilität ist und verschiedene Distributionen unterschiedliche Pfade verwendeten. ZB auf Fedora ist der Weg /etc/rc.d/rc.local. Sie können den Pfad wie folgt überprüfen:

$ 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

Es scheint, dass dies nicht sehr bekannt ist. Es gibt mehrere Beiträge, die eine frühere Version der Datei zeigen, die keinen solchen Kommentar enthält.

sourcejedi
quelle
1
Dies ist in der Tat nicht wahr. Wie unter unix.stackexchange.com/a/471871/5132 erläutert , verwendet Arch die Abwärtskompatibilitätsmechanismen nicht und verfügt nicht über diesen Generator.
JdeBP