在initrd映像中重新启动



我正在寻找一种方法,从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 */

相关内容

  • 没有找到相关文章

最新更新