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

Ubuntu 16.04下用runc绑定挂载/proc或/dev到容器遇操作不允许错误

解决Ubuntu 16.04中runc绑定挂载/proc/dev时的EPERM错误

我之前在Ubuntu 16.04上用runc做容器挂载时也碰到过一模一样的问题,这事儿十有八九是Ubuntu默认启用的AppArmor安全策略在限制操作。

从你贴的strace日志能看出来:第一次执行带MS_BIND|MS_REC参数的mount是成功的,但第二次尝试remount为只读模式时就触发了EPERM。这是因为Ubuntu 16.04的AppArmor默认配置会严格管控容器内对/proc、/dev这类敏感文件系统的remount操作,而你提到的Alinux、Raspbian要么没启用AppArmor,要么默认策略没这么苛刻。

给你几个可行的解决办法:

  • 临时验证:切换AppArmor到抱怨模式
    先执行这个命令让AppArmor只记录违规操作而不阻止:

    sudo aa-complain /usr/bin/runc
    

    之后再尝试挂载操作,如果能成功,就坐实是AppArmor的问题了。

  • 永久修正:修改AppArmor配置文件
    找到runc对应的AppArmor规则文件(一般在/etc/apparmor.d/usr.bin.runc),添加允许remount的规则:

    # 允许对/proc的只读remount绑定挂载
    mount fstype=proc, options=(ro,bind,remount,rec);
    # 如果是/dev的话,添加这条
    mount fstype=devtmpfs, options=(ro,bind,remount,rec);
    

    保存后重新加载配置:

    sudo apparmor_parser -r /etc/apparmor.d/usr.bin.runc
    
  • 容器层面禁用AppArmor
    直接在runc的config.json里添加安全选项,让容器不受AppArmor限制:

    "process": {
      // 其他原有配置...
      "security_opt": [
        "apparmor:unconfined"
      ]
    }
    

需要注意的是,Ubuntu 16.04的AppArmor版本比较旧,规则设计上比后续发行版更严格,这也是为什么其他发行版没遇到这个问题的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:42:03