磁盘:健康检查与验收
介绍磁盘 SMART 指标、自检、badblocks 坏道检测、fio 基准测试,以及一个支持并行、自动回滚的磁盘验收脚本。
新磁盘接入服务器前需要验收,存量磁盘需要定期巡检。本文整理从 SMART 指标到坏道检测、性能基准的完整检查流程,并介绍一个可并行的自动验收脚本。
一、安装 smartmontools
sudo apt install smartmontools -y
二、SMART 检查
smartctl -a /dev/sda
2.1 HDD 关键指标
机械盘重点关注以下指标,必须为 0:
Reallocated_Sector_Ct # 已重映射坏扇区数
Current_Pending_Sector # 待重映射扇区数
Offline_Uncorrectable # 离线无法纠正的扇区数
辅助参考:
Seek_Error_Rate # 寻道错误率
Power_On_Hours # 通电时长
2.2 SSD / NVMe 关键指标
Media_Wearout_Indicator # 介质磨损指示,建议 > 95%
Percentage Used # 寿命使用百分比,建议 < 5%
Data Units Written # 写入数据量,评估是否正常
Error Log Entries # 错误日志条目,应为 0
三、SMART 自检
# 短自检(几分钟)
smartctl -t short /dev/sda
# 长自检(数小时,SSD/NVMe 常用)
smartctl -t long /dev/sda
# 查看自检结果
smartctl -l selftest /dev/sda
结果应显示 Completed without error。
四、坏道检测
机械盘可以用 badblocks 进行全盘读写检测(会破坏数据,只用于空盘):
badblocks -wsv -b 4096 /dev/sda
-w:写模式检测。-s:显示进度。-v:详细输出。-b 4096:块大小。
SSD/NVMe 不建议做全盘写入检测,使用 SMART long test 替代。
五、性能基准:fio
5.1 顺序写
fio --name=seq_write \
--filename=/data/testfile \
--rw=write \
--bs=1M \
--size=50G \
--iodepth=32 \
--numjobs=1 \
--direct=1
5.2 顺序读
fio --name=seq_read \
--filename=/data/testfile \
--rw=read \
--bs=1M \
--iodepth=32 \
--direct=1
--direct=1 绕过页缓存,测试的是磁盘真实性能。
六、内核日志错误检查
dmesg | egrep -i "error|fail|nvme|ata|reset|timeout"
频繁出现 reset、timeout、error 说明磁盘或链路存在问题。
七、自动验收脚本
手动逐盘检查效率低。下面这个验收脚本可以自动完成:安全判断 → SMART → 坏道 → 临时分区挂载 → fio → 回滚 → 汇总报告,并支持多盘并行。
7.1 安全判断
脚本执行前必须保证不碰系统盘和正在使用的盘:
is_root_disk() {
local d=$1
root_dev=$(findmnt -n -o SOURCE / | sed 's/[0-9]*$//')
[[ "/dev/$d" == "$root_dev" ]]
}
is_unused_disk() {
local d=$1
lsblk /dev/$d | grep -q part && return 1
blkid /dev/$d &>/dev/null && return 1
pvs 2>/dev/null | grep -q "/dev/$d" && return 1
mdadm --examine /dev/$d &>/dev/null && return 1
return 0
}
is_unused_disk 依次检查:是否已有分区、是否有文件系统、是否是 LVM 物理卷、是否是 RAID 成员。
7.2 磁盘类型识别
get_disk_type() {
[[ "$1" == nvme* ]] && echo "NVMe" && return
rota=$(lsblk -d -n -o ROTA /dev/$1)
[[ "$rota" == "1" ]] && echo "HDD" || echo "SSD"
}
HDD 用 badblocks,SSD/NVMe 用 SMART long test。
7.3 临时分区、挂载与回滚
空盘自动完成分区→格式化→挂载→fio→卸载→擦除,验收后不留痕迹:
parted -s "$DEV" mklabel gpt
parted -s "$DEV" mkpart primary 1MiB 100%
partprobe "$DEV"
sleep 2
PART="${DEV}1"
mkfs.xfs -f "$PART"
mount "$PART" "$MOUNT"
# ... fio 测试 ...
umount "$MOUNT"
wipefs -a "$DEV"
rm -rf "$MOUNT"
7.4 并行控制
最多同时跑 MAX_PARALLEL 个磁盘,使用 wait -n 在任一任务结束后继续:
MAX_PARALLEL=4
running=0
for d in $DISKS; do
test_disk "$d" &
((running++))
if (( running >= MAX_PARALLEL )); then
wait -n
((running--))
fi
done
wait
7.5 汇总报告
每盘一份报告(reports/$disk.txt),最后生成汇总(reports/summary.txt):
Disk Acceptance Summary
Host: node01
Time: 2026-01-30 14:23:05
====================================
/dev/sda OK
/dev/sdb OK
/dev/nvme0n1 SMART_ONLY
7.6 使用方式
# 常规验收(SMART + fio)
sudo ./disk_accept.sh
# 增加坏道检测(耗时较长)
sudo ./disk_accept.sh --badblocks
脚本开头使用 set -euo pipefail,任一环节出错立即退出,避免误操作。
八、总结
- HDD 看重映射/待定/离线扇区,SSD/NVMe 看磨损和错误日志。
- 空盘坏道检测用
badblocks -wsv,SSD 用 SMART long test。 - fio 顺序读写可以快速判断磁盘性能是否达标。
- 自动验收脚本通过安全判断、临时挂载回滚和多盘并行,适合批量磁盘验收。
相关脚本
整理自 cyy-tag/bash-example 仓库: