在这里插入图片描述

一、背景与目标

在生产环境中,服务器硬盘故障是一件非常常见也非常危险的事件。无论是 RAID 控制器报警、SMART 预警还是磁盘直接无法挂载,都可能导致数据不可访问甚至数据丢失。

本文基于真实故障恢复经验,结合 Linux 系统、TestDisk 与 GNU ddrescue 两款开源工具,从硬件检测、故障定位到恢复流程、恢复评估全流程展开讲解。目标是帮助你在面对硬盘逻辑损坏与坏扇区时,有一套可落地的恢复方案。

适用场景包括:

  • 文件系统表损坏(如 partition table 丢失)
  • 引导扇区损坏(MBR/EFI)
  • 某些区域无法正常读取或读取超时
  • RAID 阵列单盘脱离后数据修复

二、故障机房环境与硬件配置

为更贴近真实场景,这里复现的故障香港服务器www.a5idc.com配置如下:

项目 配置
香港服务器型号 Dell PowerEdge R740
CPU 2× Intel Xeon Silver 4210 (20 线程)
内存 64GB DDR4 ECC
磁盘 4× 2TB SATA 7200 RPM 企业级
RAID 控制器 PERC H730P (Cache 2GB)
操作系统 Ubuntu Server 22.04 LTS
文件系统 EXT4 & XFS
故障磁盘 /dev/sdb(逻辑分区表损坏 + 坏扇区)

备注:

  • RAID 设定为 RAID5,因一块硬盘出现读写错误导致阵列降级。
  • 故障磁盘取出,通过 USB-SATA 转接在另外一台 Linux 备机上操作。

三、故障初步判断

常见故障表现包括:

  • mdadm --detail /dev/md0 提示某分区已脱离
  • smartctl -a /dev/sdb 显示 RAW_READ_ERROR_RATEReallocated_Sector_Ct 升高
  • 磁盘分区无法识别
  • 通过 mount /dev/sdb1 /mnt/recover 提示读错或 “bad superblock”

我们使用 SMART 检测初步确认硬盘健康状态:

# 安装 smartmontools
sudo apt update
sudo apt install smartmontools -y

# 查看详细 SMART 信息
sudo smartctl -a /dev/sdb

典型输出片段:

...
Reallocated_Sector_Ct:  1056
Current_Pending_Sector: 298
Offline_Uncorrectable:  43
...

这样的指标说明硬盘出现了大量重新映射扇区和未修复坏扇区。


四、核心工具简介

TestDisk

TestDisk 是一款开源恢复工具,擅长:

  • 恢复丢失的 Partition Table(分区表)
  • 修复引导扇区(MBR/EFI)
  • 恢复 FAT、NTFS、EXT 系列文件系统

安装方式:

sudo apt install testdisk -y

ddrescue(GNU ddrescue)

GNU ddrescue 用于数据挽救,尤其适合带坏块的磁盘:

  • 自动跳过坏扇区
  • 支持中断后继续
  • 生成日志 mapfile

安装方式:

sudo apt install gddrescue -y

五、分区表逻辑损坏修复:TestDisk 实战

5.1 启动 TestDisk 并创建日志

sudo testdisk

流程:

  1. 选择 Create 创建日志
  2. 选择对应磁盘 /dev/sdb
  3. 分析分区类型(通常是 Intel/PC 分区)
  4. 选择 Analyse 进入分区扫描
  5. 若发现丢失分区,选择 Quick Search
  6. 若 Quick Search 失败,再执行 Deeper Search
  7. 选中要恢复的分区并标记为 primary/boot
  8. 写入新的 partition table

5.2 实例操作过程截图(CLI 形式示例)

TestDisk 7.2, Data Recovery Utility
...
Select a media (use Arrow keys, then press Enter):
> /dev/sdb - 2.0 TB SATA Disk

Select partition table type, press Enter:
> Intel/PC partition
Analyse current partition structure and search for lost partitions
[ Quick Search ]
...
Found partition:
 * Linux  2048 3907029167 3907027120 [primary]
...
[ Write ]

完成后重启系统,再次尝试挂载。


六、坏扇区数据救援:ddrescue 实战

对于 TestDisk 无法修复的坏扇区及文件级读取失败,我们转向 ddrescue。

6.1 ddrescue 工作策略

ddrescue 的核心思路是:

  1. 首先执行快速读取所有可访问区域
  2. 中断错误扇区,优先恢复大块可读区域
  3. 逐步重试坏扇区,尽可能恢复数据
  4. 所有过程生成日志 mapfile,可中断/恢复

6.2 实操命令详解

sudo ddrescue -f -n /dev/sdb /data/rescue.img /data/rescue.log

参数解释:

参数 作用
-f 强制覆盖输出(必要时)
-n 无重试快速读取
rescue.img 目标镜像文件
rescue.log 日志 mapfile

完成后再次进行坏扇区重试:

sudo ddrescue -d -r 3 /dev/sdb /data/rescue.img /data/rescue.log
参数 作用
-d 使用 direct disk access
-r 3 每个坏扇区重试 3 次

6.3 救援进度示例输出

   ipos:    1234567899
   opos:    1234567000
   non-trimmed: 2345 MB
   non-scraped: 987 MB
   bad-sector: 13
   errors:  21
   at sector: 123456789

成功生成镜像后,我们可以基于镜像做进一步分析:

sudo mount -o loop,ro /data/rescue.img /mnt/recover

七、文件提取与内容恢复

7.1 通过 TestDisk 恢复单文件

TestDisk 内置文件浏览,可定位具体文件,导出恢复:

  1. 在 TestDisk 主界面选择 Advanced
  2. 选择对应分区
  3. 进入 List 浏览文件
  4. 标记要恢复的文件,按 C 导出

7.2 使用 photorec 恢复碎片文件

当文件系统损坏严重无法浏览目录时,可使用同套件下的 photorec:

sudo photorec /data/rescue.img

适合恢复照片、文档等文件类型,但恢复文件名/目录结构信息会丢失。


八、恢复效果评估与数据完整性校验

恢复后需要检查恢复数据完整性。

8.1 校验文件完整性

# 示例计算 MD5
md5sum /mnt/recover/path/to/file.iso > recovered.md5

比对原始 MD5(若有)。

8.2 性能与恢复比率对比表

工具 逻辑恢复能力 坏扇区容忍度 文件结构保留 适用场景
TestDisk ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐ 分区表/引导恢复
ddrescue ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐ 大规模坏扇区恢复
photorec ⭐⭐⭐⭐ 文件碎片恢复

九、最佳实践与注意事项

9.1 操作建议

  • 永远在镜像上恢复,而不是在原盘上直接修改
  • 在恢复之前对磁盘彻底检测 SMART
  • 记录所有操作日志以便追溯与复现

9.2 生产环境硬盘冗余建议

项目 最佳实践
RAID 方案 RAID6 或 RAID10
定期备份 每日快照 + 异地备份
健康监控 配合 Prometheus + alertmanager 报警
预警策略 SMART、阵列预警、文件系统健康检查

十、总结

通过 TestDisk 与 ddrescue 的组合,我们可以针对不同类型的硬盘故障采取不同策略:

  • TestDisk 适合修复逻辑损坏、分区表错误与引导扇区恢复。
  • ddrescue 更适合物理坏扇区和镜像级别的数据救援。
  • photorec 则用于碎片文件内容恢复。

在实际操作中,我们通常先使用 ddrescue 生成完整镜像,再在镜像上使用 TestDisk/photorec 等工具恢复数据,这样最安全、风险最低。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