遇“Read-only file system”需依次排查:1. 确认挂载状态并 remount,rw;2. 用 smartctl 检查磁盘 SMART 健康;3. 卸载后用 e2fsck 或 xfs_repair 修复文件系统;4. 以 dd/hdparm 测试底层 I /O;5. 核对 fstab 配置及 superblock 一致性。

一、确认文件系统只读状态并强制重新挂载
当系统提示“Read-only file system”且无法创建或修改文件时,通常表明内核因检测到 I / O 错误而自动将该分区以只读方式重新挂载。此行为是保护机制,防止进一步损坏。需先确认挂载状态,再尝试安全地重新挂载为读写模式。
1、执行 mount | grep -E "(sda|sdb|nvme)" 查看目标分区当前挂载选项,确认是否含 ro 标识。
2、运行 dmesg | tail -30 | grep -i "error|fail|buffer|ext4|xfs" 提取最近磁盘错误日志,定位触发只读的原始原因。
3、若日志未显示严重硬件故障,尝试强制重新挂载:mount -o remount,rw /dev/sdXN(将 sdXN 替换为实际设备名,如 sda1)。
4、验证是否生效:touch /mnt/test_rw && rm /mnt/test_rw;若成功,说明仅是临时保护挂载,非底层损坏。
二、检查磁盘健康状态(SMART 诊断)
SMART 数据可揭示磁盘物理层隐患,如坏扇区、重映射计数上升或不可纠正错误,是判断是否需更换 硬盘 的关键依据。必须在系统负载较低时执行,避免干扰业务 I /O。
1、安装 工具(如未预装):yum install smartmontools(CentOS/RHEL)或apt-get install smartmontools(Debian/Ubuntu)。
2、执行基础健康评估:smartctl -H /dev/sda;若返回 SMART overall-health self-assessment test result: FAILED,则 必须立即停止使用该盘并备份数据。
3、获取详细属性值:smartctl -A /dev/sda | grep -E "(Reallocated_Sector_Ct|Current_Pending_Sector|Uncorrect|Command_Timeout|Reported_Uncorrect)"。
4、重点核查:Reallocated_Sector_Ct > 0 或 Current_Pending_Sector > 0 或 Uncorrectable Sector Count > 0 均表示存在实质性物理缺陷。
三、扫描并修复文件系统错误
文件系统元数据损坏会导致挂载失败、目录结构异常或只读锁定。修复前必须确保分区已卸载,否则可能加剧损坏。ext4 与 XFS 需使用各自专用工具,不可混用。
1、卸载目标分区:umount /dev/sdXN;若提示“target is busy”,先执行 fuser -mv /mount/point 查杀占用进程。
2、对 ext4 分区执行强制检查与修复:e2fsck -f -y /dev/sdXN;其中 -f 强制检查(跳过“clean”标记),-y自动确认所有修复操作。
3、对 XFS 分区执行修复:xfs_repair /dev/sdXN;注意:XFS 不支持在线修复,且必须确保未挂载,否则命令将拒绝执行。
4、修复完成后,使用 mount /dev/sdXN /mnt/test 尝试挂载,并运行 ls -l /mnt/test 验证目录可读性与完整性。
四、检测底层块设备 I / O 稳定性(dd 与 hdparm 测试)
绕过文件系统层直接测试磁盘裸设备读写能力,可区分问题是源于文件系统逻辑错误,还是磁盘固件、控制器或物理介质失效。该步骤适用于怀疑存在间歇性 I / O 超时或随机读写失败的场景。
1、执行无缓存顺序读测试:dd if=/dev/sda of=/dev/null bs=1M count=1024 iflag=direct status=progress;观察是否出现 Input/output error 或速度骤降至 0。
2、执行小块随机写压力测试:dd if=/dev/zero of=/tmp/testwrite bs=4K count=100000 oflag=direct conv=fdatasync;该操作模拟数据库写负载,触发潜在坏道。
3、检测磁盘识别与响应延迟:hdparm -Tt /dev/sda;若 Timing buffered disk reads 结果持续低于 50MB/s(SATA SSD)或低于 10MB/s(HDD),且伴随 HDIO_DRIVE_CMD(identify) failed 警告,表明控制器通信异常或磁盘即将脱机。
五、排查挂载配置与元数据一致性
/etc/fstab 中错误的 UUID、挂载选项或文件系统类型声明,可能导致系统启动时反复失败并回退至只读挂载。同时,根文件系统 superblock 损坏也会引发相同症状,需通过备用块恢复。
1、获取设备当前 UUID:blkid /dev/sdXN;比对输出与 /etc/fstab 中对应行是否一致,UUID 不匹配是导致启动挂载失败的最常见配置错误。
2、检查 fstab 挂载选项:确认不含 ro、noauto 等限制项,且 defaults 后未误加 errors=remount-ro 以外的危险参数。
3、对 ext4 根分区,若无法挂载,尝试使用备用 superblock 修复:dumpe2fs -h /dev/sdXN | grep -i "superblock"获取备份块位置,再执行e2fsck -b 32768 /dev/sdXN(以 32768 为例)。
4、验证 fstab 语法正确性:mount -a;若报错,根据提示精确定位哪一行配置异常,禁止直接重启。