Qual è la differenza tra questi comandi per far cadere un server Linux?


65

Lettura "Qual è la differenza tra i comandi Halt e Shutdown?" , Generalmente ho un'idea di cosa fa il comando shutdown, con o senza le opzioni -h / -r.

Il comando "halt" esegue lo spegnimento del sistema al livello di esecuzione 0 del sistema.

Il comando "shutdown" esegue uno spegnimento del sistema al livello di esecuzione 1 senza il comando -h o -r.

Che dire del comando "poweroff" passa al livello di esecuzione 0 o 1? È questa l'unica differenza principale tra questi tre comandi?



Queste sono alcune delle cose che differiscono in modo significativo, ad esempio per Solaris e FreeBSD. (Lì di solito (quasi) immediatamente arrestano / arrestano il server, senza cambiare i runlevel per chiudere prima le cose)
Gert van den Berg

Risposte:


120

E ora, la risposta di systemd.

Stai utilizzando, per il tag sulla tua domanda, Red Hat Enterprise Linux. Dalla versione 7, ha utilizzato systemd. Nessuna delle altre risposte è corretta per il mondo di systemd; e nemmeno alcuni dei presupposti della tua domanda.

  • Dimentica i runlevel ; esistono, ma solo come spessori di compatibilità. La documentazione di systemd afferma che il concetto è "obsoleto". Se stai iniziando a imparare queste cose su un sistema operativo systemd, non iniziare da lì.
  • Dimentica la pagina di manuale che Marcelm ha citato; non proviene affatto dal set di strumenti giusto ed è una descrizione del comando di un altro set di strumenti, errato per i systemd. È quello per il haltcomando delle utility "System 5" di van Smoorenburg init.
  • Ignora le affermazioni che /sbin/haltsono un collegamento simbolico a /sbin/reboot; questo non è vero con systemd. Non esiste alcun rebootprogramma separato .
  • Ignorate le dichiarazioni che halto rebootinvocare un shutdownprogramma con gli argomenti della riga di comando; inoltre non sono veri con systemd. Non esiste alcun shutdownprogramma separato .

Ogni set di strumenti di gestione del sistema ha la sua versione di queste utility. systemd, upstart, gustare uno spuntino , van Smoorenburg init, e BSD inittutti hanno il loro halt, poweroffe così via. Su ciascuno la loro meccanica è leggermente diversa. Così sono le loro pagine di manuale.

Nel set di strumenti systemd halt, poweroff,reboot , telinit, e shutdownsono tutti collegamenti simbolici a /bin/systemctl. Sono tutti spessori compatibilità all'indietro, che sono semplicemente abbreviazioni per invocare CLI primario di systemd: systemctl. Tutti mappano (e in effetti lo sono) lo stesso singolo programma. (Per convenzione, la shell gli dice da quale nome è stata invocata.)

obiettivi, non runlevel

La maggior parte di questi comandi è una scorciatoia per dire a systemd, usando systemctl, di isolare un obiettivo particolare . L'isolamento è spiegato nella systemctlpagina del manuale (qv), ma può essere, ai fini di questa risposta, pensato come avviare un obiettivo e fermarne altri. I target standard utilizzati in systemd sono elencati nella systemd.specialpagina del manuale (8).

