文件系统修复会重写元数据,以恢复内部一致性。它可能丢弃损坏的引用或数据;存储硬件正在故障时,修复还可能加剧损失。应把修复视为恢复操作:先保留证据和可恢复数据,再使用针对准确文件系统类型编写的工具。
文件系统 · 第 10 课
文件系统修复
学习如何诊断文件系统损坏,并在有备份的前提下选择特定类型的离线修复流程。
修复前先诊断
I/O 错误、重新挂载为只读、文件丢失或挂载失败等症状,并不都能证明文件系统已经损坏。先收集只读证据:
$ findmnt --target /affected/path
$ lsblk -f
$ journalctl -k -b
检查存储栈、设备健康状况、线缆或网络路径、RAID 状态、加密和近期事件。如果设备正在故障,反复扫描可能耗尽它剩余的寿命。可行时,应使用面向恢复的工具创建映像或克隆件,并在副本上操作。
可能存在硬件故障时,在执行可写文件系统修复前应该做什么?
识别准确的文件系统与设备
确定文件系统是位于分区、逻辑卷、RAID 设备、加密映射还是整个磁盘上。不能仅仅因为 /dev/sda1 子分区受到影响,就对 /dev/sda 运行检查器。
使用 lsblk -f、blkid、findmnt 和各存储层工具映射目标。检测到的签名可能过时,因此要与已知配置和备份相互核对。
如果 ext4 位于 /dev/sda1,它的 ext4 检查器通常应该接收哪一层?
让文件系统离线
大多数传统一致性检查器都要求文件系统已经卸载。挂载的文件系统会在检查器读取时持续变化,而修复写入可能与内核缓存状态冲突,造成损坏。
停止依赖服务、卸载嵌套文件系统、让进程工作目录离开目标,并按需停用上层结构。对于根文件系统,应启动到救援环境,或使用发行版提供的离线检查机制。通过 findmnt 确认目标在相关命名空间中没有挂载。
为什么通常应该先卸载文件系统,再让修复检查器写入?
使用文件系统专用工具
fsck 是一个可以调用文件系统专用辅助程序的前端,而不是通用修复引擎。不同流程包括:ext 文件系统使用 e2fsck,XFS 使用 xfs_repair,Btrfs 则使用其专用诊断和恢复工具。
名称相似的选项可能具有不同语义,尤其不能照搬另一种文件系统指南中的 --repair 或强制选项。应阅读已安装工具的手册,以及当前项目或发行版恢复文档。如果实现提供可靠的无修改或诊断模式,应从该模式开始,保存输出并理解建议的修复内容。
Linux 上的 fsck 通常负责什么?
验证并恢复服务
记录修复工具、版本、选项、输出和退出状态。修复后,再次检查设备健康状况;适当时先以只读方式挂载,检查关键数据并与已知备份比较。随后逐步恢复普通挂载和服务,同时监控内核与应用日志。
文件系统能够挂载,并不能证明每个文件都正确。应从备份恢复丢失或损坏的应用数据,并在应用层进行验证。
修复后成功挂载能证明所有应用数据都正确吗?
课程已完成
你已完成 文件系统修复
现在,你可以把文件系统修复规划为分阶段恢复流程。
写入前诊断硬件,并保留可恢复数据。
映射直接包含该文件系统的准确块设备层。
让文件系统在相关命名空间中离线。
使用文档规定的文件系统专用诊断和修复工具。
分别验证设备健康、文件系统状态和应用数据。