Jaka jest różnica między tymi poleceniami wyłączania serwera Linux?


65

Czytanie „Jaka jest różnica między poleceniami Zatrzymaj i Zamknij?” , Ogólnie mam pojęcie, co robi zamknięcie polecenia, z opcjami -h / -r lub bez nich.

Polecenie „halt” wyłącza system do poziomu 0 systemu.

Komenda „shutdown” wyłącza system z poziomu 1 bez komendy -h lub -r.

Co z poleceniem „poweroff”, czy przechodzi ono na poziom 0 lub 1? Czy to jedyna główna różnica między tymi trzema poleceniami?



Jest to kilka rzeczy, które różnią się znacznie dla np. Solaris i FreeBSD. (Tam zwykle (prawie) natychmiast zatrzymują / zamykają serwer, nie zmieniając poziomów uruchamiania, aby najpierw wyłączyć rzeczy)
Gert van den Berg

Odpowiedzi:


120

A teraz systemowa odpowiedź.

Używasz, zgodnie ze znacznikiem na swoim pytaniu, Red Hat Enterprise Linux. Od wersji 7 używano systemd. Żadna z pozostałych odpowiedzi nie jest poprawna dla świata systemd; ani nawet niektóre z założeń w twoim pytaniu.

  • Zapomnij o poziomach pracy ; istnieją, ale tylko jako podkładki kompatybilności. Systemowa dokumentacja stwierdza, że ​​koncepcja jest „przestarzała”. Jeśli zaczynasz uczyć się tego na systemowym systemie operacyjnym, nie zaczynaj.
  • Zapomnij o stronie podręcznika, którą zacytował marcelm; wcale nie pochodzi z odpowiedniego zestawu narzędzi i jest opisem polecenia innego zestawu narzędzi, niepoprawnym dla polecenia systemd. Jest to haltpolecenie dla narzędzi van Smoorenburg „System 5” init.
  • Zignoruj ​​stwierdzenia, które /sbin/haltsą dowiązaniem symbolicznym /sbin/reboot; to nie jest prawda z systemd. W ogóle nie ma osobnego rebootprogramu.
  • Zignoruj ​​instrukcje, które haltlub rebootwywołują shutdownprogram z argumentami wiersza poleceń; nie są one również zgodne z systemd. W ogóle nie ma osobnego shutdownprogramu.

Każdy zestaw narzędzi do zarządzania systemem ma swoją wersję tych narzędzi. Systemd, dorobkiewicz, nosh , van Smoorenburg initi BSD initmają swoje własne halt, poweroffi tak dalej. Na każdym mechanika jest nieco inna. Podobnie jak ich strony podręcznika.

W Systemd zestawu narzędzi halt, poweroff,reboot , telinit, i shutdownwszystkie linki symboliczne /bin/systemctl. Są wszystkie podkładki wstecznej kompatybilności, które są po prostu dla shorthands powołując interfejs wiersza poleceń podstawową Systemd za: systemctl. Wszystkie mapują na (i tak naprawdę są) ten sam pojedynczy program. (Zgodnie z konwencją powłoka informuje ją o nazwie, do której została wywołana).

cele, a nie poziomy pracy

Większość tych poleceń jest skrótem do informowania systemd, za pomocą systemctl, do izolowania określonego celu . Izolacja jest wyjaśniona na systemctlstronie podręcznika (qv), ale dla celów tej odpowiedzi może być uważana za rozpoczęcie celu i powstrzymanie innych. Standardowe cele używane w systemd są wymienione na stronie systemd.special(8) podręcznika.

Schematy na bootup(7) stronie podręcznika w zestawach narzędzi systemowych, w szczególności ten ostatni, pokazują, że istnieją trzy „ostateczne” cele, które są tutaj istotne:

  • halt.target- Gdy system osiągnie stan pełnej izolacji tego celu, wywoła reboot(RB_HALT_SYSTEM)wywołanie systemowe. Jądro będzie próbowało wejść do programu monitorującego ROM lub po prostu zatrzymało procesor (używając odpowiedniego do tego mechanizmu).
  • reboot.target- Gdy system osiągnie stan pełnej izolacji tego celu, wywoła reboot(RB_AUTOBOOT)wywołanie systemowe (lub odpowiednik magicznej linii poleceń). Jądro podejmie próbę ponownego uruchomienia komputera.
  • poweroff.target- Gdy system osiągnie stan pełnej izolacji tego celu, wywoła reboot(RB_POWER_OFF)wywołanie systemowe. Jądro będzie próbowało usunąć zasilanie z systemu, jeśli to możliwe.

