从 Go 调用 setns 返回 mnt 命名空间的 EINVAL
问题:
Go 代码无法使用 setns 调用进入 mnt 命名空间,导致 EINVAL 错误。尽管 C 代码中的调用相同,但 Go 实现会产生一致的错误。
调查:
解决方案:
在 Go 中,必须执行 setns在 Go 运行时线程启动之前的单线程上下文中。这是因为 setns 作用于调用线程,将其连接到命名空间。
使用 CGO 构造函数技巧的替代解决方案:
添加 __attribute__((constructor)) 宏到一个 C 函数,让它在 Go 初始化之前执行。这允许在 Go 线程启动之前输入命名空间,从而解决问题。
更新:
Linux 内核邮件列表对话确认了多线程进程无法执行的限制与新的挂载命名空间重新关联。这需要调用者命名空间中的 CAP_SYS_CHROOT 和 CAP_SYS_ADMIN 功能以及目标命名空间中的 CAP_SYS_ADMIN 功能。
以上是为什么从 Go 调用 setns 对 mnt 命名空间返回 EINVAL?的详细内容。更多信息请关注PHP中文网其他相关文章!