阅读“停止和关闭命令之间有什么区别?” ,我通常对使用或不使用-h / -r选项的命令关闭功能有什么了解。
“停止”命令将关闭系统电源,使其进入系统的运行级别0。
“关闭”命令无需执行-h或-r命令即可关闭系统电源,以运行级别1。
命令“ poweroff”进入运行级别0或1怎么办?这是这三个命令之间的唯一主要区别吗?
阅读“停止和关闭命令之间有什么区别?” ,我通常对使用或不使用-h / -r选项的命令关闭功能有什么了解。
“停止”命令将关闭系统电源,使其进入系统的运行级别0。
“关闭”命令无需执行-h或-r命令即可关闭系统电源,以运行级别1。
命令“ poweroff”进入运行级别0或1怎么办?这是这三个命令之间的唯一主要区别吗?
Answers:
根据问题上的标签,您正在使用Red Hat Enterprise Linux。从版本7开始,就使用了systemd。对于systemd的世界,没有其他答案是正确的。您的问题中甚至没有一些假设。
halt从van Smoorenburg“ System 5” init实用程序发出命令的命令之一。 /sbin/halt符号链接的语句/sbin/reboot; systemd并非如此。根本没有单独的reboot程序。 halt或reboot调用shutdown与命令行参数程序; 对于systemd,它们也不正确。根本没有单独的shutdown程序。每个系统管理工具集都有这些实用程序的版本。systemd,暴发户,nosh,van Smoorenburginit和BSD init都有自己的halt,poweroff等等。在每个方面,他们的机制略有不同。他们的手册页也是如此。
在systemd工具集halt,poweroff,reboot,telinit,和shutdown是所有的符号链接/bin/systemctl。他们都向后兼容性垫片,这仅仅是用于调用systemd的主要命令行界面速记:systemctl。它们都映射到(实际上是)相同的单个程序。(根据约定,shell会告诉它调用它的名称。)
这些命令大多数是用于告诉systemd使用systemctl来隔离特定目标的简写。隔离在systemctl手册页(qv)中进行了说明,但出于此答案的目的,可以将其视为启动目标并停止其他目标。systemd.special(8)手册页上列出了systemd中使用的标准目标。
bootupsystemd工具集中(7)手册页上的图表,尤其是最后一个,显示了此处涉及的三个“最终”目标:
halt.target—一旦系统达到完全隔离此目标的状态,它将调用reboot(RB_HALT_SYSTEM)系统调用。内核将尝试进入ROM监视程序,或者只是停止CPU(使用适当的任何机制)。reboot.target—一旦系统达到完全隔离此目标的状态,它将调用reboot(RB_AUTOBOOT)系统调用(或与magic命令行等效的调用)。内核将尝试触发重启。poweroff.target—一旦系统达到完全隔离此目标的状态,它将调用reboot(RB_POWER_OFF)系统调用。如果可能,内核将尝试从系统中关闭电源。这些是您在最终系统状态(而不是运行级别)中应该考虑的事情。从图中注意到,系统化的目标系统本身对其他系统中隐式而不是显式的事物进行编码:例如这些最终目标中的每个目标都包含shutdown.target目标的概念,因此必须描述必须在停止之前停止的服务让他们有冲突的shutdown.target目标。
systemctlsystemd-logind当主叫用户不是超级用户时,尝试将请求发送到。它还会将延迟的关闭时间传递到systemd-shutdownd。还有一些速记会触发wall通知。除了这些复杂性之外,假设您当前是超级用户并且不请求计划的操作,那么此答案将使答案延长几倍。
systemctl isolate halt.target 简写为:
shutdown -H nowsystemctl halthaltsystemctl isolate reboot.target 简写为:
shutdown -r nowtelinit 6systemctl rebootrebootsystemctl isolate poweroff.target 简写为:
shutdown -P nowtelinit 0shutdown nowsystemctl poweroffpoweroffsystemctl isolate rescue.target 简写为:
telinit 1 systemctl rescuesystemctl isolate multi-user.target 简写为:
telinit 2telinit 3telinit 4systemctl isolate graphical.target 简写为:
telinit 5在解析了各种不同的命令行语法之后,这些最终都最终以systemctl程序内部的相同代码路径结尾。
笔记:
shutdown now切换到单用户模式。systemd并非如此。 rescue.target- 在systemd中将单用户模式重命名为救援模式 -该shutdown命令无法访问。telinit 确实完全忽略了手册页描述的文件系统中的所有那些链接和符号链接。表中将上述映射硬连线到程序中。runlevelN.targetdefault.targetsystemctl--force选项的halt,reboot和poweroff命令是一样的话说--force --force到systemctl halt,systemctl reboot和systemctl poweroff命令。这使得systemctl尝试reboot()直接呼叫。通常,它只是试图隔离目标。telinit与init。它们是系统世界中的不同程序,后者是该systemd程序的另一个名称,而不是该systemctl程序的名称。该systemd程序不一定完全具有任何van Smoorenburg兼容性,并且在某些系统化的操作系统上抱怨如果尝试一次,将导致错误地调用该程序。init Nsystemctl。系统手册页。freedesktop.org。systemd.special。系统手册页。freedesktop.org。bootup。系统手册页。freedesktop.org。init。nosh指南。软件。systemctl reboot应该等于systemctl start reboot.target --job-mode=replace-irreversible。使用任何其他作业模式都不太可靠。 unix.stackexchange.com/questions/381739/…–
systemctl reboot“安全”重启方式,例如init 6,否则我们将安全重启吗?
halt指示硬件停止所有CPU功能,但将其保持在开机状态。这通常意味着有人必须随后通过按电源按钮来手动重新引导或关闭计算机。实现此目标的特定方法是特定于体系结构的,但是例如x86指令集提供了HLT可暂停中央处理单元(CPU)直到发出下一个外部中断的指令。
poweroff,例如halt,停止CPU,但还会发送ACPI硬件信号,该信号将指示系统以立即彻底关闭启动。这大致相当于按下典型台式计算机上的电源按钮。
两个halt和poweroff通常的符号链接到reboot可执行文件,这通常将调用shutdown使用适当的参数(工具-h,-P或r取决于是否)halt,poweroff或reboot用于调用该工具。但是,将--force选项传递给时reboot,或者处于运行级别0或6时,reboot将reboot()使用适当的命令代码本身调用系统调用。
/sbin/init 0或切换到运行级别0 /sbin/telinit 0应该与停止系统相同,尽管采取的具体步骤将取决于相关的init系统,例如System-V init,upstart或systemd。如果您正在运行RHEL,则将使用systemd。
halt,poweroff并且shutdown -h完全等效。实际上,暂停和关闭电源仅能执行call shutdown -h。从暂停/关机手册页:
如果在系统不在运行级别0或6时调用暂停或重新启动,换句话说,在系统正常运行时,将调用shutdown(使用-h或-r标志)。有关更多信息,请参见shutdown(8)联机帮助页。
然后关机,通过切换到运行级别0,继续关闭系统。
停止和关机(以及重新启动)扮演双重角色;当在关闭过程中(即,运行级别0或6)执行时,它们将执行物理停止,关闭电源或重新引导计算机所需的低级操作,如另一个答案所述。