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

GCE容器环境更新root SSH密钥报只读文件系统错误解决方案

复现日志

反复出现的日志条目如下:

Adding existing user root to google-sudoers group.
Updating keys for user root.
Error updating SSH keys for root: mkdir /root/.ssh: read-only file system.
报错原因

这个问题是GCE平台预装的google-guest-agent守护进程默认逻辑,和容器只读根文件系统配置冲突导致的:

  • GCE实例默认会运行google-guest-agent,定时轮询实例元数据,自动执行sudo用户组维护、SSH公钥下发同步操作:首先会把root用户加入google-sudoers组,再尝试把元数据中配置的SSH公钥写入对应用户的~/.ssh/authorized_keys文件
  • 部署容器服务时,通常会配置根文件系统只读(比如Docker启动加了--read-only参数、Kubernetes工作负载配置了readOnlyRootFilesystem: true安全策略),/root目录没有写入权限,守护进程执行到创建/root/.ssh目录的步骤时,就会触发只读文件系统报错
  • 由于SSH密钥同步是定时轮询触发的,所以这条报错会反复在日志中打印
  • 对绝大多数运行业务服务的容器来说,根本不需要GCE平台下发SSH密钥做登录认证,这个同步操作本身是多余的,完全没必要为了消错开放整个根文件系统的写入权限。
修复方案

按推荐优先级排序:

  • 方案1(首选,无安全风险,不需要修改容器配置):通过GCE实例元数据禁用多余的账户同步逻辑
    直接在实例层面关闭不需要的守护进程功能,从根源阻止无效操作:

    • 停止当前运行的实例
    • 进入实例详情页的元数据配置栏,添加自定义元数据键值对:键为disable-accounts-daemon,值为true
    • 保存配置后重启实例,google-guest-agent不会再执行用户组维护、SSH密钥同步操作,对应重复日志会直接消失,完全不影响容器内业务的正常运行。
      如果需要保留OS Login登录能力,不需要完全禁用accounts模块,只需要添加元数据项enable-oslogin = true,守护进程会跳过root用户的本地密钥写入逻辑,也能解决报错。
  • 方案2(仅适用于确实需要在容器内通过GCE下发的SSH密钥登录的场景):单独给/root目录开放可写权限
    不要直接修改整个根文件系统为可写,仅给/root目录挂载可写层即可:

    • Docker启动时追加参数:--tmpfs /root:rw,mode=700
    • Kubernetes部署时,给容器添加/root路径的emptyDir类型可写挂载
      注意:普通业务容器不推荐使用这个方案,开放不必要的写入权限会提升容器逃逸的安全风险
  • 方案3:容器内屏蔽对应进程
    如果没有权限修改GCE实例元数据,可以在构建容器镜像时直接移除、屏蔽google-guest-agent的accounts模块,或者在容器启动脚本中关闭对应守护进程,也能阻止报错重复打印。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:57:52