3

我正在寻找一种从 init-bottom 脚本*中重新启动/重置我的 linux 系统的方法。在执行我的脚本时,系统位于 /root 下,我可以访问一个 busybox。

但是我的busybox中的“重启”命令不起作用。还有其他可能吗?


我的系统使用 initramfs 映像正常启动,我的脚本最终导致更新过程。debian 附带的新 systemd 激怒了这一点。但是通过电源重置一切都很好。

4

2 回答 2

5

我发现了这个:

echo b >/proc/sysrq-trigger

(就像按 CTRL+ALT+DEL)

于 2015-10-04T07:21:19.077 回答
1

如果您-are-init(您的进程/脚本的PID 为0),那么启动busybox 重新启动程序将不起作用,因为它会尝试向init(未启动)发出信号以重新启动。

相反,作为 PID 0,你应该做 init 会做的事情。这是为重新启动调用正确的内核 API。有关详细信息,请参见Man reboot(2)

假设您正在运行 ac 程序或其他东西,可以这样做:

#include <unistd.h>
#include <sys/reboot.h>

void main() { reboot(0x1234567); }

这比执行 sysrq 触发器要好得多,后者更像是紧急重启而不是干净重启。

最后一点,busybox 的 init 实际上派生了一个进程来为它重新启动。这是因为 reboot 系统调用实际上也存在于程序中,并且系统不应该在没有 init 进程的情况下运行(这也会使内核恐慌)。因此,在这种情况下,您将执行以下操作:

pid_t pid;
pid = vfork();
if (pid == 0) { /* child */
    reboot(0x1234567);
    _exit(EXIT_SUCCESS);
}
while (1); /* Parent (init) waits */
于 2017-05-15T10:33:10.563 回答