Linux 服务器磁盘分区损坏,如何恢复数据?
引言:分区损坏不等于数据丢失
当 Linux 服务器突然无法挂载某个分区,或者启动时报错 No such device 时,很多新手的第一反应是“数据完蛋了”。
实际上,磁盘分区损坏往往只是逻辑结构出现问题,数据本身还完好地躺在扇区里。
只要不盲目格式化、不写入新数据,就有很大机会恢复。
本文围绕 Linux 服务器磁盘分区损坏,如何恢复数据? 这个核心问题,整理出三种常见场景的完整操作流程,每一步都给出可执行命令,零基础也能跟着做。
---
前置准备:先停下所有写操作
- 立即卸载损坏分区:如果分区还能访问,先用
umount /dev/sdb1卸载,避免系统继续向它写数据。 - 准备一个外置存储:用于存放恢复出的文件,比如移动硬盘或另一台服务器的 NFS 目录。
- 安装必要工具:大部分 Linux 发行版自带
fsck,但testdisk和ddrescue需要额外安装。
# CentOS / RHEL
sudo yum install -y epel-release
sudo yum install -y testdisk ddrescue
# Ubuntu / Debian
sudo apt update && sudo apt install -y testdisk gddrescue
---
场景一:分区表丢了,用 testdisk 恢复
这是最常见的“磁盘分区损坏”——分区表被破坏,系统无法识别原来的分区。testdisk 是专门重建分区表的交互式工具。
操作步骤
- 以管理员身份运行 testdisk
sudo testdisk /dev/sda
注意:操作对象是整块磁盘(如 /dev/sda),不是分区(如 /dev/sda1)。
- 选择分区表类型:通常选
[Intel] Intel/PC partition(MBR 分区表)或[EFI GPT](GPT 分区表),按回车。 - 选择菜单项
[ Analyse ] Analyse current partition structure,然后按回车。 - 按
[Quick Search]开始快速搜索。testdisk 会扫描整个磁盘,列出找到的分区。找到的目标分区通常显示为Linux或Linux swap。 - 确认分区后按
P预览文件:如果能列出文件名,说明数据完好的可能性很高。 - 按
Write将分区表写回磁盘:testdisk 会让你按Y确认。写入后不要立即重启,先运行partprobe让内核重读分区表。
sudo partprobe /dev/sda
- 挂载检查:
sudo mount /dev/sda1 /mnt
ls -l /mnt
如果 Quick Search 没找到,可以尝试 [Deeper Search],但会花费更长时间。
---
场景二:文件系统(FS)损坏,用 fsck 修复
分区表正常,
但挂载时报错 Invalid superblock 或 Structure needs cleaning,
说明文件系统本身坏了。fsck 可以检查并修复多数 ext2/3/4 文件系统错误。
操作步骤
- 卸载分区(如果还挂着)
sudo umount /dev/sdb1
- 强制检查并修复
sudo fsck -y -f /dev/sdb1
-y:遇到问题自动回答 yes,避免交互卡住。-f:强制检查,即使标记为干净也检查。
- 查看修复报告:fsck 会输出多少个 inode 被修复、多少块被标记为坏块。如果报错
UNEXPECTED INCONSISTENCY,可以加-c参数检查坏道。 - 再次挂载验证:
sudo fsck -f /dev/sdb1 && sudo mount /dev/sdb1 /mnt && df -h
避坑:不要在挂载状态下运行 fsck,可能导致文件系统进一步损坏。对于 XFS、Btrfs 等其他文件系统,应使用对应的xfs_repair或btrfs check。
---
场景三:物理坏道或机械故障,用 ddrescue 抢救数据
如果磁盘有大量坏道,或者系统报告 I/O error,不要反复挂载尝试,优先用 ddrescue 将数据完整克隆到另一个健康磁盘。
操作步骤
- 查看磁盘信息
sudo fdisk -l /dev/sdc
假设损坏盘是 /dev/sdc,目标盘是 /dev/sdd。
- 运行 ddrescue
sudo ddrescue -d -r3 /dev/sdc /dev/sdd rescue.log
-d:直接 I/O,绕过缓存。-r3:每个坏块最多重试 3 次。rescue.log:记录恢复进度,即使中断也可续传。
- 恢复完成后,对克隆盘
/dev/sdd执行前面的分区或文件系统修复,所有操作都在克隆盘上进行,原盘保持不动。 - 挂载克隆盘确认数据:
sudo mount /dev/sdd1 /mnt
---
避坑指南(新手必看)
- 不要直接 mkfs:格式化会彻底清除数据,除非你已经通过
dd完整备份。 - 不要在损坏盘上运行
fsck之外的大写入操作:每次写入都可能覆盖残存的数据碎片。 - 优先使用只读方式挂载:如果分区还能 mount,用
-o ro只读挂载,然后复制文件出来。 - 日志文件很重要:使用
ddrescue时必须保留rescue.log,这样下次运行可以跳过已恢复的部分。 - 不要在救援盘上安装系统:避免干扰,尽量在一台独立机器或 Live CD 环境下操作。
---
效果验证:如何确保数据恢复了?
无论使用哪种恢复方法,最终验证只有一个标准:成功挂载后,文件能正常读取且无 CRC 错误。
- 运行
sudo mount -t auto /dev/sdX1 /mnt看是否报错。 - 进入
/mnt后,执行tree -L 2或du -sh *看目录结构是否完整。 - 随机打开几个关键文件(如数据库备份、配置文件),用
cat或head查看内容是否乱码。 - 如果文件很多,可以用
find /mnt -type f -exec md5sum {} \; > /tmp/checksums.txt生成校验值,与备份比较。
---
结语
Linux 服务器磁盘分区损坏后,只要不慌张、不盲目操作,恢复概率其实很高。
本文从分区表修复、文件系统修复到物理坏道克隆,覆盖了最常见的三种场景。
你可以根据自己的报错信息选择对应方法。养成定期备份的习惯,才是应对“分区损坏”的终极方案。
如果操作中遇到任何报错,欢迎在下面留言,我会逐一回复。