硬盘坏道检测脚本抢救业务重要数据:硬盘坏道检测脚本

核心答案

硬盘坏道检测脚本可以通过定时扫描磁盘SMART信息和执行表面测试,自动发现物理坏道或逻辑错误并发送告警,让运维人员在数据完全损坏前完成备份与迁移,从而抢救业务重要数据。
本文提供一份可直接使用的Bash检测脚本,覆盖安装、配置、执行和验证全流程,零基础服务器维护者也能照做。

什么时候该用坏道检测脚本

  • 服务器硬盘使用超过3年,或持续高IO运行(数据库、日志采集等)。
  • 系统日志频繁出现“I/O error”、“unrecovered read error”等磁盘错误。
  • 需要定期巡检硬盘健康状态,但又不希望每天手动执行命令。
  • 硬盘灯异常、异响,或dmesg出现坏道相关提示。

准备工作:安装必需工具与环境确认

坏道检测主要依赖三个工具:smartmontools(SMART信息)、badblocks(扇区级扫描)、fiodd(可选压力测试)。
所有主流Linux发行版均可通过包管理器安装。

# CentOS / RHEL / Rocky
sudo yum install -y smartmontools e2fsprogs

# Ubuntu / Debian
sudo apt install -y smartmontools e2fsprogs

安装后确认工具可用:

smartctl --version
badblocks -v 2>&1 | head -1

编写可自动执行的坏道检测脚本

以下脚本的功能:

  • 检测SMART状态,记录错误计数。
  • 对指定磁盘进行只读坏道扫描(不影响数据)。
  • 将结果写入日志,并在发现坏道时发送邮件告警。

/usr/local/bin下创建脚本文件:

sudo vim /usr/local/bin/disk_check.sh

内容如下(注意替换磁盘设备名为你的实际盘符,如sdanvme0n1等):

#!/bin/bash
# 硬盘坏道检测脚本 - 适用于业务服务器
# 使用前请确认 badblocks 和 smartctl 已安装

DISK="/dev/sda"
LOGDIR="/var/log/disk_check"
MAILTO="admin@example.com"
ALERT_THRESHOLD=10   # 坏块数量超过此值发告警

mkdir -p "$LOGDIR"
DATE=$(date +%Y%m%d_%H%M%S)

# 1. 收集SMART信息
logfile="$LOGDIR/smart_$DISK_$DATE.log"
smartctl -a "$DISK" > "$logfile" 2>&1

# 2. 提取关键指标
REALLOC=$(grep "Reallocated_Sector_Ct" "$logfile" | awk '{print $10}')
PENDING=$(grep "Current_Pending_Sector" "$logfile" | awk '{print $10}')
UDMA=$(grep "UDMA_CRC_Error_Count" "$logfile" | awk '{print $10}')

echo "[INFO] Reallocated: $REALLOC, Pending: $PENDING, UDMA CRC: $UDMA"

# 3. 只读坏道扫描(非破坏性,适合业务盘)
scanlog="$LOGDIR/badblocks_$DISK_$DATE.log"
badblocks -sv -b 4096 "$DISK" > "$scanlog" 2>&1 &
BADPID=$!
wait $BADPID

# 4. 统计坏块数量
BAD_COUNT=$(wc -l < "$scanlog" 2>/dev/null || echo 0)

# 5. 告警逻辑
if [[ -n "$REALLOC" && "$REALLOC" -gt "$ALERT_THRESHOLD" ]] || [[ -n "$PENDING" && "$PENDING" -gt 0 ]] || [[ "$BAD_COUNT" -gt 0 ]]; then
    echo -e "磁盘 $DISK 检测到异常:\nReallocated: $REALLOC\nPending: $PENDING\n坏块数量: $BAD_COUNT\n详细日志见 $logfile 和 $scanlog" | mail -s "[警报] 硬盘坏道检测报告" "$MAILTO"
fi

echo "检查完成。日志目录: $LOGDIR"

保存后赋予执行权限并测试:

sudo chmod +x /usr/local/bin/disk_check.sh
sudo /usr/local/bin/disk_check.sh

首次执行时间较长(取决于磁盘大小),建议在业务低峰期运行。

避坑指南:不影响业务数据的5个要点

  1. 切勿对系统盘或正在使用的数据盘执行写测试badblocks默认只读扫描(-s参数),但若误用-w写模式会擦除数据。务必确认命令中只有-sv
  2. 控制IO优先级:扫描会占用磁盘带宽,可用ionice -c2 -n7 badblocks ...降低优先级。
  3. 避免在RAID卡透传盘上直接扫描:若使用硬件RAID,应先通过RAID管理工具(如megaraid)检查阵列状态。软件RAID则扫描底层磁盘。
  4. 监控系统负载:扫描期间观察iostat -x 1,如%util长期接近100%,需暂停或调整扫描扇区范围。
  5. 邮件告警配置:确保服务器已安装mailxmsmtp,且能正常发送邮件。测试命令:echo test | mail -s test admin@example.com

如何验证检测结果并抢救数据

  • SMART信息:直接看日志中Reallocated_Sector_CtCurrent_Pending_Sector。首次出现Pending扇区时就要准备换盘。
  • 坏块日志cat /var/log/disk_check/badblocks_*.log可以看到具体LBA块号。如果数量少(1-5个),硬盘可能还能用但需立即备份;如果大于50,建议立即更换。
  • 数据迁移:使用rsyncddrescue将数据复制到新盘。ddrescue能自动跳过坏道重试:ddrescue -d /dev/sda /dev/sdb rescue.log
  • 后续加固:启用定期cron任务,每天凌晨运行脚本,并保留30天日志:
0 3 * * * /usr/local/bin/disk_check.sh

高频问题解答

Q1:脚本执行时提示“badblocks: Permission denied”怎么办?
A:扫描需要root权限,请用sudo运行脚本,或者将脚本所有者设为root并设置SUID位(不推荐)。也可以将执行用户加入disk组。

Q2:SMART信息显示“PASSED”但坏块扫描有坏道,以哪个为准?
A:SMART PASSED仅表示磁盘控制器未标记严重故障,但物理坏道可能已出现。应以badblocks的扫描结果为准,并立即备份数据。

Q3:扫描一个4TB硬盘大概需要多久?
A:只读扫描速度约50-100MB/s,4TB盘约需10-20小时。建议分扇区段扫描(如只测前10%),用-e 100参数限制扫描长度。

Q4:检测到坏道后还能继续用这块盘吗?
A:可以临时使用,但必须将重要数据迁出。坏道会扩散,且可能导致文件系统元数据损坏。建议在备份完成后立即更换硬盘。如果您的服务器托管在正规IDC(如拥有增值电信业务经营许可证的泽御云),可联系机房技术支持协助更换硬件,资质信息可通过工信部官网查询。

总结

通过上述脚本和避坑指南,你可以在不中断业务的前提下定期检测硬盘坏道。
关键动作:安装SMART工具→部署检测脚本→设置cron自动执行→收到告警后立即用ddrescue迁移数据。
保持每日检查日志,就能最大程度降低因硬盘损坏导致的数据丢失风险。

分享到:
上一篇
自动爬虫IP黑名单定时更新拦截抓取:零基础服务器配置教程
下一篇
海外CDN完整配置加速静态资源访问
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意