我正在寻找一种从 init-bottom 脚本*中重新启动/重置我的 linux 系统的方法。在执行我的脚本时,系统位于 /root 下,我可以访问一个 busybox。
但是我的busybox中的“重启”命令不起作用。还有其他可能吗?
我的系统使用 initramfs 映像正常启动,我的脚本最终导致更新过程。debian 附带的新 systemd 激怒了这一点。但是通过电源重置一切都很好。
我发现了这个:
echo b >/proc/sysrq-trigger
(就像按 CTRL+ALT+DEL)
如果您-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 */