使用Ansible Playbook在Ubuntu上创建目录出现只读文件系统错误如何解决
错误原因
你遇到的[Errno 30] Read-only file system报错和目录权限设置无关,问题出在实例根文件系统的挂载属性:
- 该报错本质是根分区
/被挂载为只读状态,不管你给目标目录设置多大的权限位,都无法在只读文件系统上执行写入/创建操作 - 普通用户无权限在根目录创建目录的报错为
Permission denied,和当前报错类型完全不同,可直接排除权限位设置错误的问题 - 常见触发只读挂载的场景:系统启动时检测到文件系统损坏自动进入只读保护模式、云-init实例初始化配置异常、手动误操作将根分区设为只读
解决步骤
先验证根分区挂载状态
SSH登录到目标EC2实例,执行命令:mount | grep ' / '
如果输出结果中包含ro参数,即可确认根分区为只读挂载状态。临时修复挂载属性
执行以下命令将根分区重新挂载为可写状态:sudo mount -o remount,rw /
挂载完成后手动执行创建目录测试:sudo mkdir /scripts
如果能创建成功,说明挂载问题已临时修复。永久修复避免重启后复发
- 先检测根文件系统是否存在损坏:执行
sudo fsck -n /dev/root(-n参数为仅检测不修改,若检测出损坏,请先为实例创建快照后再执行修复操作,避免数据丢失) - 检查
/etc/fstab配置,确认根分区的挂载参数是否被误设为ro,正常配置应带rw或defaults参数 - 若你自定义过EC2实例的user data启动脚本,检查云-init配置是否存在设置根分区只读的相关规则
- 修正Ansible任务配置
普通用户默认没有在根目录下创建目录的权限,需要在任务中添加become: yes参数,以root权限执行操作,修正后的任务示例:
- name: Create scripts directory ansible.builtin.file: path: /scripts state: directory mode: '0755' become: yes
内容的提问来源于stack exchange,提问作者Prats
相关产品推荐
相关产品推荐

