新磁盘接入服务器前需要验收,存量磁盘需要定期巡检。本文整理从 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 仓库: