【问题标题】:reboot within an initrd image在 initrd 映像中重新启动
【发布时间】:2023-03-11 07:06:02
【问题描述】:

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

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


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

【问题讨论】:

  • 我可以移动这个主题还是必须在那里重新创建它? (unix.stackexchange.com)

标签: linux reboot initrd


【解决方案1】:

我找到了这个:

echo b >/proc/sysrq-trigger

(就像按 CTRL+ALT+DEL)

【讨论】:

    【解决方案2】:

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

    相反,作为 PID 0,您应该执行 init 会执行的操作。这是为重新启动调用正确的内核 API。详情请见Man reboot(2)

    假设你正在运行一个 c 程序或其他东西,你会这样做:

    #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 */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-07
      • 2018-11-01
      • 2016-03-09
      • 2017-01-10
      • 1970-01-01
      • 2023-03-22
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多