systemd nie działa /etc/rc.local?

12

Używam Archlinuxa i zacząłem próbować systemd w tych dniach.

Odkryłem jednak, że systemd nie ładuje mojego skryptu /etc/rc.local.

Jak wspomniano na stronie Wiki, uruchomiłem systemctl enable rc-local.service, ale to nie pomogło.

Zawartość mojego pliku /etc/rc.local to:

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

Jakieś sugestie?

Felix Yan
źródło

Odpowiedzi:

16

Arch mógł nie zawierać pliku jednostki serwisowej niezbędnego do uruchomienia rc.local.

Wystarczy utworzyć plik /etc/systemd/system/rc-local.servicez następującą zawartością (skopiowany dosłownie z mojego systemu systemowego Fedory):

# Ten plik jest częścią systemd.
#
# systemd to darmowe oprogramowanie; możesz go redystrybuować i / lub modyfikować
# zgodnie z warunkami Powszechnej Licencji Publicznej GNU opublikowanej przez
# Fundacja Wolnego Oprogramowania; albo wersja 2 licencji, albo
# (do wyboru) dowolna późniejsza wersja.

[Jednostka]
Opis = / etc / rc.local Kompatybilność
ConditionPathExists = / etc / rc.local

[Usługa]
Typ = rozwidlanie
ExecStart = / etc / rc.local start
TimeoutSec = 0
StandardOutput = tty
RemainAfterExit = tak
SysVStartPriority = 99

Następnie po prostu uruchom systemctl enable rc-local.servicejako root, aby go włączyć. Możesz go również przetestować / uruchomić teraz, uruchamiając systemctl start rc-local.service.

Łatki
źródło
Te dwa pliki już istnieją: /etc/systemd/system/multi-user.target.wants/rc-local.servicei /lib/systemd/system/rc-local.service
Felix Yan
2
Prawdopodobnie jest wtedy wyłączony. Spróbuj uruchomić systemctl enable rc-local.service. Jeśli nadal masz problemy, opublikuj wynik systemctl status rc-local.service.
Łaty
5
Nie można wydać polecenia „włącz” na urządzeniu, które nie ma sekcji instalacji, ten przykład może nie działać.
lzap
1
Z drugiej strony, plik (mam nadzieję, że link) multi-user.target.wantsjest dokładnie tym, co umożliwia .
Pavel Šimerda
28

W przypadku systemd 188-2 systemd narzeka na brak [Install]sekcji i jako taki nie może włączyć usługi rc.local. Możliwe, że tak było w przypadku wcześniejszych wersji, ale ponieważ Arch Devs niedawno ogłosił, że systemd stanie się domyślnym, naprawiam mój system.

Aby to naprawić, po prostu dodaj sekcję dla celu dla wielu użytkowników w /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

Utwórz /etc/rc.localskrypt i wykonaj go za pomocąchmod +x /etc/rc.local

Borromini
źródło
1
Jest tak, ponieważ rc-local.servicenigdy nie była usługą, która była włączana za pośrednictwem, systemctl enableale od 2011 r. Jest usługą włączaną automatycznie przez generator . Jednak Arch Linux, jak wyjaśniono na stronie unix.stackexchange.com/a/471871/5132 , nie włącza opcji kompatybilności wstecznej w systemie, które zapewniają generator w pierwszej kolejności.
JdeBP
2

Nie zapomnij, aby plik rc.local był wykonywalny - inaczej warstwa zgodności go nie uruchomi! W powyższych przykładach, które są wymienione - uruchomiłbyś chmod a + x, aby plik rc.local był wykonywalny. Następująco:

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

Myślę, że innym możliwym problemem jest lokalizacja twojego skryptu rc.local! Jeśli nie dodałeś jeszcze kompatybilności do systemd (która powinna być wbudowana - i wydaje się, że była wcześniej wspomniana, że ​​już istnieje), może być konieczne dwukrotne sprawdzenie lokalizacji plików ... W moim systemie operacyjnym mam rc-local w /etc/rc.d/rc.local, więc uruchomiłem następujące:

$ 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
źródło
4
Nie ma sensu, aby systemdplik usługi był wykonywalny, jak pokazano w pierwszym fragmencie kodu. Również w Arch Linux ścieżka do pliku jest /etc/rc.local- być może zawartość systemdpliku usługi jest nieprawidłowa.
RavuAlHemio
1

Dwie wspólne gotcha:

  1. Nie zapomnij zrobić /etc/rc.d/rc.localpliku wykonywalnego. Możesz użyć

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

    aby był wykonywalny.

  2. Nie zapomnij umieścić #!/bin/shlinii w pierwszej linii /etc/rc.d/rc.local. Oto jak powinno wyglądać:

    #  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
    

    Jeśli nie otrzymujesz podobnych wyników, edytuj, /etc/rc.d/rc.localaby dodać wiersz na samej górze zawierający just #!/bin/sh.

DW
źródło
1

Jeśli masz /etc/rc.localplik wykonywalny, zostanie on pobrany do procesu rozruchu przez systemd-rc-local-generator/ rc-local.service.

Przynajmniej /etc/rc.localjest domyślną ścieżką, której używa, ale jest to ustalane przez rozkład. Ponieważ chodzi głównie o kompatybilność wsteczną, a różne dystrybucje używały różnych ścieżek. Np. W Fedorze ścieżka jest /etc/rc.d/rc.local. Możesz sprawdzić ścieżkę w następujący sposób:

$ 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

Wydaje się, że nie jest to zbyt dobrze znane. Istnieje kilka postów, które pokazują poprzednią wersję pliku, która nie ma takiego komentarza.

sourcejedi
źródło
1
To nie jest prawda. Jak wyjaśniono na stronie unix.stackexchange.com/a/471871/5132 , Arch nie korzysta z mechanizmów zgodności wstecznej i nie ma tego generatora.
JdeBP