Reading "Quelle est la différence entre les commandes Halt et Shutdown?" , j'ai généralement une idée de ce que fait l'arrêt de la commande, avec ou sans les options -h/-r.
La commande "stop" exécute la mise hors tension du système au niveau d'exécution 0 du système.
La commande "shutdown" effectue une mise hors tension du système au niveau d'exécution 1 sans commande -h ou -r.
Qu'en est-il de la commande "poweroff" qui va au niveau d'exécution 0 ou 1? Est-ce la seule différence principale entre ces trois commandes?
Vous utilisez, selon la balise de votre question, Red Hat Enterprise Linux. Depuis la version 7, cela utilise systemd. Aucune des autres réponses n'est correcte pour le monde de systemd; ni même certaines des hypothèses dans votre question.
halt
des utilitaires "System 5" init
de van Smoorenburg./sbin/halt
Est un lien symbolique vers /sbin/reboot
; ce n'est pas vrai avec systemd. Il n'y a aucun programme reboot
séparé.halt
ou reboot
appellent un programme shutdown
avec des arguments de ligne de commande; ils ne sont pas non plus vrais avec systemd. Il n'y a aucun programme shutdown
séparé.Chaque jeu d'outils de gestion système a sa version de ces utilitaires. systemd, upstart, nosh , van Smoorenburg init
et BSD init
ont tous leurs propres halt
, poweroff
, etc. en avant. Sur chacun leur mécanique est légèrement différente. Tout comme leurs pages de manuel.
Dans le jeu d'outils systemd halt
, poweroff
, reboot
, telinit
et shutdown
sont tous les liens symboliques vers /bin/systemctl
. Ce sont tous des shims à compatibilité descendante, qui sont simplement des raccourcis pour appeler l'interface de ligne de commande principale de systemd: systemctl
. Ils sont tous mappés vers (et en fait sont) le même programme unique . (Par convention, le shell lui indique par quel nom il a été invoqué.)
La plupart de ces commandes sont des raccourcis pour indiquer à systemd, en utilisant systemctl
, d'isoler une cible particulière . L'isolement est expliqué dans la page de manuel systemctl
(q.v.), mais peut être, pour les besoins de cette réponse, considéré comme le démarrage d'une cible et l'arrêt de toute autre. Les cibles standard utilisées dans systemd sont répertoriées sur la page de manuel systemd.special
(8).
Les diagrammes de la page de manuel bootup
(7) du jeu d'outils systemd, en particulier le dernier, montrent qu'il y a trois cibles "finales" qui sont pertinentes ici:
halt.target
- Une fois que le système a atteint l'état d'isolement complet de cette cible, il aura appelé l'appel système reboot(RB_HALT_SYSTEM)
. Le noyau aura tenté d'entrer un programme de surveillance ROM, ou simplement arrêté le processeur (en utilisant le mécanisme approprié pour le faire).reboot.target
- Une fois que le système a atteint l'état d'isolement complet de cette cible, il aura appelé l'appel système reboot(RB_AUTOBOOT)
(ou l'équivalent avec la ligne de commande magique). Le noyau aura tenté de déclencher un redémarrage.poweroff.target
- Une fois que le système a atteint l'état d'isolement complet de cette cible, il aura appelé l'appel système reboot(RB_POWER_OFF)
. Si possible, le noyau aura tenté de couper l'alimentation du système. Ces sont les choses auxquelles vous devez penser en tant qu'états finaux du système, pas les niveaux d'exécution. Notez à partir du diagramme que le système cible systemd lui-même code des choses qui sont, dans d'autres systèmes, implicites plutôt qu'explicites: comme la notion que chacune de ces cibles finales englobe la cible shutdown.target
, De sorte que l'on décrit des services qui doit être arrêté avant l'arrêt en les faisant entrer en conflit avec la cible shutdown.target
.
systemctl
essaie d'envoyer des demandes à systemd-logind
lorsque l'utilisateur appelant n'est pas le superutilisateur. Il transmet également les arrêts différés à systemd-shutdownd
. Et certains raccourcis déclenchent des notifications wall
. Ces complexités mises à part, qui rendraient cette réponse plusieurs fois plus longue, en supposant que vous êtes actuellement le superutilisateur et que vous ne demandez pas une action planifiée:
systemctl isolate halt.target
A les raccourcis: shutdown -H now
systemctl halt
halt
systemctl isolate reboot.target
A les raccourcis: shutdown -r now
telinit 6
systemctl reboot
reboot
systemctl isolate poweroff.target
A les raccourcis: shutdown -P now
telinit 0
shutdown now
systemctl poweroff
poweroff
systemctl isolate rescue.target
A les raccourcis: telinit 1
systemctl rescue
systemctl isolate multi-user.target
A les raccourcis: telinit 2
telinit 3
telinit 4
systemctl isolate graphical.target
A le raccourci: telinit 5
Après avoir analysé les différentes syntaxes de ligne de commande différentes, celles-ci finissent toutes par se retrouver dans les mêmes chemins de code à l'intérieur du programme systemctl
.
Remarques:
shutdown now
A été de passer en mode mono-utilisateur . Ce n'est pas le cas avec systemd. rescue.target
- le mode mono-utilisateur renommé en mode de secours dans systemd - n'est pas accessible avec la commande shutdown
.telinit
ignore vraiment tous ces liens symboliques runlevelN.target
Et default.target
Dans le système de fichiers qui les pages de manuel décrivent. Les mappages précités sont câblés dans le programme systemctl
, dans une table.--force
Pour les commandes halt
, reboot
et poweroff
revient à dire --force --force
À systemctl halt
, systemctl reboot
Et systemctl poweroff
Commandes. Cela oblige systemctl
à appeler directement reboot()
. Normalement, il essaie simplement d'isoler les cibles.telinit
n'est pas identique à init
. Ce sont des programmes différents dans le monde systemd, ce dernier étant un autre nom pour le programme systemd
, pas pour le programme systemctl
. Le programme systemd
n'est pas nécessairement compilé du tout avec la compatibilité de van Smoorenburg, et sur certains systèmes d'exploitation systemd se plaint d'être mal appelé si l'on essaie init N
.systemctl
. pages de manuel de systemd. freedesktop.org.systemd.special
. pages de manuel de systemd. freedesktop.org.bootup
. pages de manuel de systemd. freedesktop.org.init
. Guide de nosh . Logiciels.halt
ordonne au matériel de arrêter toutes les fonctions du processeur , mais le laisse dans un état sous tension. Cela signifie généralement que quelqu'un doit redémarrer ou arrêter la machine manuellement en appuyant ensuite sur le bouton d'alimentation. La manière spécifique d'y parvenir est spécifique à l'architecture, mais par exemple, le jeu d'instructions x86 fournit les instructions HLT
qui arrêtent l'unité centrale (CPU) jusqu'à ce que la prochaine interruption externe soit déclenchée.
poweroff
, comme halt
, arrête le CPU mais envoie également un signal matériel ACPI qui demandera au système de commencer par un arrêt complet et immédiat. Cela revient à peu près à appuyer sur le bouton d'alimentation d'un ordinateur de bureau classique.
halt
et poweroff
sont généralement des liens symboliques vers l'exécutable reboot
, qui invoque généralement l'outil shutdown
avec l'outil approprié (-h
, -P
ou r
) selon que halt
, poweroff
ou reboot
a été utilisé pour appeler l'outil. Cependant, lorsque l'option --force
Est passée à reboot
, ou lorsqu'elle est au niveau d'exécution 0 ou 6, reboot
invoquera la reboot()
appel système avec un code de commande approprié lui-même.
halt
, poweroff
et shutdown -h
sont complètement équivalents. En fait, l'arrêt et la mise hors tension ne font qu'appeler shutdown -h
. Depuis la page de manuel stop/poweroff:
Si l'arrêt ou le redémarrage est appelé lorsque le système n'est pas au niveau d'exécution 0 ou 6, en d'autres termes lorsqu'il fonctionne normalement, l'arrêt sera appelé à la place (avec l'indicateur -h ou -r). Pour plus d'informations, consultez la page de manuel shutdown (8).
L'arrêt procède ensuite à l'arrêt du système en passant au niveau d'exécution 0.
L'arrêt et la mise hors tension (et le redémarrage) jouent un double rôle; lorsqu'ils sont exécutés en cours d'arrêt (c'est-à-dire au niveau d'exécution 0 ou 6), ils effectuent les opérations de bas niveau nécessaires pour arrêter physiquement, éteindre ou redémarrer la machine, comme décrit dans une autre réponse.