没有systemd / init时如何关机(例如,使用init = / bin / bash)?


9

poweroff抱怨它无法通过DBus连接到systemd(当然,它还没有运行)。我确实sync紧随其后kill $$,认为pid 1死亡会提示内核关闭电源,但是这导致了内核恐慌。然后,我按住电源按钮强制关机。

在这种情况下关闭电源的最合适方法是什么?


存在一个未声明的隐式前提,即已安装systemd工具集。当“没有systemd”实际上意味着没有安装systemd工具集时,也就是标题的读取方式,答案就大不相同了。就其本身而言,可能值得单独提出一个问题。
JdeBP '18年

@JdeBP是正确的,仅阅读标题并忽略init=/bin/bash提示/隐含,是否安装了systemd模棱两可。我的意思是没有系统运行。无论如何,如果没有正在运行的systemd,我认为systemd工具集将无用,而答案将使用其他有关sysrq的方法。
JoL

Answers:


10

卸载已挂载的文件系统。根文件系统是一种特殊情况。为此,您可以使用mount / -o remount,ro。在Linux上,umount /由于它可以有效地转换为以前的命令,因此也可以正常工作。


就是说,您不必担心卸载过多,除非

  1. 您已经挂载了EFI系统分区所使用的旧文件系统(如FAT)或ext2,该文件系统未实现日记功能或等效功能。使用现代文件系统,sync应该已经足够,并且文件系统将在下次启动时非常快速地自我修复。
  2. 您可能已经离开了正在运行的进程,该进程正在写入文件系统,并且打算完全关闭它。在这种情况下,尝试卸载文件系统很有用,因为umount将会失败并显示繁忙错误,以提醒您剩余的写入器。

以上是重要部分。之后,您还可以使用方便地关闭硬件电源poweroff -f。或使用重新启动reboot -f

有一个systemd特定的等效项poweroff -fsystemctl poweroff -f -f。但是,poweroff -f它做同样的事情,systemd即使该命令是在没有SysV兼容性的情况下构建的,也支持此命令。


从技术上讲,我记得我的USB硬盘被记录为需要Windows“安全删除”或等效功能。但是,此要求不是电源故障安全的,Linux在正常关机期间也不会这样做。最好将其解释为意味着您不应该在硬盘旋转时轻推硬盘-包括尝试拔出硬盘。完全关闭电源将使驱动器停止旋转。您可能会听到,感觉到或看到它是否仍会停止:-)。


请注意,我不会忘记接受。只是我看到了建议,要等待一段时间才能接受答案,让其他人(可能在不同的时区)看到问题并有机会提供自己的答案。
JoL

sync()ext2就足够了。它会抱怨自己很脏,但是除了摘要信息外,实际上不会被损坏。我通常认为init = / bin / bash或任何本地等效方法都是紧急情况。
约书亚

@Joshua ext2 fsck 很棒。但是,大型文件系统上的fsck性能比日志重播要差得多。在紧急情况下,您不希望由于不干净的卸载而被延迟。
sourcejedi

你知道fsck.mode=skip吗?
约书亚

3
@Joshua为何相关?如果执行不干净的卸载,则最终将需要修复FS。不fsck.mode=skip干净的卸载后,请勿正常启动!
sourcejedi '18

5

我将简单地执行以下两个命令:

echo s > /proc/sysrq-trigger    <= For sync
echo o > /proc/sysrq-trigger    <= For shutdown the system

假设内核中启用了魔术键


4

好的,因此我想到可以选择exec init。从那里,我也许以后可以poweroff。我不知道是否还有更好的选择。


@ G-Man不会启动正常的引导过程并最终给您正常的shell吗?
muru

2
@muru你可以做exec init 0。并不是所有的init系统都可以使用,但是相同的系统会经历关闭顺序。
奥斯汀·海默尔加恩18/12/11

1
由于其他原因,我认为这是一个很好的答案。尤其是因为大多数情况下都不需要关机,而无需重新启动,因此避免了一旦修复损坏便避免了重新启动。
约书亚

1
@Joshua这很方便,但是如果您想最安全,通常最好检查一下整个引导过程是否有效:-)。
sourcejedi '18

3

实际上,您要调用reboot(2) syscall。

有两种方法可以做到这一点:

  1. 运行reboot -fpoweroff -f,应reboot(2)直接调用。

  2. 如果您使用的是真正的Linux虚拟终端(而不是GUI终端仿真器),请按Ctrl+ Alt+ Delete

请注意,某些用户空间程序(通常是init)可以禁用键盘快捷键,禁用时,快捷键将向init发送信号。

在卸载所有磁盘或将其重新安装为只读并运行同步之后,应完成上述所有命令。否则,您可能会丢失未写入的数据。如果您的外壳是唯一运行的进程,那么同步就足够了。


1

您可以使用Magic SysRq键(https://en.wikipedia.org/wiki/Magic_SysRq_key)关闭计算机电源。

要正确关闭,您可以使用以下内容(引用形式为Wikipedia):

神奇的SysRq密钥的常见用法是对已锁定的Linux计算机执行安全重启(缩写REISUB)。这可以防止fsck重新启动时需要它,并使某些程序有机会保存未保存工作的紧急备份。[5]   所述的QWERTY(或AZERTY)助记符: “ - [R aising é lephants 小号小号 Ò ù tterly O形环”,“ - [R EBOOT é VEN ˚F 小号 ystem ù tterly “ roken”或“ BUSIER”一词向后读,通常用于记住以下SysRq键序列:

  • un Raw(控制键盘从X返回),
  • t E终止(将SIGTERM发送给所有进程,使其能够正常终止),
  • k Ill(将SIGKILL发送给所有进程,迫使它们立即终止),
  • Sync(将数据刷新到磁盘),
  • Unmount(重新挂载所有文件系统为只读),
  • 重新BOOT。

但是,用O(用于azerty / qwerty)将最后一个B替换为“幂O ff”


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.