首页 > 后端开发 > Golang > 为什么从 Go 调用 setns 对 mnt 命名空间返回 EINVAL?

为什么从 Go 调用 setns 对 mnt 命名空间返回 EINVAL?

Mary-Kate Olsen
发布: 2024-11-03 14:30:03
原创
702 人浏览过

Why Does Calling setns from Go Return EINVAL for mnt Namespaces?

从 Go 调用 setns 返回 mnt 命名空间的 EINVAL

问题:

Go 代码无法使用 setns 调用进入 mnt 命名空间,导致 EINVAL 错误。尽管 C 代码中的调用相同,但 Go 实现会产生一致的错误。

调查:

  • 确认 C 和 Go 代码在 libc 中相同地调用 setns .
  • 将问题简化为简化的代码示例以隔离问题。

解决方案:

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板