阅读“停止和关闭命令之间有什么区别?”,我通常知道命令 shutdown 的作用,无论是否带有 -h/-r 选项。
“halt”命令将系统断电至系统运行级别 0。
“shutdown”命令将系统电源关闭到运行级别 1,无需使用 -h 或 -r 命令。
那么命令“poweroff”会进入运行级别 0 还是 1 呢?这是这三个命令之间唯一的主要区别吗?
答案1
现在,systemd 给出了答案。
根据您问题的标签,您正在使用 Red Hat Enterprise Linux。从版本 7 开始,就使用了 systemd。对于 systemd 的世界来说,其他答案都不正确;你的问题中的一些假设也不是。
- 忘记运行级别;它们存在,但仅作为兼容性垫片。 systemd 文档指出该概念已“过时”。如果您开始在 systemd 操作系统上学习这些东西,请不要从那里开始。
- 忘记 marcelm 引用的手册页吧;它根本不是来自正确的工具集,而是另一个工具集命令的描述,对于 systemd 来说是不正确的。这是
halt
来自 van Smoorenburg“System 5”init
公用事业公司的命令。 /sbin/halt
忽略作为符号链接的语句/sbin/reboot
; systemd 则不然。reboot
根本 没有单独的程序。- 忽略使用命令行参数调用程序
halt
的reboot
语句;shutdown
对于 systemd 来说也是不正确的。shutdown
根本没有单独的程序。
每个系统管理工具集都有自己的这些实用程序版本。 systemd,新贵,开胃菜、van Smoorenburginit
和 BSDinit
都有自己的halt
、poweroff
、等等。他们的机制略有不同。他们的手册页也是如此。
在 systemd 工具集中halt
, poweroff
,reboot
,telinit
, 和shutdown
是全部符号链接到/bin/systemctl
.他们是全部向后兼容垫片,它们只是调用 systemd 的主要命令行界面的简写:systemctl
。它们都映射到(事实上是)相同的单身的程序。 (按照惯例,shell 会告诉它是用哪个名称调用的。)
目标,而不是运行级别
这些命令中的大多数都是告诉 systemd 使用systemctl
, 的简写隔离一个特定的目标。隔离在手册页(qv)中进行了解释systemctl
,但出于本答案的目的,可以将其视为启动一个目标并停止任何其他目标。 systemd 中使用的标准目标列在systemd.special
(8) 手册页上。
systemd 工具集中第 (7) 手册页上的图表bootup
(特别是最后一张图表)显示了与此处相关的三个“最终”目标:
halt.target
— 一旦系统达到完全隔离该目标的状态,它将调用reboot(RB_HALT_SYSTEM)
系统调用。内核将尝试进入 ROM 监控程序,或者只是停止 CPU(使用任何适合这样做的机制)。reboot.target
— 一旦系统达到完全隔离该目标的状态,它将调用reboot(RB_AUTOBOOT)
系统调用(或与魔法命令行等效的功能)。内核将尝试触发重新启动。poweroff.target
— 一旦系统达到完全隔离该目标的状态,它将调用reboot(RB_POWER_OFF)
系统调用。如果可能的话,内核将尝试切断系统电源。
这些是您在最终系统状态时应该考虑的事情,而不是运行级别。从图中注意到,systemd 目标系统本身编码的内容在其他系统中是隐式的而不是显式的:例如每个最终目标都包含目标的概念shutdown.target
,因此描述了在关闭之前必须停止的服务拥有他们和...有冲突目标shutdown.target
。
systemctl
尝试发送请求至systemd-logind
当调用用户不是超级用户时。它还将延迟关闭传递给systemd-shutdownd
。有些简写会触发wall
通知。抛开这些复杂性不谈,假设您当前是超级用户并且不请求计划的操作,这将使这个答案更长几倍:
systemctl isolate halt.target
有简写:shutdown -H now
systemctl halt
- 朴实无华
halt
systemctl isolate reboot.target
有简写:shutdown -r now
telinit 6
systemctl reboot
- 朴实无华
reboot
systemctl isolate poweroff.target
有简写:shutdown -P now
telinit 0
shutdown now
systemctl poweroff
- 朴实无华
poweroff
systemctl isolate rescue.target
有简写:telinit 1
systemctl rescue
systemctl isolate multi-user.target
有简写:telinit 2
telinit 3
telinit 4
systemctl isolate graphical.target
有简写:telinit 5
解析各种不同的命令行语法后,这些语法最终都会出现在systemctl
程序内相同的代码路径中。
笔记:
- 无选项的传统行为
shutdown now
是转向单用户模式。 systemd 的情况并非如此。rescue.target
— 单用户模式被重命名救援模式在 systemd 中 - 无法通过shutdown
命令访问。 telinit
确实如此完全忽略手册页描述的文件系统中的所有这些和符号链接。上述映射被硬连线到程序的表中。runlevelN.target
default.target
systemctl
- systemd 没有 a 的概念当前运行级别。这些命令的操作不以任何“如果您处于运行级别”为条件氮”。
- 、、 和命令
--force
的选项与、、 和命令的选项相同。这使得尝试直接调用。通常它只是试图隔离目标。halt
reboot
poweroff
--force --force
systemctl halt
systemctl reboot
systemctl poweroff
systemctl
reboot()
telinit
不等于init
.它们是 systemd 世界中的不同程序,后者是程序的别称systemd
,而不是systemctl
程序的名称。该systemd
程序根本不需要与任何 van Smoorenburg 兼容性进行编译,并且在某些 systemd 操作系统上,如果尝试的话,就会抱怨被错误地调用。init N
进一步阅读
- 在不切断电源的情况下停止系统有什么充分的理由吗?
- 为什么 `init 0` 会导致 Arch 安装时出现“多余参数”?
- 斯蒂芬·韦德利 (2014)。 “8. 使用 systemd 管理服务” 红帽企业 Linux 7 系统管理员指南。红帽。
- 伦纳特·珀特林 (2013-10-07)。
systemctl
。 systemd 手册页。 freedesktop.org。 - 伦纳特·珀特林 (2013-10-07)。
systemd.special
。 systemd 手册页。 freedesktop.org。 - 伦纳特·珀特林 (2013-10-07)。
bootup
。 systemd 手册页。 freedesktop.org。 - 乔纳森·德博因·波拉德 (2018)。
init
。小吃指南。软件。
答案2
halt
指示硬件停止所有CPU功能,但使其处于通电状态。这通常意味着有人必须随后按下电源按钮来手动重新启动或关闭机器。实现这一点的具体方法是特定于体系结构的,但例如 x86 指令集提供了HLT
暂停中央处理单元(CPU)直到触发下一个外部中断的指令。poweroff
,例如halt
,停止CPU但也发送一个ACPI硬件信号将指示系统开始完全立即关闭。这大致相当于按下典型台式计算机上的电源按钮。
halt
和通常poweroff
都是可执行文件的符号链接reboot
,通常会调用shutdown
具有适当参数(-h
、-P
或r
)的工具,具体取决于 if halt
、poweroff
或reboot
用于调用该工具。但是,当--force
选项传递给 时reboot
,或者处于运行级别 0 或 6 时,reboot
将调用reboot()
系统调用本身带有适当的命令代码。
答案3
halt
,poweroff
并且shutdown -h
完全等价。事实上,halt 和 poweroff 除了调用 之外什么也不做shutdown -h
。从停止/断电联机帮助页:
如果在系统不处于运行级别 0 或 6 时(换句话说,当系统正常运行时)调用halt 或reboot,则将调用shutdown(使用-h 或-r 标志)。有关详细信息,请参阅 shutdown(8) 联机帮助页。
然后 Shutdown 会切换到运行级别 0 来关闭系统。
停止和关闭电源(以及重新启动)具有双重作用;当在关闭过程中执行时(即在运行级别 0 或 6 中),它们执行物理停止、关闭电源或重新启动机器所需的低级操作,如另一个答案中所述。