服务器运维

硬盘数据恢复怎么做:逻辑故障与物理故障的处理步骤

硬盘数据恢复的第一步不是找软件,而是立刻停止写入,判断故障类型。误删、格式化、分区丢失这类逻辑故障,先用 ddrescue 把整盘做成镜像,再在镜像上用 TestDisk、PhotoRec 恢复;有异响、不识别、固态掉盘这类物理故障,以及 RAID 的成员盘,不要自己动手,断电后送专业实验室。

作者 顶联产品团队发布于 9 分钟阅读

硬盘坏了,里面的数据多数情况下能恢复,能恢复多少取决于两件事:故障属于哪一类,以及出事之后你做过什么。逻辑故障(误删、格式化、分区表丢失、文件系统损坏)盘本身是好的,按“停止写入、整盘镜像、在副本上恢复”的顺序操作,成功率通常很高;物理故障(磁头、电机、电路板、固态主控坏了)需要洁净间和专用设备,自己能做的只有断电、记录现象、送修。真正让数据无法挽回的,往往不是故障本身,而是故障之后的误操作:继续写入、在原盘上跑修复、照提示格式化、反复通电。

先判断:逻辑故障还是物理故障

现象 故障类型 第一步
误删文件、清空了目录 逻辑 立即停止往这个分区写入
误格式化、误重装了系统 逻辑 同上;如果是固态盘,先看后文 TRIM 一节
分区不见了,磁盘管理里显示“未分配” 逻辑,分区表损坏 不要新建分区,用 TestDisk 找回
Windows 显示 RAW、提示需要格式化;Linux 挂载报 wrong fs type 或 bad superblock 逻辑,文件系统元数据损坏 不要格式化,不要直接对原盘跑 chkdsk 或 fsck
能识别,但读取极慢,dmesg 里大量 I/O error,SMART 待映射扇区持续增长 物理,坏道,但盘还能读 尽快用 ddrescue 做镜像,不要再跑全盘自检
通电后有咔哒声、周期性敲击声,或者电机不转 物理,磁头或电机故障 立即断电,送实验室
BIOS 或阵列卡里看不到这块盘;或容量变成很小的数字、型号变成奇怪的名字 物理,固态盘主控或固件故障,也可能是机械盘固件故障 断电,送实验室
固态盘能读不能写 部分固态盘寿命耗尽后进入只读保护 趁还能读,立刻把数据拷出来
RAID 虚拟盘离线,多块成员盘报错 阵列故障 停止一切阵列操作,见后文

型号变成奇怪的名字,一个典型例子是部分群联主控的固态盘在固件出错后,会被识别成 SATAFIRM S11。这是主控固件故障的表现,数据并没有被清空,但需要专业设备处理固件才可能读出来。

还有一点和平时排查硬盘不同:平时判断硬盘好坏,会跑一次 SMART 长自检让盘把全盘读一遍;但数据要紧、盘又已经在报错时,长自检会让本来就吃力的磁头把每个扇区都读一遍,等于在做镜像之前先消耗掉一部分“剩余寿命”。顺序应该是先镜像,后自检。

千万别做的操作

  1. 继续往这块盘写东西。包括把恢复软件装到这块盘上、把恢复出来的文件存回原盘、让数据库和日志服务继续运行。每一次写入都可能覆盖掉要找的数据。
  2. 直接在原盘上运行 fsck、chkdsk 或 xfs_repair。修复程序会改写文件系统的元数据,修对了万事大吉,修错了就回不去。要修,在镜像副本上修。
  3. 照提示格式化。Windows 弹出“需要将其格式化”的对话框时点取消;格式化会重写元数据,在固态盘上还会对整个分区执行 TRIM。
  4. 在固态盘上重新建文件系统试试。mkfs.ext4 和 mkfs.xfs 在支持 TRIM 的设备上,默认会先对整个目标分区或设备执行丢弃(discard),命令一回车,盘上的数据基本就没有了。
  5. 反复给异响的机械盘通电。磁头有问题的盘,每次通电都可能在盘片上划出新的划痕,划伤的区域永久无法读取。敲打、冷冻这些网上流传的“偏方”同样不要试。
  6. 自己开盘,或者换一块同型号的电路板。开盘必须在洁净环境里进行;现在的硬盘把这块盘专属的适配参数存放在电路板的 ROM 芯片里,直接换上别的电路板通常不能用,还可能造成新的损坏。
  7. 对故障阵列执行重建、初始化、清除配置或新建虚拟盘。阵列故障后最常见的“二次事故”就是这几步。
  8. 对故障固态盘升级固件、做安全擦除,或对有坏道的盘跑“坏道修复”工具。前两步可能清掉固态盘内部的地址映射表,让数据再也无法还原;坏道修复工具会反复读写坏区,加速机械盘磁头的损坏。

