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

一、背景与目标
在生产环境中,服务器硬盘故障是一件非常常见也非常危险的事件。无论是 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_RATE与Reallocated_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
流程:
- 选择 Create 创建日志
- 选择对应磁盘
/dev/sdb - 分析分区类型(通常是 Intel/PC 分区)
- 选择 Analyse 进入分区扫描
- 若发现丢失分区,选择 Quick Search
- 若 Quick Search 失败,再执行 Deeper Search
- 选中要恢复的分区并标记为 primary/boot
- 写入新的 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 的核心思路是:
- 首先执行快速读取所有可访问区域
- 中断错误扇区,优先恢复大块可读区域
- 逐步重试坏扇区,尽可能恢复数据
- 所有过程生成日志 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 内置文件浏览,可定位具体文件,导出恢复:
- 在 TestDisk 主界面选择 Advanced
- 选择对应分区
- 进入 List 浏览文件
- 标记要恢复的文件,按
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 等工具恢复数据,这样最安全、风险最低。
更多推荐


所有评论(0)