【问题标题】:How can I call reboot() from a PID namespace other than the initial PID namespace, and from the initial PID namespace?如何从初始 PID 命名空间以外的 PID 命名空间和初始 PID 命名空间调用 reboot()?
【发布时间】:2018-12-19 19:52:26
【问题描述】:

manpage of reboot()

PID 命名空间内的行为

从 Linux 3.4 开始,如果从 PID 命名空间 other
调用 reboot() 比具有列出的 cmd 值之一的初始 PID 命名空间

下面,它执行该命名空间的“重启”:“init”进程
PID命名空间的立即终止,效果
在 pid_namespaces(7) 中描述。

调用reboot()时可以在cmd中提供的值 本案例如下:

LINUX_REBOOT_CMD_RESTART、LINUX_REBOOT_CMD_RESTART2 “init”进程终止,并在父进程中等待(2) 进程报告孩子被 SIGHUP 杀死 信号。

LINUX_REBOOT_CMD_POWER_OFF、LINUX_REBOOT_CMD_HALT “init”进程终止,并在父进程中等待(2) 进程报告孩子被 SIGINT 杀死 信号。

对于其他 cmd 值,reboot() 返回 -1 并且 errno 设置为
EINVAL。

在阅读its manpage 后,我对 PID 命名空间的了解有限。我想知道如何调用 reboot()

  • 来自初始 PID 命名空间以外的 PID 命名空间,并且
  • 来自初始 PID 命名空间?

【问题讨论】:

    标签: linux reboot


    【解决方案1】:

    您可以使用 nsenter 进入其他 PID 命名空间。 要从初始 PID 命名空间以外的 PID 命名空间执行重启:

    /usr/bin/nsenter -p/proc/PID/ns/pid reboot
    

    如果目标PID为1:

    /usr/bin/nsenter -p/proc/1/ns/pid reboot
    

    第二个问题与简单地调用reboot 相同,因为它会获取当前的PID 上下文。

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多