1. 为什么需要检测磁盘坏道硬盘就像我们日常使用的笔记本用久了难免会出现纸张破损或墨水晕染的情况。磁盘坏道就是存储设备上的破损页它们可能是物理损伤硬坏道或逻辑错误软坏道。我管理过上百台服务器最深刻的教训就是等硬盘报错再处理往往为时已晚。曾经有台数据库服务器突然宕机检查发现是坏道导致关键分区损坏最后不得不从三天前的备份恢复损失了72小时的数据。坏道通常表现为这些症状文件复制时频繁报错系统日志出现I/O错误记录应用程序莫名崩溃磁盘读写速度异常缓慢badblocks就像存储设备的X光机它能扫描出肉眼看不见的隐患。与Windows的chkdsk不同这个工具可以直接访问物理磁盘层甚至能在文件系统建立前检测介质健康状态。去年我们数据中心有批新采购的SSD就是用badblocks在部署前发现了3%的坏块率及时进行了退换货处理。2. 检测前的准备工作2.1 选择检测时机检测过程可能持续数小时1TB机械盘完整扫描约4-6小时建议在业务低峰期操作。我有次在交易高峰期扫描存储服务器结果磁盘负载飙升导致支付系统超时这个教训让我养成了先看监控曲线的习惯。2.2 必备工具清单准备好这些工具会让工作更顺利live CD/USB当系统盘需要检测时备用存储存放检测结果和备份数据smartmontools先用smartctl -H /dev/sdX查看SMART健康状态屏幕会话工具如screen/tmux防止SSH断开导致中断2.3 风险评估与备份特别注意破坏性测试-w参数会清空磁盘数据即使是非破坏性测试也可能加剧已有坏道的扩散企业环境建议先对关键磁盘做完整镜像我常用的备份命令组合dd if/dev/sdX of/mnt/backup/sdX.img bs64K convnoerror,sync3. badblocks实战操作指南3.1 基础检测命令详解最安全的非破坏性检测badblocks -sv -o badblocks.log /dev/sdX-s显示进度条每完成1%显示-v实时输出检测到的坏块-o将结果保存到文件检测企业级SAS硬盘时我习惯加上块大小参数badblocks -b 4096 -sv /dev/sdX因为很多企业存储的物理扇区是4K对齐的。3.2 高级检测模式对于疑似故障的磁盘可以采用更严格的测试badblocks -wsv -t random -p 3 /dev/sdX这个命令会写入随机模式数据-t random验证读写一致性-w进行3次完整测试循环-p 3每次写入不同测试模式0xaa, 0x55, 0xff等去年排查某NAS系统数据损坏问题时就是通过这种压力测试发现了间歇性故障的磁盘控制器。3.3 分段检测技巧大容量磁盘可以分区域检测badblocks -sv -e 1000 /dev/sdX 1000000 2000000从1000000块开始检测检测到2000000块结束遇到1000个坏块后自动停止-e参数这个技巧在检测8TB以上硬盘时特别有用可以优先扫描关键分区区域。4. 检测结果分析与修复4.1 解读检测报告典型输出示例Checking blocks 0 to 488386583 Checking for bad blocks (read-only test): Pass completed, 0 bad blocks found. (0/0/0 errors)如果发现坏道会显示Block 12345678: BAD Block 23456789: BAD建议记录这些信息坏块数量占总容量的百分比坏块分布是否集中是否伴随SMART预警4.2 文件系统级修复对于ext3/ext4文件系统e2fsck -l badblocks.log /dev/sdX1这个命令会将坏块加入文件系统坏块表防止数据写入这些区域尝试恢复受影响文件重要提示修复前务必卸载分区我见过有人直接对已挂载分区操作导致文件系统崩溃。4.3 物理层处理方案根据坏道类型采取不同措施连续坏道可能是磁头损伤建议更换随机分散坏道可尝试低级格式化SSD坏块主控会自动屏蔽但需监控增长趋势某次数据中心迁移时我们用这个流程处理了30多块告警磁盘badblocks全面扫描坏道数50的立即下线坏道数10的标记为冷存储使用中间状态的每周复检5. 自动化监控方案5.1 定期检测脚本这是我用在运维系统中的巡检脚本#!/bin/bash DISK/dev/sdX LOG/var/log/badblocks_$(date %Y%m%d).log if [ ! -b $DISK ]; then echo Disk $DISK not found! | mail -s Badblocks Alert adminexample.com exit 1 fi badblocks -sv -o $LOG $DISK if [ -s $LOG ]; then cat $LOG | mail -s Badblocks Found on $DISK adminexample.com e2fsck -l $LOG ${DISK}1 fi5.2 与监控系统集成推荐配置Prometheus告警规则groups: - name: disk.rules rules: - alert: BadBlocksDetected expr: increase(node_disk_bad_blocks_total[24h]) 5 for: 1h labels: severity: warning annotations: summary: Bad blocks increasing on {{ $labels.device }}5.3 云环境特殊处理AWS EBS/阿里云云盘等云存储需要注意不能直接访问物理设备需要通过实例内检测发现异常建议直接更换云盘我们在AWS上采用的方案每周对生产卷做dd全量读取监控CloudWatch的EBS错误指标配置自动快照跨AZ复制6. 疑难问题解决方案6.1 坏道快速扩散处理遇到这种情况要立即行动停止写入操作用ddrescue抢救数据ddrescue -d /dev/sdX sdX.img sdX.logfile检查硬盘固件是否需要升级联系厂商获取专业工具6.2 文件系统无法挂载先用只读模式尝试恢复mount -o ro,loop,noload sdX.img /mnt/recovery如果失败可以尝试debugfs -w /dev/sdX16.3 硬件RAID特殊处理对于硬件RAID阵列通过MegaCLI检查物理磁盘状态单独检测每块成员盘注意RAID卡可能隐藏部分坏道重建阵列前先处理坏道问题某次处理Dell服务器RAID5故障时我们发现控制器报告1块盘故障实际检测有3块盘存在坏道直接重建导致二次数据损坏7. 不同存储介质处理差异7.1 传统机械硬盘特点坏道可能扩散可尝试重新映射扇区低格可能恢复部分坏道实用命令hdparm --repair-sector 123456 /dev/sdX7.2 SSD固态硬盘注意事项坏块会自动被主控替换频繁检测可能影响寿命需要关注备用块剩余量检测建议nvme smart-log /dev/nvme07.3 企业级存储设备高端存储通常提供在线介质扫描功能预测性故障分析热备盘自动替换例如NetApp的AutoSupport会自动报告潜在坏道问题。