硬盘数据恢复怎么做:逻辑故障与物理故障的处理步骤
硬盘数据恢复的第一步不是找软件,而是立刻停止写入,判断故障类型。误删、格式化、分区丢失这类逻辑故障,先用 ddrescue 把整盘做成镜像,再在镜像上用 TestDisk、PhotoRec 恢复;有异响、不识别、固态掉盘这类物理故障,以及 RAID 的成员盘,不要自己动手,断电后送专业实验室。
硬盘坏了,里面的数据多数情况下能恢复,能恢复多少取决于两件事:故障属于哪一类,以及出事之后你做过什么。逻辑故障(误删、格式化、分区表丢失、文件系统损坏)盘本身是好的,按“停止写入、整盘镜像、在副本上恢复”的顺序操作,成功率通常很高;物理故障(磁头、电机、电路板、固态主控坏了)需要洁净间和专用设备,自己能做的只有断电、记录现象、送修。真正让数据无法挽回的,往往不是故障本身,而是故障之后的误操作:继续写入、在原盘上跑修复、照提示格式化、反复通电。
先判断:逻辑故障还是物理故障
| 现象 | 故障类型 | 第一步 |
|---|---|---|
| 误删文件、清空了目录 | 逻辑 | 立即停止往这个分区写入 |
| 误格式化、误重装了系统 | 逻辑 | 同上;如果是固态盘,先看后文 TRIM 一节 |
| 分区不见了,磁盘管理里显示“未分配” | 逻辑,分区表损坏 | 不要新建分区,用 TestDisk 找回 |
Windows 显示 RAW、提示需要格式化;Linux 挂载报 wrong fs type 或 bad superblock |
逻辑,文件系统元数据损坏 | 不要格式化,不要直接对原盘跑 chkdsk 或 fsck |
能识别,但读取极慢,dmesg 里大量 I/O error,SMART 待映射扇区持续增长 |
物理,坏道,但盘还能读 | 尽快用 ddrescue 做镜像,不要再跑全盘自检 |
| 通电后有咔哒声、周期性敲击声,或者电机不转 | 物理,磁头或电机故障 | 立即断电,送实验室 |
| BIOS 或阵列卡里看不到这块盘;或容量变成很小的数字、型号变成奇怪的名字 | 物理,固态盘主控或固件故障,也可能是机械盘固件故障 | 断电,送实验室 |
| 固态盘能读不能写 | 部分固态盘寿命耗尽后进入只读保护 | 趁还能读,立刻把数据拷出来 |
| RAID 虚拟盘离线,多块成员盘报错 | 阵列故障 | 停止一切阵列操作,见后文 |
型号变成奇怪的名字,一个典型例子是部分群联主控的固态盘在固件出错后,会被识别成 SATAFIRM S11。这是主控固件故障的表现,数据并没有被清空,但需要专业设备处理固件才可能读出来。
还有一点和平时排查硬盘不同:平时判断硬盘好坏,会跑一次 SMART 长自检让盘把全盘读一遍;但数据要紧、盘又已经在报错时,长自检会让本来就吃力的磁头把每个扇区都读一遍,等于在做镜像之前先消耗掉一部分“剩余寿命”。顺序应该是先镜像,后自检。
千万别做的操作
- 继续往这块盘写东西。包括把恢复软件装到这块盘上、把恢复出来的文件存回原盘、让数据库和日志服务继续运行。每一次写入都可能覆盖掉要找的数据。
- 直接在原盘上运行 fsck、chkdsk 或 xfs_repair。修复程序会改写文件系统的元数据,修对了万事大吉,修错了就回不去。要修,在镜像副本上修。
- 照提示格式化。Windows 弹出“需要将其格式化”的对话框时点取消;格式化会重写元数据,在固态盘上还会对整个分区执行 TRIM。
- 在固态盘上重新建文件系统试试。
mkfs.ext4和mkfs.xfs在支持 TRIM 的设备上,默认会先对整个目标分区或设备执行丢弃(discard),命令一回车,盘上的数据基本就没有了。 - 反复给异响的机械盘通电。磁头有问题的盘,每次通电都可能在盘片上划出新的划痕,划伤的区域永久无法读取。敲打、冷冻这些网上流传的“偏方”同样不要试。
- 自己开盘,或者换一块同型号的电路板。开盘必须在洁净环境里进行;现在的硬盘把这块盘专属的适配参数存放在电路板的 ROM 芯片里,直接换上别的电路板通常不能用,还可能造成新的损坏。
- 对故障阵列执行重建、初始化、清除配置或新建虚拟盘。阵列故障后最常见的“二次事故”就是这几步。
- 对故障固态盘升级固件、做安全擦除,或对有坏道的盘跑“坏道修复”工具。前两步可能清掉固态盘内部的地址映射表,让数据再也无法还原;坏道修复工具会反复读写坏区,加速机械盘磁头的损坏。
逻辑故障:先用 ddrescue 做镜像,再在副本上恢复
第一步:停止写入
systemctl stop mysql nginx # 先停掉往这块盘写数据的服务
fuser -vm /data # 看还有哪些进程在用这个挂载点
umount /data || mount -o remount,ro /data # 卸载;卸不掉就改成只读挂载
systemctl stop fstrim.timer # 固态盘:暂停定时 TRIM,原因见后文
如果丢数据的是系统所在的分区,系统运行本身就在不断写入,应该关机,从救援系统启动后再操作。租用的服务器可以在服务商提供的客户自助端切到救援模式,救援系统是临时启动的,不动硬盘上的数据。
第二步:认准源盘和目标盘
lsblk -o NAME,SIZE,MODEL,SERIAL,MOUNTPOINT
按容量、型号和序列号确认哪块是故障盘,哪块是用来存镜像的目标盘。目标盘的可用空间要大于故障盘的总容量,并且必须是另一块物理硬盘或网络存储。
第三步:用 ddrescue 做整盘镜像
GNU ddrescue 专门用来从有问题的盘上抢救数据:先读好读的区域,跳过难读的部分,最后再回头反复尝试坏区,进度记录在映射文件里,中断后可以接着做。Debian、Ubuntu 上的包名是 gddrescue,RHEL 系可以从 EPEL 安装。
apt-get install gddrescue
# 第一遍:快速读完好读的区域,跳过难读区域
ddrescue -n /dev/sdb /mnt/backup/sdb.img /mnt/backup/sdb.map
# 第二遍:对剩下的难读区域直接读盘,每处重试 3 次
ddrescue -d -r3 /dev/sdb /mnt/backup/sdb.img /mnt/backup/sdb.map
# 查看映射文件记录的整体进度
ddrescuelog -t /mnt/backup/sdb.map
几点注意:参数顺序是“源在前、目标在后”,写反了会把镜像写到故障盘上;要直接克隆到另一块硬盘时,目标写成设备名并加 -f;运行时屏幕上会实时显示已救出的数据量(rescued)、比例和坏区数量(bad areas)。机械盘在读坏区的过程中如果开始出现异响,或者读取速度一路掉到几乎为零,立即按 Ctrl+C 停止(进度保存在映射文件里),转为送实验室处理,不要硬读。
第四步:在镜像上恢复
losetup -fP -r --show /mnt/backup/sdb.img # 镜像只读挂成 loop 设备,输出如 /dev/loop0,分区为 loop0p1 等
mount -o ro /dev/loop0p1 /mnt/recover # 文件系统完好时,直接只读挂载拷出文件
testdisk /mnt/backup/sdb.img # 分区丢失或误删,用 TestDisk
photorec /mnt/backup/sdb.img # 按文件类型找回,恢复结果放到另一块盘上
镜像里的 ext4 日志还没回放时,只读挂载会失败,加上 noload(mount -o ro,noload)即可;XFS 对应的参数是 norecovery。
TestDisk 的流程是选中镜像,选择分区表类型(Intel 是传统 MBR,EFI GPT 是 GPT),然后 Analyse、Quick Search,找不到再 Deeper Search。找到分区后按 P 列出文件,确认是要找的数据,能直接用 c 把文件或目录拷出来,就不必把分区表写回去。需要写回(Write)时,先另外复制一份镜像,在复制品上写。
按场景选工具:
| 场景 | 工具与方法 | 能恢复到什么程度 |
|---|---|---|
| 分区表丢失、误删分区 | TestDisk 搜索并重建分区表 | 通常能连同目录结构和文件名完整找回 |
| NTFS、FAT、exFAT 上误删文件 | TestDisk 的文件恢复功能 | 文件名和目录多半还在 |
| ext4、XFS 上误删文件 | PhotoRec 按文件类型找回 | ext4 删除文件时会清掉 inode 里记录的数据块位置,按原文件名找回很难,多数只能按类型找回内容,文件名变成编号 |
| 文件系统损坏、显示 RAW | 在镜像的副本上运行 fsck、chkdsk 或 xfs_repair,或者用 TestDisk 列出文件后拷出 | 视损坏范围而定 |
| LVM 元数据损坏,逻辑卷不见了 | 用 vgcfgrestore 从 /etc/lvm/archive 里的历史元数据恢复;/etc 也在这块盘上时,从镜像里取出这些文件 |
元数据恢复后数据通常完整 |
PhotoRec 的结果按 recup_dir.1、recup_dir.2 这样的目录存放,文件名是 f 加一串数字。找回之后逐个打开验证,确认可用再拷到新盘上,不要拷回原来那块盘。
固态硬盘数据恢复为什么更难
固态盘的误删恢复比机械盘难得多,原因是 TRIM:文件删除后,文件系统会通知固态盘“这些块不用了”,盘的主控在后台把对应的闪存块擦除回收,之后再读这些地址,多数盘返回的是全零。一旦 TRIM 生效,任何软件都找不回来。
Linux 上 TRIM 什么时候发生,取决于挂载方式:
- 挂载参数里有
discard,删除时立即 TRIM,基本没有挽回余地; - 没有
discard,靠定时任务批量执行,例如 Ubuntu 默认启用的fstrim.timer每周运行一次。在它下次运行之前停掉它、尽快做镜像,误删的数据还有机会。
findmnt -no OPTIONS /data # 看挂载参数里有没有 discard
systemctl list-timers fstrim.timer # 看下一次定时 TRIM 是什么时候
不少硬件 RAID 卡和 USB 硬盘盒不会把 TRIM 命令传给后面的固态盘,这种情况下误删的数据也还有机会;而在固态盘上误格式化、误重装,能找回的东西很少,因为建文件系统这一步通常会对整个分区执行丢弃。
固态盘物理故障的恢复,难点在主控:不少主控会对写入闪存的数据做加密或数据变换,并维护一张逻辑地址到闪存位置的映射表。主控损坏时,把闪存颗粒拆下来直接读,得到的往往是无法还原的数据,只能修复主控或固件后让它自己读出来,能不能成功很大程度上取决于这个主控型号有没有成熟的方案。
物理故障和 RAID:什么时候必须送实验室
出现异响、不转、不识别、电路板烧蚀、摔落进水这些情况,自己能做的是:断电,记下故障现象和出事前的操作,把盘装进防静电袋,送去有洁净间的数据恢复实验室。
服务器上更常见的是阵列故障。阵列里坏盘的数量超过了冗余能力,或者在重建过程中又坏了一块,这时要做的是保存现场,而不是继续尝试:
- 记录阵列配置。硬件 RAID 用厂商工具导出控制器、虚拟盘和每块物理盘的信息,例如
storcli64 /c0 show all、storcli64 /c0/vall show all、storcli64 /c0/eall/sall show all,重点是 RAID 级别、条带大小和成员盘的顺序。软 RAID 执行mdadm --examine /dev/sd[b-e]1 > md-examine.txt和cat /proc/mdstat,这两条只读取信息,不改动任何东西。 - 给每块盘贴上槽位号,同时记下序列号,掉线的盘、热备盘也算在内。
- 全部成员盘一起送,连同上面导出的配置。实验室会先给每块盘做镜像,再在镜像上按记录的参数把阵列虚拟重组出来,不在原盘上做任何写入。
送修之前,除了前面“千万别做”里列出的阵列操作,也不要强制把掉线的盘上线后让它重建,或者对原来的成员盘执行 mdadm --create:这些操作都会改写成员盘上的元数据或数据。
托管或租用在机房里的服务器,硬盘里是客户的数据。服务商不要在没有客户书面授权的情况下把盘交给任何第三方,送修过程中盘在谁手里、什么时候交接的,都要有记录。
恢复成功率和费用怎么判断
能恢复到什么程度,要等实验室检测后才有结论,下表只作定性参考:
| 情况 | 恢复可能性 | 主要取决于 |
|---|---|---|
| 机械盘误删、快速格式化、分区表丢失 | 高 | 之后写入了多少、是否新建过分区 |
| 文件系统损坏、RAW | 较高 | 是否在原盘上跑过修复 |
| 机械盘有坏道但还能识别 | 中到高 | 坏道的数量和分布、磁头状态 |
| 机械盘异响、不转 | 中 | 盘片是否划伤、能否找到匹配的配件盘 |
| RAID 坏盘超过冗余 | 中到高 | 故障后是否做过重建、初始化等操作 |
| 固态盘主控或固件故障 | 不确定 | 主控型号是否有成熟方案、数据是否加密 |
| 盘片大面积划伤 | 低 | 划伤范围 |
| 固态盘误删且已 TRIM,或在固态盘上重新格式化 | 很低 | — |
费用一般由几部分构成:检测费(有的机构不收,或恢复成功后抵扣);恢复服务费,这是主体,按故障类型和难度定价,大致从低到高依次是逻辑故障、坏道镜像、开盘换磁头、多盘阵列,容量越大、坏道越多耗时越长;开盘需要的配件盘,型号越冷门越难找;存放恢复结果的目标盘,可以自己提供;此外还可能有加急费,以及数据不能离开机房时请工程师上门的现场服务费。报价因机构、地区和故障情况差别很大,以检测后的书面报价为准。
选机构、签约前确认三件事:
- 先检测、说清故障原因再报价。
- 书面约定什么算成功。“不成功不收费”很常见,但要写明标准,例如指定目录完整恢复、指定的数据库能正常打开;恢复后先给文件清单,或让你抽验几个关键文件,确认可用再付款。
- 全程不对原盘写入,并签保密协议。
在管理系统里怎么落地
数据恢复是最后的手段,代价高、结果不确定,机房日常要做的是让它尽量用不上:重要数据至少保留三份,放在两种不同的介质上,其中一份放在异地;硬盘的 SMART 和阵列状态纳入监控,出现待映射扇区或阵列降级就及早换盘,不要等到坏第二块。
换盘这件事本身也要管起来。在 Toplink DCIM 里,硬盘是机柜与资产中按批次入库管理的部件:服务器上装的是哪几块盘,由下发的采集脚本自动写入台账,每次采集都留档;故障盘登记返修,谁在什么时候换了什么都有据可查。有了批次和返修记录,哪一批硬盘返修多、哪台机器频繁换盘,查记录就知道,提前替换,比坏了再找人恢复数据划算得多。
常见问题
机械硬盘坏了能修吗?
能修到把数据读出来,但不值得修好继续用。实验室换磁头、修固件,目的是把数据完整读一次,读完这块盘就不再可靠;服务器上应该换新盘,数据从镜像或备份恢复。
固态硬盘坏了还能修吗?
掉盘、容量显示异常多是主控或固件故障,修好继续用的意义不大。走厂商保修通常是寄回原盘、换一块新盘,原盘里的数据也就拿不回来了;数据重要的话,先交给恢复机构处理,再决定是否走保修。
PhotoRec 恢复出来的文件打不开是怎么回事?
PhotoRec 按文件头特征找数据,假定文件在磁盘上是连续存放的。大文件写入时被分散存放、文件所在区域有坏道,或者 SSD 上的数据已经被 TRIM 清零,找回来的文件就会残缺。文件名和目录结构丢失则是这种方式的正常现象。