我正在寻找一种方法,从init-bottom脚本*中重新启动/重置我的linux系统。在执行脚本时,系统位于/root下,我可以访问一个busybox。
但是"reboot"命令是我的busybox的一部分,它不起作用。还有其他可能吗?
我的系统使用initramfs映像正常启动,我的脚本最终导致更新过程。debian带来的新系统激怒了这一点。但有了电源重置,一切都很好。
我发现了这个:
echo b >/proc/sysrq-trigger
(就像按下CTRL+ALT+DEL)
如果您是-init(进程/脚本的PID为0),那么启动busybox重新启动程序将无法工作,因为它试图向init(未启动)发出重新启动的信号。
相反,作为PID 0,您应该做init应该做的事情。这就是调用正确的内核API来重新启动。有关详细信息,请参阅Man重新启动(2)。
假设你正在运行一个c程序或其他什么程序,可以这样做:
#include <unistd.h>
#include <sys/reboot.h>
void main() { reboot(0x1234567); }
这比执行sysrq触发器要好得多,后者的行为更像是紧急重启,而不是干净重启。
最后要注意的是,busybox的init实际上分叉了一个进程来为它重新启动。这是因为重新启动系统调用实际上也存在于程序中,并且系统在没有init进程的情况下永远不应该运行(这也会使内核死机)。因此,在这种情况下,您可以执行以下操作:
pid_t pid;
pid = vfork();
if (pid == 0) { /* child */
reboot(0x1234567);
_exit(EXIT_SUCCESS);
}
while (1); /* Parent (init) waits */