1. 这次分区表是怎么丢的:先别格式化,先冷静
先说一个我自己的故事。有一回给一台ubuntu双系统机器重装windows,装完发现ubuntu进不去了,grub直接消失,开机黑屏只剩一个光标。当时第一反应是“grub坏了”,准备拿live盘去修grub,结果lsblk一敲,整个/dev/sda只剩一个分区,原来的 /boot、/home 全都没了。那一刻心里咯噔一下,因为分区表被windows安装器整个重建了,不是grub的问题。
后来用testdisk把旧分区表完整找了回来,所有数据完好,grub也一并恢复。这篇文章就是要把这套流程完整拆开讲,从“为什么分区表会丢”到“testdisk怎么看候选结构”,再到“写回分区表的正确姿势”,每一步都配上实操细节和踩坑经验,希望能帮你把分区表从鬼门关拉回来。
先说清楚一件事:分区表丢了,不等于数据没了。分区表只是磁盘上记录“哪段扇区归哪个分区”的元数据,真正的文件内容都还在扇区里躺着。只要没被新数据覆盖,恢复的概率通常非常高。这一刻最忌讳的是手贱去格式化,或者拿新系统往同一个盘上装东西,把原有数据覆盖掉之后再神仙难救。
1.1 哪些情况会造成分区表丢失
分区表丢失不是小概率事件,我整理了几类最常见的触发场景:
- 双系统安装/重装:在已有linux的机器上重装windows,windows安装器会直接改写磁盘分区结构,尤其是在“自动分区”模式下,连确认提示都没有,原有分区记录就被清掉。
- 误格式化或误分区:在gparted里点错盘、fdisk时选了错误的设备、搞混了sda和sdb,都会瞬间把分区表重写。
- GPT和MBR互转出错:用工具直接转换分区表类型而不重建分区,容易出现表头损坏、备份表头丢失。
- 意外断电或磁盘掉线:正在写分区表时断电,或者硬盘盒不稳定导致磁盘中途断开,分区表写入到一半就坏了。
- 启动引导被破坏:实际分区表本身还在,但引导记录损坏,导致系统无法识别分区结构,看起来像分区表没了。
1.2 为什么不用格式化或重建来解决
我见过太多人一看到分区表空了就直接“重装系统”,或者用fdisk新建分区。这是最可惜的操作,因为新建分区表会写入全新的保护性MBR和GPT头,旧的分区记录被覆盖,恢复难度直接上一个台阶。
正确的逻辑是:分区表丢失后,先对磁盘做只读分析,不要做任何写入操作。testdisk这类工具的核心思路,就是扫描磁盘上的扇区,寻找残留的分区表项、引导扇区备份、文件系统超级块等标记,然后在内存里重建出候选分区结构,等你自己确认无误后才写回磁盘。
还有一点,如果你对数据不敏感、系统里也没什么要留的东西,那重装确实更快。但如果你还有文件、数据库、项目代码、照片这些重要资料,就值得花个把小时用testdisk试一下。工具本身免费开源,linux下安装也只要一条命令,这笔账怎么算都划算。
2. testdisk是什么:不只是恢复分区表的瑞士军刀
testdisk是CGSecurity出品的一款开源数据恢复工具,围绕“恢复丢失的分区”和“修复引导扇区”做了大量功课。它支持的场景包括分区表重建、引导扇区修复、FAT/NTFS/ext4等文件系统的恢复,同时也能配合photorec做文件级恢复。
很多资料会把testdisk和photorec混为一谈,因为它们打包在同一个安装包里。但两者的工作方式有本质区别:
| 对比项 | testdisk | photorec |
|---|---|---|
| 恢复级别 | 分区级、表项级 | 文件级 |
| 是否保留文件结构 | 保留,恢复后可正常挂载使用 | 不保留,按文件签名组合文件 |
| 恢复效果 | 分区表恢复后,目录和文件都在 | 文件名可能丢失,大量文件堆积 |
| 适合场景 | 分区表丢失、引导扇区坏 | 分区严重损坏、格式化后写入过数据 |
从这个对比就能看出,分区表丢失时优先用testdisk,它是“把你原来的分区结构原样找回来”,恢复完成后比文件级恢复干净得多。photorec是万不得已时的兜底方案,因为就算把图片、文档捞出来,原来的目录结构和文件名也基本没了。
2.1 为什么优先选testdisk而不是其他工具
Linux下能恢复分区表的工具不止testdisk一个,比如gpart有“恢复丢失分区”的扫描功能、fdisk也支持“同步分区表”,但testdisk有几个明显优势:
- 交互式扫描机制:不是全自动猜测,它会把每次扫描到的候选分区结构列出来,让你选。这意味着有判断空间,也符合“眼见为实”的恢复原则。
- 支持的文件系统类型多:ext2/ext3/ext4、NTFS、FAT12/16/32、HFS+、XFS等都能识别,双系统场景尤其方便。
- 写回前有充分的确认环节:从分区列表、引导扇区类型、到最终写入前的“确认写入”,每一步都有明确提示,不容易误操作。
- 依赖极少,live环境即可用:一个系统U盘就能启动,不需要额外装配环境。
2.2 安装testdisk:几个常见入口
在ubuntu上安装testdisk非常简单,直接在终端敲:
sudo apt update sudo apt install testdisk如果当前系统已经进不去了,就用ubuntu安装盘的“试用ubuntu”模式,进入live桌面后在终端里执行同样的命令。需要说明的是,live环境里可能要先启用universe软件源,一般ubuntu官方live镜像默认已经配置好。
有一条经验分享一下:如果磁盘是NVMe固态,或者挂在RAID控制器下面,live环境可能识别不到盘。这时候先确认内核有没有对应驱动,比如Intel RST的机器要在BIOS里把SATA模式从RAID切换到AHCI,否则testdisk打开磁盘时会直接报“无法打开设备”。
3. 完整恢复流程:testdisk实操全程拆解
我不打算只给你一堆按键说明,而是把完整流程从头到尾走一遍,包括每个关键节点我做了哪些判断、为什么那么判断。下面的操作,全程以root权限执行,最好先把目标磁盘从挂载状态卸载掉。
先确认一下磁盘当前的状态。用lsblk或者fdisk看一眼:
sudo lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT假设我们要操作的是 /dev/sda,里面原有一个ext4根分区、一个swap分区,现在分区表被清空,磁盘在系统里显示为一个无分区的整块盘。接下来进入testdisk。
3.1 创建日志文件:不是鸡肋,是救命稻草
启动命令:
sudo testdisk选择“Create”创建日志文件,千万别选“No Log”。很多人嫌日志文件没用,但实际恢复时,日志会记录下扫描过程和每一步的选择。万一恢复完成后发现某个分区还是缺失,翻日志就能定位是哪一步漏了。而且testdisk在写回分区表前也会参考日志里的扫描信息,不用白不用。
日志文件会生成一个testdisk.log在当前目录下,建议直接放在root目录或者home目录,便于事后查阅。
3.2 选择磁盘设备:看清楚盘符再下手
接下来是设备选择界面。这里会用/dev/sda、/dev/sdb这样的盘符列出所有磁盘,注意看Size字段,这是判断是不是目标盘最直观的依据。千万别只看盘符,因为多硬盘机器上盘符和物理磁盘的对应关系不一定是你印象里的样子。
我吃过一次亏:一台机器上挂了旧数据盘和新系统盘,当时没仔细看大小,选了/dev/sdb做恢复,扫描半天发现全是一堆无关的NTFS分区,才意识到搞错盘了。所以,一定先对照lsblk输出,确认串号和容量匹配,再回车进入下一步。
选择磁盘后,testdisk会问你分区表类型,一般默认是Intel(对应MBR),如果你的磁盘是GPT,则应该选EFI GPT。大家可以这样判断:如果原来安装的是ubuntu 18.04之后的64位系统,基本默认GPT;如果是老机器或32位系统,大概率MBR。不确定也没关系,testdisk会在扫描后自动识别出实际的分区结构类型,到时按实际情况选择即可。
3.3 选择分析方式:从“快速扫描”开始
分区表类型确认后,进入操作菜单:
- [ Analyse ] 分析当前分区结构并快速查找丢失分区
- [ Advanced ] 文件系统实用工具
- [ Geometry ] 磁盘几何参数
第一次恢复,直接选Analyse。这个模式会先读当前磁盘上的分区表,然后做一次快速扫描,把可能存在的分区标识找出来。
快速扫描的过程中,testdisk会逐扇区排查引导扇区、文件系统超级块等标记,速度取决于磁盘容量。对于一块1TB的机械硬盘,快速扫描可能只要几分钟;如果是4TB大容量盘,则建议有耐心等。扫描期间会显示进度百分比,不需要额外干预。
扫描结束后,testdisk会列出找到的分区记录。如果列表里已经出现了你印象中的那几块分区,而且大小、文件系统类型都匹配,那就很乐观了。注意先不要急着写入,你还需要确认更多信息。
3.4 深度扫描:当快速扫描不起作用时
如果快速扫描出来的结果不完整,或者只找到了一部分分区,不要慌张,这是常见情况。在结果列表界面,选中分区列表上方那行带星标的选项,选择“Deeper Search”,进入深度扫描。
深度扫描的原理和快速扫描有本质区别:快速扫描找的是分区表项和引导扇区标记,深度扫描则遍历整个磁盘,搜索每个扇区中可能存在的文件系统特征。比如ext4文件系统有固定的超级块偏移,NTFS有DBR引导扇区,testdisk会根据这些特征把候选分区“挖”出来。
深度扫描的时间明显长很多,一块2TB机械盘可能要跑1-2小时。如果你在SSD上操作,速度会快一些,但也需要耐心。这个过程是完全只读的,数据不会被改动,可以放心让它跑完。
3.4.1 深度扫描后的候选列表怎么读
深度扫描结束后,testdisk可能返回大量候选分区,这里有个很容易踩坑的地方:它可能会找到好几个重叠的候选区段,看起来都是ext4分区,大小还差不多。比如:
ext4 100GB 1GB 101GB ext4 101GB 1GB 102GB ext4 100GB 2GB 102GB这些重叠分区实际上是同一块真实分区的不同边界猜测,你不可能把每个都写上。判断方法很简单:在候选列表上按P键预览文件内容,哪个候选能列出你眼熟的目录结构(home、etc、usr这些),那大概率就是真实分区。如果预览时提示无法读取文件系统,就跳到下一个候选继续试。
3.5 写入分区表:最关键的“按回车”
找到正确的分区组合后,按回车把候选分区标记为“已恢复”,此时分区列表里会出现一个带星标的状态行。按键盘上的P可以预览分区内容,确认无误后,按“Write”进入写入流程。
testdisk会给出一个非常醒目的警告,提示“写入后当前分区表将被覆盖”,并要求你输入“y”确认。这时候要检查两件事:
- 分区列表里确实包含了所有该有的分区,数量、类型都对得上。
- 没有漏选、没有多选重叠分区。
确认无误后,输入y并回车,testdisk执行写入操作,将重建好的分区表写入磁盘。写完后按“Quit”退出testdisk。
如果是GPT分区表,testdisk还会提示写入备份GPT头到磁盘尾部,同样输入y确认。这一步很重要,备份GPT头是分区表数据的副本,坏了还能靠备份恢复。
3.6 重启验证:分区表恢复后的收尾工作
退出testdisk后,先用partprobe或者重启让内核重新读取分区表。在live系统里,可以这样验证:
sudo partprobe /dev/sda sudo lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT如果分区、文件系统类型都正确显示出来,可以尝试挂载一下根分区:
sudo mkdir -p /mnt/recovery sudo mount /dev/sda1 /mnt/recovery ls /mnt/recovery看到熟悉的home、etc、usr目录时,心里的石头基本就落地了。这时候再重启进原来的系统,grub引导也应该恢复,因为/boot在分区里,分区表找回来后引导链自然就通了。
4. 实操中一定会遇到的坑:排查手册和避坑经验
这部分我想分享一些成绩之外的东西,就是各种翻车现场和对应的解决思路。恢复分区表是个精细活,每个环节都可能出幺蛾子,但绝大多数问题都有规律可循。
4.1 扫描出来了但预览不到文件内容
候选分区列表里出现了分区,但按P键提示“Can't open filesystem. No such file or directory”。这种情况通常说明,该候选分区的起始位置或大小不准确。即使它看起来大小差不多,只要边界偏移了几个扇区,文件系统元数据就读不出来。
处理办法:继续往下翻候选列表,找一个能正常打开文件系统的候选分区。如果实在没有,就把边界大致相近的候选都预览一遍,一定有某个分区能正确识别文件系统。
另一个冷门原因是文件系统本身已经损坏,比如ext4超级块被破坏了。这时可以用testdisk的Advanced菜单,尝试修复备份超级块。这个操作属于进阶玩法,新手如果只是想救数据,建议直接跳到photorec做文件级恢复。
4.2 扫描结果里分区大小和原来不一致
有时扫描出来的分区大小会跟原来印象中有几十MB甚至几百MB的偏差。这个偏差通常来自分区起始扇区的细微差异。对于ext4、NTFS这类文件系统,只要偏差不是太大,系统还是能正常挂载的,因为文件系统内部有冗余元数据,能容忍一定程度的起始偏移。
但如果偏差明显异常,比如原分区是100GB,扫出来只有50GB,那就别写了,大概率是识别错了,写回去后分区结构会混乱。继续深度扫描,找到正确候选为止。
4.3 写回后重启直接卡在grub rescue
这种情况我遇到过,分区表是恢复成功了,lsblk也能看到分区,但引导还是不进系统。大概率是引导加载器本身的位置不对。解决办法是重新安装grub:
# 进入live环境 sudo mount /dev/sda1 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt grub-install /dev/sda sudo chroot /mnt update-grub这里用到了chroot,相当于走进那个已经恢复分区的系统里,把grub重新装一遍。操作完成后重启,引导就回来了。如果原来用的是UEFI引导,还要挂载EFI分区到/boot/efi,再执行grub-install。
4.4 写入分区表前必须做的一次全盘备份
我每次做分区表恢复前,都会先备份当前损坏状态的磁盘头部。具体来说,是把前几个MB的原样数据保存下来:
sudo dd if=/dev/sda of=/path/to/backup/partition-header.img bs=512 count=2048这样做的意义是:万一testdisk写入后的结果比之前还差,还能用这条备份把磁盘还原到“损坏但可再试”的状态。这是个后悔药,不需要占用太多空间,但能给你试错的勇气。同理,如果你在恢复前还能备份整个分区表,用sgdisk可以做:
sudo sgdisk --backup=/path/to/backup/gpt-backup.img /dev/sda这个命令适用于GPT分区表,能完整保存主表和备份表。恢复时用sgdisk --load-backup写回去,也是一种备选方案。
5. 几个容易忽略的小细节:装系统前的分区表备份
实际经验告诉我,最好的恢复是“完全不需要恢复”。这里分享几个平时就能做的分区表保护措施,成本极低,效果极好。
5.1 定期导出分区表快照
排个cron任务,定期把分区表导出到另一块磁盘上:
sudo sgdisk --backup=/mnt/backup/sda-gpt.sgd /dev/sda这个文件很小,一个GTP备份表也就几十KB。对于MBR分区表,用sfdisk也能做到:
sudo sfdisk -d /dev/sda > /mnt/backup/sda-mbr.txt系统出问题时,拿这个文件回放分区结构,比任何扫描都快、都准。很多人以为分区表备份只有“系统迁移”时才需要,其实防患于未然才是正道。
5.2 双系统机器的重装前检查单
如果你准备在已有ubuntu的机器上重装windows,先花两分钟完成下面这几件事:
- 用sgdisk或sfdisk导出当前分区表到另一块磁盘。
- 记录下ubuntu根分区、/home分区、swap分区的起始扇区号。
- 如果不常用windows,干脆用虚拟机代替双系统,从源头杜绝分区表被重写的风险。
- 如果必须装双系统,安装windows时选择“自定义安装”,只选择原来的windows分区作为安装目标,不要动其他分区。
这份检查单是我自己在多次双系统翻车之后总结出来的。以前总觉得“我这次注意点就行了”,结果windows安装器常常在你看不见的地方做调整,等你反应过来,ubuntu那边已经进不去了。
5.3 不要迷信“扫描万能”,时间成本也要算
虽然testdisk扫描很强大,但全盘深度扫描的时间成本很高。做恢复之前,先盘算一下磁盘里到底有什么重要的东西。如果只是一台纯实验用的虚拟机,直接重建分区、重装系统反而更省事。数据恢复是“值得才做”的操作,不是每次都要用最重的手段。
如果磁盘里确实有不可替代的数据,那就再耐心一点。深度扫描期间可以做点别的事,别一直盯着进度条,那只会让自己更焦虑。
6. 最后想说的几句实在话
分区表恢复这件事,本质上是一场“和磁盘元数据的对话”。你不需要懂得每一个扇区的排列规则,但你需要理解testdisk每一步操作背后的逻辑:它不是在“猜”,而是在扫描和匹配已知的特征;它不是直接覆盖你的磁盘,而是把恢复方案陈列在面前等你确认;它给你选择权,也给了你犯错的可能。
我个人总共用过testdisk十几次,最成功的一次是把一台被windows安装器重写过整个分区结构的磁盘原样恢复,连/var下的数据库都没丢。最失败的一次是在一个候选分区上强行写入,结果重启后其他分区全乱了,最后靠应急备份才还原回来。这些经验让我明白一个道理:恢复分区表,慢就是快,稳才是王。
如果你手头也在经历类似的问题,希望这篇文章能帮你多一分镇定。按着步骤一步步来,多按P键预览,少做多余操作,多半都能把数据平安带回来。等系统重新跑起来那天,你会觉得这几个小时的折腾完全值得。