盘况监测

你的硬盘(SSD / NVMe / HDD)在默默工作,但偶尔会在关键时刻“罢工”。

本文教你一套简单可落地的盘健康监控方法:安装必备工具 → 手动检查 → 写脚本自动巡检并报警(Linux 与 Windows 两套),步骤清晰,能马上用。

一、为什么要做盘况监测(简短)

  • 提前发现坏道、重分配扇区、寿命耗尽等风险
  • 自动告警避免数据损失(尤其是备份/数据库服务器)
  • 性能退化、异常温度也能及时响应

只要设置好巡检并在发现异常时报警,就能把风险降到最低。

二、先决条件与工具清单

  • Linux:smartmontools(smartctl)、nvme-cli(NVMe 专用)

盘况监测

  • Windows:CrystalDiskInfo(GUI,适合快速查看),或在命令行使用 smartctl(smartmontools 的 Windows 版)/PowerShell 查看基础健康信息
  • 报警方式(任选):邮件(sendmail/msmtp)、Webhook(企业微信/Slack)、简单 SMS/钉钉机器人

盘况监测

三、Linux:安装与手动检查(一步到位)

1)安装(Debian/Ubuntu / CentOS)

# Debian / Ubuntu

sudo apt update

sudo apt install smartmontools nvme-cli -y

# CentOS / RHEL

sudo yum install smartmontools -y

# nvme-cli 可从 EPEL 安装:sudo yum install epel-release && sudo yum install nvme-cli

盘况监测

2)识别设备

lsblk -o NAME,MODEL,SIZE,TYPE

# 或

sudo fdisk -l

假设设备为 /dev/sda(SATA SSD/HDD)或 /dev/nvme0n1(NVMe)。

3)SATA / NVMe 基本健康查询

# SATA / NVMe 都能用 smartctl(NVMe 需加 -d nvme)

# 对 SATA:

sudo smartctl -a /dev/sda

# 对 NVMe:

sudo smartctl -a -d nvme /dev/nvme0n1

# nvme-cli 的 nvme-smart-info(更直观 NVMe)

sudo nvme smart-log /dev/nvme0

4)关注的关键 SMART 指标(解读要点)

  • Reallocated_Sector_Ct(重分配扇区数)>0 要警惕,持续增长代表坏道
  • Current_Pending_Sector(待映射扇区)>0 很危险,需立即备份
  • Power_On_Hours(通电时长)+ Power_Cycle_Count(开关次数)了解寿命
  • NVMe 特有:Percentage Used(寿命使用百分比),Data Units Written(写入总量),温度(℃)

示例:看到 Percentage Used: 98% → SSD 快到寿命上限,应计划更换并立即备份。

四、Linux:一键巡检脚本 + 报警(示例)

下面脚本 check_disk.sh 会检查指定设备的关键项,异常时通过 mail 发送邮件(也可改为 webhook)。

#!/bin/bash

# /usr/local/bin/check_disk.sh

# 用法: sudo check_disk.sh /dev/nvme0n1

DEV=$1

ALERT_EMAIL=”you@example.com”

if [ -z “$DEV” ]; then

echo “Usage: $0 /dev/sdX or /dev/nvme0n1”

exit 1

fi

# 获取 smartctl 输出(自动识别 NVMe)

SMART_OUT=$(sudo smartctl -a -d nvme “$DEV” 2>/dev/null || sudo smartctl -a “$DEV” 2>/dev/null)

# 检查重分配扇区

REALLOC=$(echo “$SMART_OUT” | grep -i “Reallocated_Sector_Ct” | awk '{print $NF}')

PENDING=$(echo “$SMART_OUT” | grep -i -E “Current_Pending_Sector|Pending_Sector” | awk '{print $NF}')

# NVMe 识别 Percentage Used

PERC_USED=$(echo “$SMART_OUT” | grep -i “Percentage Used” | awk -F: '{print $2}' | tr -d ' %')

# 温度

TEMP=$(echo “$SMART_OUT” | grep -i “Temperature” | head -n1 | awk '{print $NF}' | tr -d 'C')

ALERT_MSG=””

if [ -n “$REALLOC” ] && [ “$REALLOC” -gt 0 ]; then

ALERT_MSG=”$ALERT_MSG
Reallocated sectors: $REALLOC”

fi

if [ -n “$PENDING” ] && [ “$PENDING” -gt 0 ]; then

ALERT_MSG=”$ALERT_MSG
Pending sectors: $PENDING”

fi

if [ -n “$PERC_USED” ] && [ “$PERC_USED” -gt 80 ]; then

ALERT_MSG=”$ALERT_MSG
SSD Percent Used: $PERC_USED%”

fi

if [ -n “$TEMP” ] && [ “$TEMP” -gt 60 ]; then

ALERT_MSG=”$ALERT_MSG
Temperature high: ${TEMP}C”

fi

if [ -n “$ALERT_MSG” ]; then

SUBJECT=”Disk alert for $DEV on $(hostname)”

BODY=”Disk check report for $DEV on $(hostname):
$ALERT_MSG