to rzeczy, o których powinieneś myśleć, jak stwierdza końcowy system, a nie poziomy uruchamiania. Zauważ z diagramu, że systemowy system docelowy sam koduje rzeczy, które w innych systemach są raczej niejawne, a nie jawne: na przykład pojęcie, że każdy z tych ostatecznych celów obejmuje shutdown.targetcel, tak że opisuje się usługi, które muszą zostać zatrzymane przed zamknięciem przez po nich sprzeczne z tym shutdown.targetcelem.

systemctlpróbuje wysłać żądania, systemd-logindgdy użytkownik wywołujący nie jest superużytkownikiem. Przechodzi również opóźnione przestoje do systemd-shutdownd. Niektóre skróty uruchamiają wallpowiadomienia. Pomijając te złożoności, które spowodowałyby, że ta odpowiedź byłaby kilka razy dłuższa, zakładając, że jesteś obecnie superużytkownikiem i nie żądasz zaplanowanej akcji:

  • systemctl isolate halt.target ma skróty:
    • shutdown -H now
    • systemctl halt
    • zwykły bez ozdoby halt
  • systemctl isolate reboot.target ma skróty:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • zwykły bez ozdoby reboot
  • systemctl isolate poweroff.target ma skróty:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • zwykły bez ozdoby poweroff
  • systemctl isolate rescue.target ma skróty:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target ma skróty:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target ma skrót:
    • telinit 5

Po przeanalizowaniu różnych składni wiersza poleceń, wszystkie ostatecznie kończą się tymi samymi ścieżkami kodu w systemctlprogramie.

Uwagi:

  • Tradycyjne zachowanie bez opcji polegało shutdown nowna przełączeniu do trybu pojedynczego użytkownika . Nie jest tak w przypadku systemd. rescue.target- zmiana nazwy trybu pojedynczego użytkownika na tryb ratunkowy w systemie - nie jest osiągalna za pomocą shutdownpolecenia.
  • telinit naprawdę całkowicie ignoruje wszystkie te i dowiązania symboliczne w systemie plików, które opisują strony podręcznika. Powyższe odwzorowania są wbudowane w program, w formie tabeli.runlevelN.targetdefault.targetsystemctl
  • systemd nie ma pojęcia o bieżącym poziomie uruchamiania . Działanie tych poleceń nie jest uzależnione od żadnego „jeśli jesteś na poziomie uruchomienia N ”.
  • --forceOpcja do halt, rebooti poweroffpolecenia jest taki sam, jak mówią --force --forcedo systemctl halt, systemctl rebooti systemctl poweroffpoleceń. To sprawia, że systemctlspróbuj zadzwonić reboot()bezpośrednio. Zwykle po prostu próbuje izolować cele.
  • telinitto nie to samo co init. Są to różne programy w świecie systemowym, przy czym ta ostatnia jest inną nazwą dla systemdprogramu, a nie dla systemctlprogramu. systemdProgram nie jest koniecznie skompilowany z dowolnego kompatybilności van Smoorenburg w ogóle, a na niektórych systemach operacyjnych Systemd narzeka powołano nieprawidłowo Jeśli jeden prób .init N

Dalsza lektura


1
Jest to bardzo ogólne dla większości współczesnych systemów Linux, więc na przykład odpowiedzi wiert.me/2012/12/30/... Po tylu latach zastanawiania się, wreszcie rozumiem, co się dzieje i dlaczego.
Jeroen Wiert Pluimers

systemctl rebootpowinno być równoważne z systemctl start reboot.target --job-mode=replace-irreversible. Korzystanie z dowolnego innego trybu pracy jest mniej niezawodne. unix.stackexchange.com/questions/381739/…
sourcejedi

