硬盘坏道检测脚本抢救服务器重要数据
什么情况下需要硬盘坏道检测脚本抢救数据
当服务器出现以下异常,很可能硬盘已经产生坏道:系统启动报I/O error、文件读写卡死、dmesg日志刷出media error或UNC警告。
此时如果硬盘上还有未备份的重要数据,你需要立刻使用坏道检测脚本定位坏道范围,再用专用工具把数据搬到安全的硬盘上,避免坏道扩散导致数据彻底丢失。
准备条件:工具安装与兼容性确认
操作前请确认:
- 你已通过SSH登录到服务器,拥有
sudo或root权限。 - 准备一块容量足够的好硬盘作为数据迁入盘(建议挂载到
/mnt/safe)。 - 安装以下工具(CentOS/Debian通用):
# 安装 badblocks(通常随 e2fsprogs 自带)
sudo apt-get install e2fsprogs -y # Debian/Ubuntu
sudo yum install e2fsprogs -y # CentOS/RHEL
# 安装 smartctl(smartmontools 包含)
sudo apt-get install smartmontools -y
sudo yum install smartmontools -y
# 安装 ddrescue(数据抢救核心工具)
sudo apt-get install gddrescue -y
sudo yum install ddrescue -y # EPEL 源
如果ddrescue安装后命令为dd_rescue(旧版),可改用apt install ddrescue或从源码编译。
建议先执行which ddrescue确认名称。
核心步骤:用坏道检测脚本定位坏道并抢救数据
第一步:使用badblocks扫描坏道位置
先卸载待检测硬盘(假设设备是/dev/sdb,且未挂载重要分区):
sudo umount /dev/sdb*
运行非破坏性只读扫描(不写数据):
sudo badblocks -sv /dev/sdb > /tmp/badblocks.txt
参数说明:
-s:显示进度-v:详细输出- 输出文件
/tmp/badblocks.txt会列出所有坏块号。
你也可以加-c 32768增大每次检查块数加快速度,但更消耗内存。
非生产环境建议直接使用badblocks默认参数。
第二步:用smartctl快速筛查S.M.A.R.T.状态
sudo smartctl -H /dev/sdb
重点关注SMART overall-health self-assessment test result: PASSED或FAILED。
如果结果为FAILED,请立刻执行抢救。
再用sudo smartctl -a /dev/sdb | grep -i reallocated查看已重映射扇区数,数量激增说明坏道正在扩散。
第三步:使用ddrescue安全复制数据到好盘
假设坏盘为/dev/sdb(整个盘或分区/dev/sdb1),好盘目录为/mnt/safe:
sudo ddrescue -f -n /dev/sdb /mnt/safe/sdb_backup.img /mnt/safe/sdb_log.log
-f:强制写入目标文件-n:不分割源盘,适合首次粗略拷贝- 第一个参数:源设备
- 第二个参数:目标镜像文件路径
- 第三个参数:日志文件路径(记录已读和错误位置)
首次完成后跑第二次增强模式,尝试读取错误块:
sudo ddrescue -d -r3 /dev/sdb /mnt/safe/sdb_backup.img /mnt/safe/sdb_log.log
-d直接读取源盘(跳过缓存),-r3重试3次。
抢救完成后,把镜像挂载到临时目录提取关键文件。
避坑指南:别让操作加速数据损坏
- 不要直接对坏盘执行fsck或挂载:坏盘上的文件系统可能已受损,强制修复或挂载写入会扩大坏道。
- 不要用dd不加参数直接复制:普通dd遇读错误会直接退出,无法跳过坏道。必须用ddrescue或dd_rescue。
- 保持电源稳定:抢救过程中突然断电可能让磁头卡在坏道区域,导致永久划伤。
- 先确认坏盘设备名:使用
lsblk或fdisk -l仔细核对,避免误操作到好盘。
验证抢救效果并安全清理
- 检查ddrescue日志:
cat /mnt/safe/sdb_log.log,查看行末的errsize(未恢复字节数),如果为0或很小说明抢救成功。 - 挂载镜像文件(只读):
sudo mount -o loop,ro /mnt/safe/sdb_backup.img /mnt/restore
ls -la /mnt/restore
- 如果文件损坏,可尝试用
testdisk或photorec从镜像中恢复部分文件。 - 确认数据完整后,再考虑更换坏盘。
常见问题解答
Q:badblocks扫描太慢,可以中途取消吗?
A:可以,按Ctrl+C终止,已记录的坏块信息保存在输出文件里。
扫描结果应依据最新一次完整扫描。
Q:ddrescue日志文件丢失了还能继续吗?
A:可以,但无法记录已读取位置,会从头重扫。
建议保存日志到好盘。
Q:抢救出来的文件打开显示乱码?
A:可能是文件系统元数据损坏,尝试用fsck -n检查镜像(不修复),或使用photorec按文件签名恢复。
如果你正在处理硬盘坏道检测脚本抢救服务器重要数据,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。