如何测试一个磁盘是否有坏道或者健康,以及读写速度

Linux 下测硬盘健康、坏道、读写速度,分下面几类工具,按需使用。

一、健康状态检测(SMART)—— 最先做这个

SMART 是磁盘自身的健康自检信息,优先级最高,能提前发现问题。

# 安装工具(如果没有)
apt install smartmontools -y      # Debian/Ubuntu
yum install smartmontools -y      # CentOS

# 查看基本健康状态
smartctl -H /dev/sda

# 查看完整详细信息(重点关注的一些字段)
smartctl -a /dev/sda

重点看这几项:

SMART overall-health self-assessment test result: PASSED   ← 整体是否通过

Reallocated_Sector_Ct        重映射扇区数,应该是 0,非0说明有坏道被自动替换
Current_Pending_Sector        待处理扇区数,应该是 0,非0说明有疑似坏道还没确认
Offline_Uncorrectable         无法修复的扇区数,应该是 0
Power_On_Hours                通电时长,评估盘的使用年限
Temperature_Celsius           温度,长期过高会加速老化

如果是 NVMe 盘

nvme smart-log /dev/nvme0n1

critical_warning(应为0)、percentage_used(磨损百分比)、media_errors(介质错误数)。

主动触发完整自检(比被动读取信息更准)

# 短测试(几分钟)
smartctl -t short /dev/sda

# 长测试(可能几小时,针对整盘扫描,更全面)
smartctl -t long /dev/sda

# 查看测试结果(测试完成后)
smartctl -l selftest /dev/sda

二、坏道检测(读测试,不破坏数据)

# 只读方式扫描坏道,不会破坏盘上数据,适合在用的盘
badblocks -sv /dev/sda

-s 显示进度,-v 详细输出。如果扫描完没有报告任何坏块编号,说明当前没有可读性异常。

⚠️ 这个命令对大容量盘(几十TB)会跑很久,建议用 screentmux 放后台跑:

tmux new -s badblocks_check
badblocks -sv /dev/sda
# Ctrl+B 然后按 D 退出但保持后台运行
# 用 tmux attach -t badblocks_check 重新进入查看

破坏性读写测试(更彻底,但会清空数据!仅用于全新盘或不要数据的盘)

badblocks -wsv /dev/sda

-w 是写测试模式,会往盘上写入 4 种测试模式再读回校验,会清空盘上所有数据,只适合新盘上线前测试,或者确认不要现有数据时用。

三、读写速度测试

简单快速测试(顺序读写)

# 写入速度测试(用 dd,写 1GB 测试文件)
dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 oflag=direct

# 读取速度测试
dd if=/tmp/testfile of=/dev/null bs=1M iflag=direct

# 测完记得删除
rm -f /tmp/testfile

oflag=direct / iflag=direct 是跳过系统缓存,测的是真实磁盘性能,不加的话结果会虚高(测的是内存缓存速度)。

更专业的测试:fio(推荐,可测顺序/随机、不同块大小)

# 安装
apt install fio -y

# 顺序读测试
fio --name=seqread --rw=read --bs=1M --size=2G --directory=/mnt/testdir --numjobs=1 --runtime=30 --time_based

# 顺序写测试
fio --name=seqwrite --rw=write --bs=1M --size=2G --directory=/mnt/testdir --numjobs=1 --runtime=30 --time_based

# 随机读测试(4K,更接近数据库/虚拟机负载场景)
fio --name=randread --rw=randread --bs=4k --size=2G --directory=/mnt/testdir --numjobs=4 --iodepth=32 --runtime=30 --time_based

# 随机写测试
fio --name=randwrite --rw=randwrite --bs=4k --size=2G --directory=/mnt/testdir --numjobs=4 --iodepth=32 --runtime=30 --time_based

结果里重点看:

  • IOPS:每秒读写次数(随机小块测试更看重这个)
  • BW(带宽/吞吐):顺序测试更看重这个,单位 MB/s 或 GB/s
  • lat(延迟):平均响应时间,越低越好

针对裸盘直接测(不经过文件系统,测底层设备性能,注意会覆盖数据)

fio --name=rawtest --filename=/dev/sdX --rw=read --bs=1M --size=2G --numjobs=1 --runtime=30 --time_based --direct=1

⚠️ 直接指定 /dev/sdX 做写测试会破坏该盘数据,用之前确认这块盘是空的或者不要数据。

四、NVMe 盘专用性能/健康工具

# 健康信息
nvme smart-log /dev/nvme0n1

# 查看盘的基本身份信息、支持特性
nvme id-ctrl /dev/nvme0n1

# 简单读写测速(同样可以配合 fio 或 dd)

推荐检测流程(从轻到重)

  1. 先看 SMARTsmartctl -a /dev/sdX,看有没有历史报警
  2. 触发自检smartctl -t long /dev/sdX,跑完看结果
  3. 只读坏道扫描badblocks -sv /dev/sdX(不破坏数据)
  4. 速度测试:用 fio 跑顺序+随机读写,评估性能是否符合预期
  5. 如果是全新盘上线前,可以做破坏性的 badblocks -wsv 全盘写测试,更彻底

你现在是想测哪块盘?是刚才提到的那块 60TB 的 sata-data(有数据了不能做破坏性测试),还是准备新上线的盘(可以随便测)?我可以帮你给出针对性的命令组合。

posted @ 2026-08-24 13:39  技术颜良  阅读(32)  评论(0)    收藏  举报