硬盘坏道检测脚本抢救业务重要数据:硬盘坏道检测脚本
核心答案
硬盘坏道检测脚本可以通过定时扫描磁盘SMART信息和执行表面测试,自动发现物理坏道或逻辑错误并发送告警,让运维人员在数据完全损坏前完成备份与迁移,从而抢救业务重要数据。
本文提供一份可直接使用的Bash检测脚本,覆盖安装、配置、执行和验证全流程,零基础服务器维护者也能照做。
什么时候该用坏道检测脚本
- 服务器硬盘使用超过3年,或持续高IO运行(数据库、日志采集等)。
- 系统日志频繁出现“I/O error”、“unrecovered read error”等磁盘错误。
- 需要定期巡检硬盘健康状态,但又不希望每天手动执行命令。
- 硬盘灯异常、异响,或
dmesg出现坏道相关提示。
准备工作:安装必需工具与环境确认
坏道检测主要依赖三个工具:smartmontools(SMART信息)、badblocks(扇区级扫描)、fio或dd(可选压力测试)。
所有主流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
内容如下(注意替换磁盘设备名为你的实际盘符,如sda、nvme0n1等):
#!/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个要点
- 切勿对系统盘或正在使用的数据盘执行写测试:
badblocks默认只读扫描(-s参数),但若误用-w写模式会擦除数据。务必确认命令中只有-sv。 - 控制IO优先级:扫描会占用磁盘带宽,可用
ionice -c2 -n7 badblocks ...降低优先级。 - 避免在RAID卡透传盘上直接扫描:若使用硬件RAID,应先通过RAID管理工具(如
megaraid)检查阵列状态。软件RAID则扫描底层磁盘。 - 监控系统负载:扫描期间观察
iostat -x 1,如%util长期接近100%,需暂停或调整扫描扇区范围。 - 邮件告警配置:确保服务器已安装
mailx或msmtp,且能正常发送邮件。测试命令:echo test | mail -s test admin@example.com
如何验证检测结果并抢救数据
- SMART信息:直接看日志中
Reallocated_Sector_Ct和Current_Pending_Sector。首次出现Pending扇区时就要准备换盘。 - 坏块日志:
cat /var/log/disk_check/badblocks_*.log可以看到具体LBA块号。如果数量少(1-5个),硬盘可能还能用但需立即备份;如果大于50,建议立即更换。 - 数据迁移:使用
rsync或ddrescue将数据复制到新盘。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迁移数据。
保持每日检查日志,就能最大程度降低因硬盘损坏导致的数据丢失风险。