磁盘变只读是内核因检测到严重错误(如坏道、I/O超时)主动挂载为ro,需立即查dmesg确认故障类型;若为物理损坏则停写换盘,若仅为journal失败且SMART无重映射扇区,可remount,rw并紧急备份;严禁fsck;SMART中Reallocated_Sector_Ct>0、Current_Pending_Sector>0、UDMA_CRC_Error_Count异常升高是硬盘将失效的关键指标;ddrescue前须停服务、禁TRIM、用-d -r3参数;镜像挂载必须ro,noload避免日志重放;数据恢复优先photorec,操作全程远离原盘。

磁盘突然变只读(read-only file system)怎么立刻应对
这不是系统“建议”你别写,而是内核已主动挂载为只读——通常意味着底层硬件或文件系统已检测到严重错误,继续写入可能扩大损坏范围。
先确认状态:
mount | grep " / "看根分区是否含
ro;再查日志:dmesg -T | tail -30重点找
end_request: I/O error、ata timeout、ext4_abort 这类关键词。
- 若
dmesg显示大量UNC(uncorrectable sector)或ABRT,基本可判定物理坏道或盘体故障,立即停写,准备换盘 - 若只是单次
ext4 journal failed,且smartctl -a /dev/sdX中Reallocated_Sector_Ct和Current_Pending_Sector为 0,可尝试强制重挂载读写:mount -o remount,rw /
,但必须同步备份关键数据 - 禁止在只读报错后运行
fsck—— 它默认会尝试修复,而此时设备可能已不稳定,强行 fsck 可能触发更多 I/O 错误甚至丢分区表
smartctl 输出里哪些字段真正预示硬盘快挂了
smartctl 不是看“Overall-health self-assessment test result: PASSED”就安心。很多消费级盘即使严重老化,这行也显示 PASSED。
盯紧这三列:
-
Reallocated_Sector_Ct:值 > 0 就该警惕;> 5 基本建议替换;数值持续上涨说明坏道在蔓延 -
Current_Pending_Sector:正在等待重映射的扇区数;> 0 表示磁头已无法稳定读取该位置,下次写入时可能触发重映射失败,直接导致 I/O hang 或只读切换 -
UDMA_CRC_Error_Count:如果远高于同批次其他盘(如 > 100),大概率是数据线松动或主板 SATA 接口老化,不是盘本身问题,换线/换口就能解决
执行命令时加 -d sat(如 smartctl -d sat -a /dev/sdb),避免某些 USB-SATA 转接器下识别不全。
用 ddrescue 备份故障盘前必须做的三件事
ddrescue 不是万能的“抢救神器”,它只负责尽可能多地复制还能读出的数据;顺序不对、参数乱设,反而会让盘彻底锁死。
- 先断开所有非必要服务(
systemctl stop docker nginx mysql),减少后台 I/O 干扰 - 用
hdparm -I /dev/sdX确认是否支持TRIM或NCQ,若支持,加--no-trim参数禁用,防止固态盘在救援中误触发擦除 - 首次运行务必加
-d(direct)和-r3(重试 3 次):ddrescue -d -r3 /dev/sdX /path/to/image.img /path/to/logfile.log
,跳过卡死区域,优先保全连续好区段
恢复出来的镜像如何安全挂载分析
直接 mount -o loop 故障盘镜像风险极高——如果原文件系统元数据已损坏,挂载过程可能触发内核 panic 或污染宿主机缓存。
- 永远用
mount -o ro,noload(ext 系列)或mount -o ro,loop,noatime(通用),其中noload会跳过 journal 重放,避免因日志损坏导致挂载失败 - 若挂载报
bad geometry或invalid blocksize,别硬试;改用debugfs查看结构:debugfs -R "stats" /path/to/image.img
,确认 superblock 是否可用 - 关键数据导出优先走
photorec(按文件签名恢复)而非依赖文件系统结构,尤其当e2fsck -n报大量inode not found时,说明目录树已断裂
最常被忽略的一点:所有恢复操作必须在另一块健康磁盘上进行,绝不要把镜像和恢复出的数据存回原盘或同一 RAID 阵列——那等于把故障源和备份放在同一个单点上。










