TestDisk & PhotoRec 数据恢复实战:免费重建分区表 + 找回误删文件
【免费下载链接】testdiskTestDisk & PhotoRec项目地址: https://gitcode.com/gh_mirrors/te/testdisk
TestDisk 负责修复损坏的分区表,PhotoRec 做文件级数据恢复,两者免费开源、互相配合。照本文操作一遍,你能独立修复一块丢失分区的磁盘,并把误删的照片从扇区里扫回来。
🔴 先立三条保命规矩
- 停写入
每多一次写入,原始数据被覆盖的概率就高一分。
- 换盘存
恢复到本盘会直接覆盖你还没救出来的数据。
- 留日志
出问题时有据可查,报问题时也能附上过程记录。
30 秒诊断:你的数据现在处于哪种状态
先对号入座,再决定动哪个工具:
| 症状 | 判断 | 对应工具 |
|---|---|---|
| 文件/文件夹消失了,分区还在、还能进 | 索引被删,扇区里的原始数据通常还在 | PhotoRec |
| 磁盘显示"未初始化",分区整体消失 | 分区表损坏,容器结构丢了 | TestDisk |
| 装双系统后引导失败,进不了原有系统 | 引导扇区或分区结构被改动 | TestDisk |
| 读取极慢、固定位置卡住、SMART 报坏道 | 盘体有坏块,反复读盘会加速恶化 | 先ddrescue做镜像,再选上面任一 |
一句话决策:结构坏了找 TestDisk,内容丢了找 PhotoRec,两者可组合。
原理速览:为什么删了还能找回,坏了还能修
把磁盘想象成图书馆:分区表是书架旁的目录卡。目录卡烧了(分区表损坏),书还在架上——TestDisk 的工作是把目录重新排对,重新定位每个"书架"(分区)的起止位置并写回。PhotoRec 干脆不看目录卡,而是沿书架逐本核对书脊上的 ISBN,按文件头签名把"书"一本本捡出来,这就是 file carving。代价是书脊上没有登记处信息:恢复出的文件按类型丢进recup_dir.d这类子目录,原始文件名和目录结构没了,需要自己重新整理。
所以组合路径是:先用 TestDisk 修复结构,分区能挂载时大部分数据直接回来;仍然拿不到的部分,再交给 PhotoRec 做文件级扫描。
跟着走一遍:安装 + 第一次恢复
发行版直接装现成包,两个命令testdisk和photorec一起装上:
# Ubuntu / Debian sudo apt-get install testdisk# Arch Linux sudo pacman -S testdisk# macOS brew install testdisk需要最新功能时从源码编译:
git clone https://gitcode.com/gh_mirrors/te/testdisk ./autogen.sh && ./configure && make && sudo make install线路 A:重建丢失的分区表(TestDisk)
先lsblk或fdisk -l确认设备名,别选错盘。然后:
sudo testdisk /log /dev/sdb/log生成日志文件。界面关键步骤:
- 选[Create]建立日志;
- 分区表类型选Intel,新系统/苹果选GPT;
- 按Analyse进入分析,再选Quick Search;
- 找到分区后核对起止位置与容量是否合理;
- 用P标记为 Primary;
- 按Write写回分区表,重启验证。
线路 B:从扇区里捞文件(PhotoRec)
sudo photorec /log /d /data/recovery /dev/sdb1/d指定恢复文件的保存目录,必须指向另一块物理盘——这是最容易翻车的参数,写之前用df -h复核一遍。界面关键步骤:
- 选择要扫描的分区(或整盘);
- 文件系统类型不确定就选Other;
- 确认保存位置在别的磁盘;
- 按Search开始扫描,Ctrl+C 可中途停止;
- 结束后到
recup_dir.d等子目录按类型找文件。
参数速查 & 提速技巧
| 参数 | 适用工具 | 作用 |
|---|---|---|
/log | 两个都有 | 生成日志文件,出问题必开 |
/logname 文件名 | 两个都有 | 指定日志文件名 |
/debug | 两个都有 | 输出调试信息,报问题时附上 |
/d 目录 | PhotoRec | 指定恢复文件保存目录 |
/all | 两个都有 | 跳过交互提示,按默认值执行 |
/list | TestDisk | 列出系统识别到的所有磁盘 |
/cmd | 两个都有 | 命令行模式,适合写脚本 |
提速与排错:
- 只扫分区不扫整盘:交互界面里可以限定扫描范围,
Quick Search比全盘扫描快得多,范围越精确越快。 - 坏道盘先镜像再干活:
ddrescue /dev/sda /data/sda.img /data/sda.log,坏块会被跳过并记录进度,可中断续跑;之后所有操作对着.img做,原盘不再受任何写操作影响。 - 日志常开:
/log几乎没有额外开销,但报问题时能完整交代扫描过程,省掉一半猜谜时间。
🚨 翻车现场自救
进度条卡在某个百分比不动
原因:扫描区域有坏道,或正在识别一个大文件。对策:先smartctl -a /dev/sda查盘体状态(需安装 smartmontools);有坏块就转 ddrescue 镜像流程;确认盘是健康的就耐心等,或 Ctrl+C 停掉改扫分区。
恢复出来的文件打不开、内容残缺
原因:原始数据已被新写入覆盖,或文件在盘上是碎片化存储、签名切割拼不完整。对策:发现丢失后第一时间操作;用df -h确认恢复目录在别的盘;恢复出的关键文件先逐个打开验证,能用的先归档。
SSD 上删了的数据找不回
原因:TRIM 会在删除后很快清零物理块,和机械盘"数据还在、只是索引没了"是两回事。对策:误删后立即停止对 SSD 的一切写入;cat /sys/block/sda/queue/discard_max_bytes非零说明 TRIM 生效,若触发过 TRIM,多数情况只能靠备份。
操作之后盘更糟了
原因:最常见的错误是把恢复目录放到了被恢复的盘上,扫描写入直接覆盖原始数据。对策:立刻df -h看目标目录挂在哪块物理盘;恢复目录必须独占另一块盘,没有空盘就先ddrescue整盘备份。
想改源码?看这里(简写)
src/目录的命名规律很直白:partgpt.c、parti386.c、partmac.c等part*.c各管一种分区表格式,file_*.c每个文件对应一种文件类型的签名识别,diskacc.c是磁盘访问层,filegen.c是统一识别引擎。添加新格式三步:新建src/file_xxx.c实现文件头/尾检查函数 → 在filegen.c注册 → 加入src/Makefile.am编译列表。细节以项目最新文档为准。
行动备忘
- 停止对丢失磁盘的一切写入,能断电就断电
- 用
lsblk确认设备名,判断是分区结构还是文件内容的问题 - 坏道盘先
ddrescue做镜像,后续全部在镜像上操作 - 写盘前用
df -h复核恢复目录在另一块物理磁盘 - 每次运行都带
/log,保留日志 - 恢复完成先抽查关键文件能否正常打开,再整体归档
- 定期备份 + 季度导出一次分区表——备份永远排在任何恢复工具之前
【免费下载链接】testdiskTestDisk & PhotoRec项目地址: https://gitcode.com/gh_mirrors/te/testdisk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考