根文件系统意外变成只读状态,是运维工作中比较棘手的一类故障。表现通常是执行任何写操作都会报错,比如用touch /tmp/test提示Read-only file system,用echo向配置文件写入内容失败,服务日志也无法落盘。这种情况多见于服务器异常断电、磁盘老化或者文件系统元数据损坏之后。本文从原因分析入手,再给出具体的排查和修复步骤,最后总结预防措施。

一、根文件系统为什么会变成只读
Linux在检测到文件系统出现严重不一致或者底层磁盘IO持续报错时,内核会将对应的文件系统重新挂载为只读,这是一种自我保护机制,目的是防止数据进一步损坏。理解了这一点,排查方向就清晰了:要么是文件系统本身坏了,要么是底层存储出了问题,要么是挂载配置写错了。
常见的触发原因有以下几类。第一,异常断电或强制关机导致日志回放失败,ext4或xfs的元数据没有正常落盘,重新启动时内核为了保证一致性直接以只读方式挂载。第二,物理磁盘出现坏道或者SSD寿命耗尽,写入持续失败,内核触发保护。第三,RAID卡掉线、SAN存储链路抖动、虚拟化宿主机存储异常等底层故障。第四,/etc/fstab中的挂载参数配置错误,比如把选项写成了ro,导致开机即只读。第五,某些主机安全加固或容器场景下管理员主动设置了只读挂载,属于预期行为而非故障。
排查的第一步永远是看内核日志,错误信息基本都在里面:
dmesg | tail -50 # 或者查看持久化日志 journalctl -k | grep -iE "error|read-only|ext4|xfs|I/O"
如果看到类似Remounting filesystem read-only、EXT4-fs error、I/O error这样的输出,就能确认触发原因。另外用mount | grep ' / '查看根分区当前的挂载选项,如果输出包含ro,,说明确实处于只读状态。
二、临时恢复读写与fsck修复
如果确认底层磁盘没有硬件故障,只是内核因瞬时错误将文件系统切换成了只读,可以先尝试在线重新挂载为读写,这一步不需要重启:
mount -o remount,rw /
执行后再用mount | grep ' / '确认选项变成了rw。需要注意,remount只是临时手段,如果文件系统已经存在元数据错误,它可能无法成功,或者过一会儿又变回只读,此时必须进行离线修复。
离线修复使用fsck工具。由于根分区自身在被修复时不能处于挂载使用状态,最稳妥的方式是重启进入救援模式(rescue模式)或者用LiveCD/U盘启动,然后对设备执行检查和修复。以ext4为例:
# 先卸载或确保目标分区未挂载 umount /dev/sda1 # 检查文件系统(不加-y会逐项询问) fsck -y /dev/sda1 # 修复完成后再挂载验证 mount /dev/sda1 /mnt mount | grep sda1
如果根分区是xfs文件系统,处理方式不同。xfs不能用传统fsck,而要用xfs_repair:
# 先尝试干跑查看问题 xfs_repair -n /dev/sda1 # 实际执行修复,-L会清空日志,仅在日志回放失败时使用,有数据丢失风险 xfs_repair /dev/sda1 xfs_repair -L /dev/sda1
-L参数会强制丢弃日志中的未落盘事务,可能导致部分最近写入的数据丢失,属于最后手段,执行前最好先对磁盘做块级备份。修复完成后重启,观察系统是否能以读写方式正常挂载根分区。
三、检查挂载配置与磁盘健康
如果每次开机根分区都自动变成只读,八成是配置问题。打开/etc/fstab检查根分区的挂载选项,正常应该是类似下面这样:
/dev/sda1 / ext4 defaults 0 1 UUID=xxxx-xxxx / xfs defaults 0 0
如果第四列出现了ro,改成defaults或rw即可。另外确认设备名或UUID没有写错,用blkid命令核对实际分区的UUID,避免因为引用了不存在的设备导致挂载降级。改完后用mount -o remount /或在其他分区执行systemctl daemon-reload让改动生效。
配置没问题但故障反复出现,就要怀疑硬件了。对于机械盘和SATA/SAS盘,查看SMART信息:
smartctl -a /dev/sda # 重点关注 Reallocated_Sector_Ct、Current_Pending_Sector、UDMA_CRC_Error_Count
如果Reallocated_Sector_Ct(重映射扇区数)持续增长,或者存在Current_Pending_Sector(待处理坏扇区),说明盘体正在退化,应尽快备份数据并更换磁盘。阵列环境下还要登录RAID卡管理界面查看虚拟盘状态,确认是否有成员盘掉线或阵列降级。
最后是预防层面:重要业务尽量使用日志型文件系统并配置UPS避免异常断电;建立定期备份机制,fsck修复并不能保证数据百分之百完整;虚拟机场景注意宿主机存储不要超分过载,底层IO延迟过高同样会诱发文件系统错误。把监控告警覆盖到磁盘SMART指标和文件系统只读事件,可以在故障扩大之前及时介入。