用脚本自动化磁盘巡检和坏块统计,核心是动态识别物理磁盘(如lsblk过滤rota=1或nvme list)、执行smart健康扫描(smartctl -h/-a或nvme smart-log)、按需触发badblocks深度检测、记录日志与告警,并生成可追溯报告。
用脚本自动化磁盘巡检和坏块统计,核心是把人工执行的 smartctl、badblocks、fdisk、lsblk 等命令串联起来,加上日志记录、结果解析和异常告警,就能实现定期、可追溯、少干预的运维闭环。
识别待检测磁盘设备
避免硬编码设备名(如 /dev/sda),应动态发现物理磁盘。优先使用 lsblk -d -o NAME,ROTA,MODEL,SERIAL 过滤出旋转磁盘(ROTA=1)或 NVMe 盘(根据实际需求),再排除系统盘(如通过 findmnt / 获取根设备并过滤)。也可结合 /sys/class/scsi_disk/*/device/model 或 lshw -class disk 补充厂商与型号信息。
- 跳过 LVM 逻辑卷、LUKS 加密卷、RAM 盘等非物理块设备
- 对 NVMe 设备,用
nvme list和nvme smart-log替代smartctl - 记录设备序列号(SERIAL)用于唯一标识,避免因设备名变动(如 sda/sdb 顺序变化)导致误检
执行 SMART 健康快扫与关键属性提取
SMART 检测不需停机,适合高频巡检。用 smartctl -H 判断整体健康状态,再用 smartctl -A 提取重点关注项:Reallocated_Sector_Ct(重映射扇区)、Current_Pending_Sector(待修复扇区)、UDMA_CRC_Error_Count(接口错误)、Media_Wearout_Indicator(SSD 磨损)等。注意不同厂商属性 ID 和名称可能不同,建议用 -j 输出 JSON 格式便于解析。
- 设置阈值告警(如 Reallocated_Sector_Ct > 0 或 Current_Pending_Sector > 0 触发邮件/钉钉通知)
- 对 SSD,关注 Wear_Leveling_Count 和 Available_Reserve_Space
- 保存原始 JSON 日志到
/var/log/disk-smart/$(date +%Y%m%d)/sda.json,方便回溯
按需触发深度坏块扫描
全盘 badblocks 耗时长且需卸载文件系统,不适合每日执行。建议策略:SMART 出现预警时自动触发;或每月/每季度对关键数据盘执行一次只读扫描(badblocks -b 4096 -n -s /dev/sdX),避免写入风险。若需写入测试(-w),务必确保设备未挂载且有备份。
- 扫描前校验文件系统:
e2fsck -f /dev/sdX1(ext4)或xfs_repair -n(xfs) - 记录坏块位置到独立文件(
badblocks -o /tmp/sda.bad /dev/sdX),后续可配合e2fsck -l屏蔽 - 扫描过程实时输出进度,超时(如 >24h)自动中断并标记失败
汇总报告与轻量可视化
每次巡检生成统一格式的文本报告(含时间、设备、SMART 状态、坏块数量、是否触发告警),存为 .csv 或 .json。可用 jq 或 Python 的 csv 模块聚合多盘结果;简单趋势可用 gnuplot 绘制重映射扇区增长曲线;更进一步可接入 Prometheus + Grafana,将关键指标暴露为 metrics(如 disk_reallocated_sectors{device="sda"})。
- 报告末尾标注“下次建议执行时间”,例如:SMART 正常 → 7 天后;发现 pending sector → 24 小时内复检
- 保留最近 30 天日志,旧日志自动压缩归档(
gzip+logrotate) - 脚本退出码区分状态:0=全通过,1=SMART 预警,2=发现坏块,3=执行失败
不复杂但容易忽略:权限(脚本需 root)、磁盘忙时避让(检查 iostat -dx 1 3)、以及别让 badblocks 和数据库/应用同时重度 IO —— 自动化不是全自动,得留出人判断的余地。











