You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用unshare(CLONE_NEWUSER)后部分程序运行失败的原因是什么

异常触发原因
  • 核心问题是调用unshare(CLONE_NEWUSER)创建新用户命名空间后,未配置对应的UID/GID映射规则,导致命名空间内的进程无权限执行g++二进制文件。
  • 具体运行逻辑:
    1. 新创建的用户命名空间默认不存在任何UID/GID映射关系,此时进程的有效UID/GID会被内核设置为溢出ID(通常为65534,对应nobody用户),该用户对宿主机上绝大多数可执行文件都没有执行权限。
    2. 当make无需执行编译动作时,仅需要做文件时间戳比对,这类操作的权限要求极低,因此可以正常运行输出更新提示。
    3. 当make需要调用g++执行编译时,会触发execve系统调用加载g++二进制文件,内核检查到当前命名空间无有效UID映射时,会直接返回EINVAL错误,也就是你看到的Invalid argument提示,make捕获到命令执行失败后就返回了错误码127。
修复方案

你可以在unshare调用完成后、execl调用前,手动配置UID/GID映射规则,步骤如下:

  1. 向/proc/self/setgroups写入deny,关闭setgroups权限
  2. 向/proc/self/uid_map写入映射规则,将命名空间内的UID 0映射到宿主机的当前UID
  3. 向/proc/self/gid_map写入映射规则,将命名空间内的GID 0映射到宿主机的当前GID

配置完成后再执行make命令即可正常调用编译工具链。


内容的提问来源于stack exchange,提问作者Dan O

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:54:04