Jak mogę wykonać komendę podczas uruchamiania (rc.local alternative) na Ubuntu 16.10

49

Konfiguruję limit na moim serwerze Linode z systemem Ubuntu 16.10 i pojawia się następujący błąd

Nie można podłączyć urządzenia stat / (dev / root / root): brak takiego pliku lub katalogu

Aby to naprawić, doszedłem do tego wątku w celu naprawy, która jest dodawana

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

do /etc/rc.local. Ale Ubuntu 16.10 już nie używa rc.localzamiast tego używa systemd . Jaka jest alternatywa dla rc.local: Jak uruchomić powyższe polecenia podczas uruchamiania?

Również włączyłem tę usługę, systemctl enable rc-local.serviceale to nie działało dla mnie. Każdy trop byłby mile widziany.

Saurabh Sharma
źródło
czy uruchomiłeś go jako root i czy zrestartowałeś system?
George Udosen
@George tak, zrobiłem oba
Saurabh Sharma
spróbuj tego
George Udosen
@George To też nie działa
Saurabh Sharma
Właśnie zobaczyłem tego hacka, zobaczę, czy leci ...
George Udosen

Odpowiedzi:

65

Wprowadzenie

Myślę, że nie powinieneś tworzyć nowej usługi, jak sugeruje link George. Plik rc-local.servicejuż istnieje w pliku systemd, a plik usługi sugeruje, że rc.localjeśli plik istnieje i jest wykonywalny, zostanie automatycznie wciągniętymulti-user.target . Nie trzeba więc odtwarzać ani wymuszać czegoś, co zostało po prostu zrobione w inny sposób przez systemd-rc-local-generator.

Jedno rozwiązanie

Szybkie obejście (nie wiem, czy to kanoniczny sposób):

W terminalu wykonaj:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

Następnie rc.localzostanie wywołany przy starcie systemu. Wstaw co chcesz.

tło

Jeśli robisz to w terminalu:

sudo systemctl edit --full rc-local

Widać, że komentarz główny zawiera wiersze takie jak:

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

Wskazuje to, że w tym systemie, jeśli istnieje plik o nazwie /etc/rc.localwykonywalnej, zostanie on automatycznie wciągnięty do multi-user.target. Więc po prostu utwórz odpowiedni plik ( sudo touch...) i ustaw go jako wykonywalny ( sudo chmod +x ...).

Jan
źródło
4
Nie używaj #!/bin/bashjednak, używaj, #!/bin/shchyba że naprawdę potrzebujesz bash w skrypcie. Wszystkie inne skrypty systemowe używają myślnika, a nie basha ze względu na wydajność.
spikyjt,
„nie ma potrzeby ponownego tworzenia lub wymuszania czegoś, co zostało właśnie zrobione w inny sposób przez systemd-rc-local-generator” rc-localnie pozwala na zamówienie po innej jednostce, prawda?
x-yuri
20

Zobaczyłem sugerowane rozwiązanie, które obejmuje użycie systemd tutaj :

  1. Utwórz usługę:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Dodaj swój kod:

    [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
    
  3. Utwórz i upewnij się, że /etc/rc.localjest wykonywalny i dodaj do niego ten kod:

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. Włącz usługę:

    sudo systemctl enable rc-local
    
  5. Uruchom usługę i sprawdź status:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Jeśli wszystko pójdzie dobrze, możesz dodać plik codedo /etc/rc.localpliku, a następnie uruchomić go ponownie.

Uwaga: Testowano na Lubuntu 16.10.

Źródło:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

George Udosen
źródło
Zrobiłem wszystkie kroki. Mam rc.local z: touch "hello"przed exit 0. Usługa wydaje się być aktywna, ale nie tworzy żadnego pliku w / etc / dir. Działa na Ubuntu 16.04 Arabian 5.31
Danny182
Jak wskazuje odpowiedź @Jan, utworzenie zupełnie nowej usługi nie jest konieczne, ponieważ systemd już obsługuje rc.local.
TommyPeanuts
Dziękuję wamuuuuuuuuuuuuuuuuuuu, to po prostu działa
GPrathap
2

Aby dodać do odpowiedzi Jana, że w przeciwieństwie do zwykłego rc.localpliku, rc-local servicejest wykonywany nie po uruchomieniu wszystkich usług, ale po przejściu sieci do trybu online.

W niektórych przypadkach możesz chcieć uruchomić polecenia rc.localpóźniej. Na przykład chciałem, aby został wykonany po lxduruchomieniu.

W takim przypadku możesz edytować rc-local servicezależności uruchamiania, tworząc plik conf-in conf: /etc/systemd/system/rc-local.service.d/override.conf z zawartością:

[Unit]
After=network.target lxd.service

Gdzie możesz dodać potrzebną nazwę jednostki (jak dodałem lxd.service)

Nie zapomnij systemctl daemon-reloadpóźniej.

użytkownik2586441
źródło
Witamy w Ask Ubuntu! Jeśli chcesz poprawić inną odpowiedź, zasugeruj jej zmianę. Jeśli chcesz przedstawić częściową alternatywę, powtórz lub przytocz części, które są takie same (w przypadku zmiany oryginalnej odpowiedzi) i zaznacz różnice. W każdym razie nie twórz nowej niekompletnej odpowiedzi! Dziękuję Ci.
David Foerster,