1
Przeczytałem całą twoją odpowiedź i pochłonąłem wszystko, co mogłem. Pozostaje jedno pytanie, to samo, po które tu przyszedłem, systemctl rebootczy „bezpieczny” sposób ponownego uruchomienia, np. init 6W jaki sposób moglibyśmy zrestartować komputer w inny sposób?
Brian Thomas

25
  • haltinstruuje sprzęt, aby zatrzymał wszystkie funkcje procesora , ale pozostawia go w stanie włączenia. Zazwyczaj oznacza to, że ktoś musi ponownie uruchomić komputer lub ręcznie wyłączyć urządzenie, naciskając przycisk zasilania później. Konkretny sposób na osiągnięcie tego jest specyficzny dla architektury, ale na przykład zestaw instrukcji x86 zawiera HLTinstrukcje, które zatrzymują centralną jednostkę przetwarzającą (CPU) do momentu uruchomienia następnego zewnętrznego przerwania.

  • poweroffJak halt, zatrzymuje CPU ale również wysyła ACPI sygnał sprzętowy, który poinstruuje system rozpoczyna się od całkowitego i natychmiastowego wyłączenia. Odpowiada to mniej więcej naciśnięciu przycisku zasilania na typowym komputerze stacjonarnym.

Zarówno halti poweroffsą zazwyczaj symboliczne linki do rebootpliku wykonywalnego, który zazwyczaj powołują się shutdownnarzędzia z odpowiednimi argumentami ( -h, -Plub r) w zależności czy halt, powerofflub rebootzostał wykorzystany do wywołania funkcji. Jednak gdy --forceopcja zostanie przekazana do reboot, lub gdy jest na poziomie 0 lub 6, rebootwywoła wywołanie reboot()systemowe z odpowiednim kodem polecenia.


Thomas, dziękuję bardzo za wyjaśnienie. Chcę wiedzieć, co zrobić z #init 0, nie ma zbyt wielu różnic, prawda?
Win.T

@ Win.T Przełączenie na poziom 0 za pomocą np. /sbin/init 0Lub /sbin/telinit 0powinno być takie samo jak zatrzymanie systemu, chociaż określone kroki zależą od systemu inicjującego, takiego jak init System-V , upstart lub systemd . Jeśli korzystasz z RHEL, korzystasz z systemd.
Thomas Nyman

4
Uwaga do siebie: za każdym razem, gdy ktoś narzeka na tajemne wywołanie API Win32, pokaż mu restart (2).
user253751

@immibis Ale ponowne uruchomienie jest celowo tajemne. Wymaga magicznych flag, dlatego bardzo trudno jest to zrobić przypadkowo.
Kevin Cox

4
@KevinCox To jest argument za wymaganiem magicznych flag. Nie jest to argumentem za zaakceptowaniem 4 różnych wartości dla magic2, ani za zachowaniem się inaczej w przestrzeni nazw PID, ani za zrzuceniem kilku ledwo powiązanych operacji (takich jak ustawienie ponownego uruchomienia na Ctrl-Alt-Delete) w jednej funkcji.
użytkownik253751

1

halt, poweroffI shutdown -hsą w pełni równoważne. W rzeczywistości zatrzymanie i wyłączenie zasilania nie robi nic poza połączeniem shutdown -h. Ze strony głównej zatrzymania / wyłączenia:

Jeśli wywoływane jest zatrzymanie lub ponowne uruchomienie, gdy system nie znajduje się na poziomie 0 lub 6, innymi słowy, gdy działa normalnie, zamiast niego zostanie wywołane zamknięcie (z flagą -h lub -r). Więcej informacji znajduje się na stronie zamykania systemu (8).

Zamknij następnie przechodzi do zamykania systemu, przechodząc do poziomu 0.

Zatrzymanie i wyłączenie (i ponowne uruchomienie) pełnią podwójną rolę; wykonywane w trakcie zamykania (tj. na poziomie 0 lub 6) wykonują operacje niskiego poziomu wymagane do fizycznego zatrzymania, wyłączenia zasilania lub ponownego uruchomienia komputera, jak opisano w innej odpowiedzi.


2
Z jakiej wersji RHEL korzystasz? Zwykle istnieje różnica między zatrzymaniem a wyłączeniem (chociaż przez pewien czas nie było tak w wielu dystrybucjach, ale to był błąd).
Bruno,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.