Full smartctl output:
$SMART_OUT”

echo -e “$BODY” | mail -s “$SUBJECT” “$ALERT_EMAIL”

fi

配置说明:

  • 需要系统能发邮件(mail 命令)。可安装 mailutils 或改为 curl 调用 webhook。
  • 把脚本放 /usr/local/bin/check_disk.sh,赋可执行 chmod +x。

5)用 systemd timer 自动运行(每日一次)

创建服务单元
/etc/systemd/system/check-disk.service:

[Unit]

Description=Disk health check

[Service]

Type=oneshot

ExecStart=/usr/local/bin/check_disk.sh /dev/nvme0n1

创建 timer
/etc/systemd/system/check-disk.timer:

[Unit]

Description=Run disk health check daily

[Timer]

OnCalendar=daily

Persistent=true

[Install]

WantedBy=timers.target

启用并启动:

sudo systemctl daemon-reload

sudo systemctl enable –now check-disk.timer

五、Windows:查看与自动化(GUI + 脚本)

1)快速 GUI:CrystalDiskInfo

  • 下载并运行 CrystalDiskInfo(免费,界面友善)可实时看到 SMART 状态与温度、健康度(Good/Warning/Bad)。适合桌面用户。

盘况监测

2)命令行:smartctl(Windows 版)

  • 下载 smartmontools 的 Windows 包,放到 C:Program Filessmartmontools,使用命令:

# 以管理员 PowerShell 运行

& 'C:Program Filessmartmontoolsinsmartctl.exe' -a /dev/sda

# NVMe:

& 'C:Program Filessmartmontoolsinsmartctl.exe' -a -d nvme /dev/nvme0n1

注意:Windows 设备名称可能为 //./PhysicalDrive0 等,smartctl 文档有说明。

3)PowerShell 监控脚本(示例)

下面示例用 PowerShell 调用 smartctl 并在发现问题时通过邮件(SMTP)发出告警:

# save as C:ScriptsCheck-Disk.ps1

$dev = “//./PhysicalDrive0”

$smartPath = “C:Program Filessmartmontoolsinsmartctl.exe”

$out = & $smartPath -a $dev

# 检查关键字

if ($out -match “Reallocated_Sector_Ct.*s([0-9]+)$”) {

$realloc = [int]$Matches[1]

if ($realloc -gt 0) {

$smtpServer = “smtp.example.com”

$msg = New-Object System.Net.Mail.MailMessage

$msg.From = “monitor@example.com”

$msg.To.Add(“you@example.com”)

$msg.Subject = “Disk alert on $env:COMPUTERNAME”

$msg.Body = “Reallocated sectors: $realloc`n`nFull output:`n$out”

$smtp = New-Object Net.Mail.SmtpClient($smtpServer,25)

$smtp.Send($msg)

}

}

4)把脚本做成计划任务(Task Scheduler)

  • 在任务计划程序中新建任务:触发器 → 每日/每小时,操作 → 运行 PowerShell 并指定脚本路径,勾选“以最高权限运行”。

六、报警方式替代(更现代的做法)

  • Webhook:把脚本里发送邮件部分改为 curl 请求企业微信或 Slack webhook,收到即时消息。
  • Prometheus + node_exporter + alertmanager:大型环境推荐把 SMART 指标收集到监控系统,再配置阈值告警(进阶)。
  • 日志滚动:把检测结果写入日志文件并用 fail2ban / logwatch 做二次处理。

七、日常运营提议(实用清单)

  • 定期备份:任何报警都先做立即备份(镜像或数据同步)。
  • 监测阈值:为每台盘设置合理阈值(不同厂商 SMART 名称可能不同)。
  • 温度管理:若温度常年偏高(>60℃),请清理散热或更换散热方案。
  • 写入量监控:对 SSD 关注写入总量与 Percentage Used,高写入环境需评估更耐写企业级 SSD。
  • 做好更换计划:当 SMART 报警出现,计划在可控时间内更换并恢复数据。

八、常见问题 FAQ(速查)

Q:SMART 报警后还能继续用吗?

A:短期可用,但必须立即备份并尽快更换。

Q:SMART 值为 0 就必定安全?

A:不绝对,SMART 是补充手段,仍需关注写入量、温度与性能异常。

Q:能否把脚本改为微信告警?

A:可以,把发送部分替换为推送到企业微信机器人或 ServerChan 类服务的 HTTP 请求。

九、示例资源(可复制粘贴)

  • Linux 检查一次所有磁盘并输出简短报告:

for d in /dev/nvme*n1 /dev/sd?; do

[ -b “$d” ] || continue

echo “=== $d ===”

sudo smartctl -H -a -d nvme “$d” 2>/dev/null || sudo smartctl -H -a “$d”

done

十、结语(行动提议)

  1. 目前就运行一次 smartctl / nvme smart-log,读一遍关键指标;
  2. 把上面的 check_disk.sh 放到服务器并用 systemd timer 每日检查;
  3. 一旦脚本发现异常,立刻备份并计划更换硬盘。
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容