逻辑故障:先用 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:什么时候必须送实验室

出现异响、不转、不识别、电路板烧蚀、摔落进水这些情况,自己能做的是:断电,记下故障现象和出事前的操作,把盘装进防静电袋,送去有洁净间的数据恢复实验室。

服务器上更常见的是阵列故障。阵列里坏盘的数量超过了冗余能力,或者在重建过程中又坏了一块,这时要做的是保存现场,而不是继续尝试:

  1. 记录阵列配置。硬件 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,这两条只读取信息,不改动任何东西。
  2. 给每块盘贴上槽位号,同时记下序列号,掉线的盘、热备盘也算在内。
  3. 全部成员盘一起送,连同上面导出的配置。实验室会先给每块盘做镜像,再在镜像上按记录的参数把阵列虚拟重组出来,不在原盘上做任何写入。

送修之前,除了前面“千万别做”里列出的阵列操作,也不要强制把掉线的盘上线后让它重建,或者对原来的成员盘执行 mdadm --create:这些操作都会改写成员盘上的元数据或数据。

托管或租用在机房里的服务器,硬盘里是客户的数据。服务商不要在没有客户书面授权的情况下把盘交给任何第三方,送修过程中盘在谁手里、什么时候交接的,都要有记录。

恢复成功率和费用怎么判断

能恢复到什么程度,要等实验室检测后才有结论,下表只作定性参考:

情况 恢复可能性 主要取决于
机械盘误删、快速格式化、分区表丢失 高 之后写入了多少、是否新建过分区
文件系统损坏、RAW 较高 是否在原盘上跑过修复
机械盘有坏道但还能识别 中到高 坏道的数量和分布、磁头状态
机械盘异响、不转 中 盘片是否划伤、能否找到匹配的配件盘
RAID 坏盘超过冗余 中到高 故障后是否做过重建、初始化等操作
固态盘主控或固件故障 不确定 主控型号是否有成熟方案、数据是否加密
盘片大面积划伤 低 划伤范围
固态盘误删且已 TRIM,或在固态盘上重新格式化 很低 —

费用一般由几部分构成:检测费(有的机构不收,或恢复成功后抵扣);恢复服务费,这是主体,按故障类型和难度定价,大致从低到高依次是逻辑故障、坏道镜像、开盘换磁头、多盘阵列,容量越大、坏道越多耗时越长;开盘需要的配件盘,型号越冷门越难找;存放恢复结果的目标盘,可以自己提供;此外还可能有加急费,以及数据不能离开机房时请工程师上门的现场服务费。报价因机构、地区和故障情况差别很大,以检测后的书面报价为准。

选机构、签约前确认三件事:

  1. 先检测、说清故障原因再报价。
  2. 书面约定什么算成功。“不成功不收费”很常见,但要写明标准,例如指定目录完整恢复、指定的数据库能正常打开;恢复后先给文件清单,或让你抽验几个关键文件,确认可用再付款。
  3. 全程不对原盘写入,并签保密协议。

在管理系统里怎么落地

数据恢复是最后的手段,代价高、结果不确定,机房日常要做的是让它尽量用不上:重要数据至少保留三份,放在两种不同的介质上,其中一份放在异地;硬盘的 SMART 和阵列状态纳入监控,出现待映射扇区或阵列降级就及早换盘,不要等到坏第二块。

换盘这件事本身也要管起来。在 Toplink DCIM 里,硬盘是机柜与资产中按批次入库管理的部件:服务器上装的是哪几块盘,由下发的采集脚本自动写入台账,每次采集都留档;故障盘登记返修,谁在什么时候换了什么都有据可查。有了批次和返修记录,哪一批硬盘返修多、哪台机器频繁换盘,查记录就知道,提前替换,比坏了再找人恢复数据划算得多。

常见问题

机械硬盘坏了能修吗?

能修到把数据读出来,但不值得修好继续用。实验室换磁头、修固件,目的是把数据完整读一次,读完这块盘就不再可靠;服务器上应该换新盘,数据从镜像或备份恢复。

固态硬盘坏了还能修吗?

掉盘、容量显示异常多是主控或固件故障,修好继续用的意义不大。走厂商保修通常是寄回原盘、换一块新盘,原盘里的数据也就拿不回来了;数据重要的话,先交给恢复机构处理,再决定是否走保修。

PhotoRec 恢复出来的文件打不开是怎么回事?

PhotoRec 按文件头特征找数据,假定文件在磁盘上是连续存放的。大文件写入时被分散存放、文件所在区域有坏道,或者 SSD 上的数据已经被 TRIM 清零,找回来的文件就会残缺。文件名和目录结构丢失则是这种方式的正常现象。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88