Cel i typowe użycie /etc/rc.local

73

Nagłówek wygląda następująco:

#!/bin/sh -e
#
# rc.local - executed at the end of each multiuser runlevel
#
# Make sure that the script will "exit 0" on success or any other
# value on error.

Jaki jest powód tego pliku (nie zawiera dużo) i jakie polecenia zwykle w nim umieszczasz? Co to jest „poziom uruchamiania dla wielu użytkowników”? (Chyba rc„uruchom polecenia”?)

Emanuel Berg
źródło
2
Nie wiem, czy jest to „oficjalny” cel pliku, ale dowiedziałem się, że mogę użyć tego pliku do tego, co powinno się zdarzyć przy starcie, i wymagałbym dostępu superużytkownika, ale bez podawania hasła. Zwykle dotyczy to kolorów, klawiatury i innych podobnych rzeczy. Sprawdź kilka przykładów tutaj .
Emanuel Berg

Odpowiedzi:

66

Poziom pracy jest stan systemu, ze wskazaniem, czy jest on w trakcie uruchamiania lub restartowania lub wyłączania lub w trybie pojedynczego użytkownika, czy działa normalnie. Tradycyjny program init obsługuje te akcje, przełączając się na odpowiedni poziom działania. W systemie Linux poziomy uruchamiania zgodne z konwencją :

  • S podczas uruchamiania,
  • 0 podczas zamykania,
  • 6 podczas ponownego uruchamiania,
  • 1 w trybie pojedynczego użytkownika oraz
  • 2 do 5 podczas normalnej pracy.

Poziomy pracy od 2 do 5 są znane jako poziomy pracy dla wielu użytkowników, ponieważ pozwalają na zalogowanie się wielu użytkownikom, w przeciwieństwie do poziomu pracy 1, który jest przeznaczony tylko dla administratora systemu.

Kiedy zmienia się poziom działania, init uruchamia skrypty rc (w systemach z tradycyjnym init - istnieją alternatywy, takie jak Upstart i Systemd ). Te skrypty rc zwykle uruchamiają i zatrzymują usługi systemowe i są dostarczane przez dystrybucję.

Skrypt /etc/rc.localjest przeznaczony do użytku przez administratora systemu. Jest to tradycyjnie wykonywane po uruchomieniu wszystkich normalnych usług systemowych, pod koniec procesu przełączania na poziom uruchamiania dla wielu użytkowników. Możesz go użyć do uruchomienia usługi niestandardowej, na przykład zainstalowanego serwera /usr/local. Większość instalacji nie potrzebuje /etc/rc.local, jest przewidziana w mniejszości przypadków, w których jest potrzebna.

Gilles
źródło
2
Dowiedziałem się dzisiaj, że na obecnym FreeBSD rc.local może zostać wykonany dość wcześnie. Zdecydowanie nie po uruchomieniu wszystkich normalnych usług systemowych. Chciałem usłyszeć sygnał dźwiękowy, gdy stanie się dostępny dostęp sshd do maszyny bezgłowej, i rc.localnie nadawałem się z tego powodu. Ponieważ oryginalne pytanie dotyczy Debiana, ten komentarz jest prawdopodobnie nieistotny dla OP.
MvG,
1
@MvG Dzięki za informację. rc.localbył tradycyjnie uruchamiany jako ostatni, ale widzę, że FreeBSD przestał to robić po przejściu na system oparty na zależnościach. Pamiętaj, że nawet jeśli rc.localzostanie wywołany później /etc/rc.d/sshd, nie zadziała to idealnie: rc.localzostanie wywołany wkrótce po rozpoczęciu sshdprocesu, można go wywołać, zanim sshdzacznie słuchać sieci (ale rozmawiamy o dziesiątych części sekundy w najczęściej w typowej konfiguracji).
Gilles
Próbuję go użyć do skonfigurowania sieci dla kontenerów LXC i automatycznego ich uruchomienia. Ale potem się kończy iptables-apply /root/iptables. Właśnie zastanawiam się, co jest nie tak (czekam na następny restart). Ale jeśli masz jakieś sugestie, jestem cała w uszach.
x-yuri
1
@ x-yuri To wymaga o wiele więcej informacji niż to, co tu zamieściłeś. Nie wiem nawet, co „to” jest w „to przestaje”. Zadaj nowe pytanie, które wyjaśnia, co zrobiłeś.
Gilles
14

rc oznacza „kontrolę biegu”,

Poziom działania multiuserbyłby zdefiniowany jako poziom dostępności sieci, a zatem połączenia z serwerem mogłyby być nawiązywane za pomocą tych usług zamiast przewodowych połączeń konsoli.

Pamiętaj, że serwerami zarządza zazwyczaj procesor serwisowy (pod różnymi nazwami), który obsługuje połączenia sieciowe, a z kolei działa tak, jakbyś miał konsolę przewodową.

Jeśli chodzi o rc.localplik, jest to wygodna funkcja pozwalająca na określenie wszystkich „lokalnych” (specyficznych dla witryny) obiektów (demonów i / lub skryptów uruchamianych przy rozruchu), które chcesz uruchomić. Możesz użyć tego paradygmatu lub właściwie wypełnić /etc/init.d odpowiednio skryptami start / stop.

JRFerguson
źródło
1
Okej, ale dlaczego plik tam jest i kiedy go zwykle używasz i jak (na przykład, jakie polecenia warto w nim umieścić)?
Emanuel Berg
4

Używam go głównie do dwóch rzeczy:

  1. aby zapisać datę i wersję jądra każdego ponownego uruchomienia. prosty jednowarstwowy, który można łatwo dodać do systemu bez konieczności grzebania się w nim ... i znacznie mniej podatny na uszkodzenie historii uruchamiania niż uruchomienie uptimed.

  2. aby ożywić stary katalog /etc/rc.boot/, który był w Debianie jeszcze kilka lat temu. Wciąż mam tam kilka prostych skryptów, które nie są warte przepisywania jako skrypt init.d (np. Skrypt Q&D do wysyłania dmesg do roota, a inny do używania hdaparm do wyłączania bezczynnego spindown i blockdev do ustawiania read- rozmiar z wyprzedzeniem) i cieszę się, że mogą być uruchamiane po wszystkich innych skryptach uruchamiających się podczas uruchamiania.

na przykład

echo "$(date +%s),$(date),$(uname -a)"  >> /var/log/reboot.log

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot

Ponadto napisałem /etc/rc.local skrypty dla dystrybucji centos i debian, aby uzyskać metadane w stylu ec2 z openstack (on http://169.254.169.254/), aby maszyny wirtualne otrzymywały swoje IP, nazwę hosta, klucze ssh i inne informacje specyficzne dla instancji . cloud-init został już przeniesiony do tych dystrybucji, więc skrypty są już przestarzałe.

cas
źródło
3

rc.localPlik na Debianie jest głównie pod kątem zgodności z systemami typu non-startowych. Nie powinieneś go używać.

Zamiast tego zaleca się skopiowanie /etc/init.d/Skeletondo nowego skryptu inicjującego w celu zmiany tego, co ma się zdarzyć podczas zmiany poziomów uruchamiania, a następnie użycie go w inservcelu włączenia.


Aktualizacja: zgodnie z poniższym komentarzem ta odpowiedź nie jest już zalecana. Jednak ta odpowiedź została opublikowana kilka lat przed wycofaniem szkieletu, a szkielet ten nadal istnieje w Debianie niestabilny od stycznia 2019 r.

bahamat
źródło
unix.stackexchange.com/a/480897/5132 /etc/init.d/skeleton to nie jest droga.
JdeBP,