I diagrammi sulla bootup(7) pagina di manuale nel set di strumenti di systemd, in particolare l'ultimo, mostrano che ci sono tre target "finali" che sono rilevanti qui:

  • halt.target- Una volta che il sistema ha raggiunto lo stato di isolamento completo di questa destinazione, avrà chiamato la reboot(RB_HALT_SYSTEM)chiamata di sistema. Il kernel avrà tentato di accedere a un programma di monitoraggio ROM o semplicemente arrestato la CPU (utilizzando qualsiasi meccanismo appropriato per farlo).
  • reboot.target- Una volta che il sistema ha raggiunto lo stato di isolamento completo di questo bersaglio, avrà chiamato la reboot(RB_AUTOBOOT)chiamata di sistema (o l'equivalente con la riga di comando magica). Il kernel avrà tentato di avviare un riavvio.
  • poweroff.target- Una volta che il sistema ha raggiunto lo stato di isolamento completo di questa destinazione, avrà chiamato la reboot(RB_POWER_OFF)chiamata di sistema. Il kernel avrà tentato di rimuovere l'alimentazione dal sistema, se possibile.

Queste sono le cose a cui dovresti pensare come afferma il sistema finale, non eseguire i livelli. Si noti dal diagramma che il sistema target di sistema stesso codifica cose che sono, in altri sistemi, implicite piuttosto che esplicite: come l'idea che ciascuno di questi obiettivi finali racchiuda l' shutdown.targetobiettivo, in modo che uno descriva i servizi che devono essere arrestati prima dell'arresto da facendoli entrare in conflitto con il shutdown.targetbersaglio.

systemctltenta di inviare richieste a systemd-logindquando l'utente chiamante non è il superutente. Passa anche a arresti ritardati a systemd-shutdownd. E alcuni shorthands attivano le wallnotifiche. A parte quelle complessità, che renderebbero questa risposta più volte più lunga, supponendo che tu sia attualmente il superutente e non richiedendo un'azione programmata:

  • systemctl isolate halt.target ha le scorciatoie:
    • shutdown -H now
    • systemctl halt
    • semplice disadorno halt
  • systemctl isolate reboot.target ha le scorciatoie:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • semplice disadorno reboot
  • systemctl isolate poweroff.target ha le scorciatoie:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • semplice disadorno poweroff
  • systemctl isolate rescue.target ha le scorciatoie:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target ha le scorciatoie:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target ha la scorciatoia:
    • telinit 5

Dopo aver analizzato le diverse sintassi della riga di comando, queste alla fine finiscono negli stessi percorsi di codice all'interno del systemctlprogramma.

Appunti:

  • Il comportamento tradizionale di opzione-less shutdown nowè stato quello di passare alla modalità utente singolo . Questo non è il caso di systemd. rescue.target- la modalità utente singolo viene rinominata modalità di salvataggio in systemd - non è raggiungibile con il shutdowncomando.
  • telinit in realtà non del tutto ignorare tutti coloro e collegamenti simbolici nel filesystem che le pagine di manuale descrivono. I mapping precedentemente indicati sono cablati nel programma, in una tabella.runlevelN.targetdefault.targetsystemctl
  • systemd non ha alcuna nozione di un livello di esecuzione corrente . L'operazione di questi comandi non è subordinata a nessun "se si è nel livello di esecuzione N ".
  • L' --forceopzione per la halt, reboote poweroffcomandi è lo stesso che dire --force --forceai systemctl halt, systemctl reboote systemctl poweroffcomandi. Questo fa systemctlprovare a chiamare reboot()direttamente. Normalmente cerca solo di isolare gli obiettivi.
  • telinitnon è lo stesso di init. Sono programmi diversi nel mondo del sistema e quest'ultimo è un altro nome per il systemdprogramma, non per il systemctlprogramma. Il systemdprogramma non è necessariamente compilato con alcuna compatibilità di van Smoorenburg e su alcuni sistemi operativi e sistemi si lamenta di essere invocato in modo errato se si tenta .init N

Ulteriori letture


1
Questo è molto generico per la maggior parte dei moderni sistemi Linux, quindi ad esempio risponde wiert.me/2012/12/30/… Dopo tutti questi anni che mi chiedo, finalmente capisco cosa sta succedendo e perché.
Jeroen Wiert Pluimers,

systemctl rebootdovrebbe essere equivalente a systemctl start reboot.target --job-mode=replace-irreversible. L'uso di qualsiasi altra modalità di lavoro è meno robusto. unix.stackexchange.com/questions/381739/…
sourcejedi

1
Ho letto tutta la tua risposta e ho assorbito ciò che potevo. Rimane una domanda, la stessa per cui sono venuto qui, è systemctl rebootil modo "sicuro" di riavviare, ad esempio init 6qual è il modo in cui altrimenti faremmo il riavvio sicuro?
Brian Thomas,

25
  • haltindica all'hardware di arrestare tutte le funzioni della CPU , ma lo lascia acceso. Questo di solito significa che qualcuno deve riavviare o spegnere la macchina manualmente premendo il pulsante di accensione in seguito. Il modo specifico per raggiungere questo obiettivo è specifico dell'architettura, ma ad esempio il set di istruzioni x86 fornisce le HLTistruzioni che arrestano l'unità di elaborazione centrale (CPU) fino a quando non viene attivato il successivo interrupt esterno.

  • poweroff, ad esempio halt, arresta la CPU ma invia anche un segnale hardware ACPI che indicherà al sistema di iniziare con uno spegnimento completo e immediato. Ciò equivale all'incirca alla pressione del pulsante di accensione su un tipico computer desktop.

Entrambi halte poweroffsono solitamente collegamenti simbolici alla rebooteseguibile, che di solito invocare il shutdowndell'utensile con gli argomenti appropriati ( -h, -Po r) a seconda se halt, poweroffo rebootè stato utilizzato per richiamare lo strumento. Tuttavia, quando l' --forceopzione è passata a reboot, o quando nel runlevel 0 o 6, rebootinvocherà la reboot()chiamata di sistema con un codice di comando appropriato stesso.


Thomas, grazie mille per avermi spiegato. Sono interessato a sapere che ne dici di fare un #init 0, non ci sono molte differenze, giusto?
Win.T

@ Win.T Il passaggio al runlevel 0 usando eg /sbin/init 0o /sbin/telinit 0dovrebbe essere lo stesso dell'arresto del sistema, sebbene i passi specifici fatti dipenderebbero dal sistema init in questione, come System-V init , upstart o systemd . Se stai eseguendo RHEL, useresti systemd.
Thomas Nyman,

4
Nota per sé: ogni volta che qualcuno si lamenta di una chiamata API Win32 arcana, mostra loro il riavvio (2).
user253751

@immibis Ma il riavvio è volutamente arcano. Richiede le bandiere magiche, quindi è molto difficile farlo per caso.
Kevin Cox,

4
@KevinCox Questo è l'argomento per richiedere bandiere magiche. Non è l'argomento per accettare 4 valori diversi per magic2, né per comportarsi in modo diverso all'interno di uno spazio dei nomi PID, né per raggruppare diverse operazioni a malapena correlate (come impostare il comportamento reboot-on-Ctrl-Alt-Delete) in una funzione.
user253751

1

halt, poweroffE shutdown -hsono del tutto equivalenti. In effetti, l'arresto e lo spegnimento non fanno altro che chiamare shutdown -h. Dalla manpage halt / poweroff:

Se si chiama halt o reboot quando il sistema non è in runlevel 0 o 6, in altre parole quando è in esecuzione normalmente, verrà invece chiamato shutdown (con il flag -h o -r). Per ulteriori informazioni, consultare la manpage shutdown (8).

L'arresto procede quindi all'arresto del sistema passando al livello di esecuzione 0.

Arresto e spegnimento (e riavvio) svolgono un duplice ruolo; quando vengono eseguiti durante il processo di spegnimento (ovvero, nel runlevel 0 o 6), eseguono le operazioni di basso livello richieste per arrestare, spegnere o riavviare fisicamente la macchina, come descritto in un'altra risposta.


2
Quale versione di RHEL stai usando? Di solito c'è una differenza tra halt e poweroff (anche se per un po 'non era il caso in molte distribuzioni, ma era un bug).
Bruno,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.