在Ubuntu服务器上做硬盘健康检查,最直接有效的工具就是smartctl,它是smartmontools软件包里的核心命令,能读取硬盘的S.M.A.R.T.(Self-Monitoring, Analysis and Reporting Technology)数据,包括通电时间、坏道数量、温度、重映射扇区数等关键指标。你只需要执行一条命令就能看到硬盘的整体健康状态:
sudo smartctl -a /dev/sda
,其中/dev/sda替换成你实际的硬盘设备名。如果输出结果里出现"PASSED"或者没有任何FAILED标记,说明硬盘当前状态正常;一旦出现"FAILED"或者某些属性值低于阈值,就必须立刻采取行动了。
很多运维人员平时不关注硬盘健康,等到系统崩溃、数据丢失才后悔。硬盘不是不会坏,而是坏之前会给你信号,smartctl就是用来捕捉这些信号的。下面我会从安装、基础检查、关键指标解读、自动化预警脚本、到故障处理,把整个流程讲透。
一、安装smartmontools工具包
Ubuntu默认没有预装smartctl,需要手动安装。执行以下命令即可:
sudo apt update sudo apt install smartmontools -y
安装完成后验证一下版本:
smartctl --version
建议安装最新版本,因为新版本对NVMe固态硬盘和新型机械硬盘的支持更好。如果你的服务器用的是NVMe SSD,设备名通常是/dev/nvme0n1,smartctl同样支持,只是命令参数略有不同,后面会讲到。
二、识别硬盘设备并查看基本信息
在做健康检查之前,你得先知道服务器上有哪些硬盘。用以下命令列出所有块设备:
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
或者更详细地查看:
sudo fdisk -l
机械硬盘一般显示为/dev/sda、/dev/sdb这样的命名,NVMe固态硬盘显示为/dev/nvme0n1、/dev/nvme1n1。确认设备名后就可以开始检查了。
先跑一个快速健康状态检查:
sudo smartctl -H /dev/sda
这个命令只返回PASSED或FAILED,适合快速巡检。但要深入了解硬盘状况,必须用-a参数看完整报告。
三、S.M.A.R.T关键指标详解
执行
sudo smartctl -a /dev/sda
后,输出内容很多,但你真正需要关注的核心指标就那么几个:
1. Reallocated_Sector_Ct(重映射扇区数):这个值表示硬盘已经发现坏扇区并用备用扇区替换的数量。如果这个值大于0并且还在持续增长,说明硬盘正在恶化。对于机械硬盘,这个值一旦超过阈值就意味着硬盘寿命快到头了。
2. Current_Pending_Sector(等待重映射扇区数):表示硬盘发现了不稳定的扇区,但还没来得及重映射。这个值如果不为0,说明硬盘存在潜在坏道,随时可能恶化。
3. Offline_Uncorrectable(离线不可纠正扇区数):这个值代表硬盘在离线扫描时发现的无法纠正的错误扇区数量。只要这个值大于0,基本可以判定硬盘有严重问题。
4. UDMA_CRC_Error_Count(接口通信错误数):这个值反映的是数据线或接口的问题,不一定是硬盘本身坏了。如果这个值很高,先换根SATA线试试。
5. Temperature_Celsius(温度):硬盘工作温度一般在30-50度之间属于正常。如果长期超过55度,会加速硬盘老化。注意看报告里有没有"Temperature_Case"和"Temperature_Internal"两个值,取较高的那个参考。
6. Power_On_Hours(通电小时数):这个值直接告诉你硬盘用了多久。一般企业级硬盘设计寿命在5万小时以上,消费级硬盘在3-5万小时。超过设计寿命不代表马上坏,但风险会显著增加。
7. Wear_Leveling_Count(磨损均衡计数,仅SSD):固态硬盘特有的指标,表示闪存颗粒的磨损程度。数值越低说明磨损越严重,通常降到10%以下就该考虑更换了。
四、NVMe固态硬盘的检查方法
如果你的服务器用的是NVMe SSD,命令格式有所不同:
sudo smartctl -a /dev/nvme0
注意这里不需要加n1,直接用/dev/nvme0就行。NVMe硬盘的健康报告里会显示"Percentage Used"(已用百分比)和"Data Units Written"(写入数据量),这两个指标对判断SSD寿命非常关键。一般消费级NVMe SSD的TBW(总写入量)在300-600TB之间,企业级可以达到几PB。
五、设置smartctl自动启用S.M.A.R.T监控
有些硬盘默认没有开启S.M.A.R.T功能,需要手动启用:
sudo smartctl -s on /dev/sda
这个命令会让硬盘开始持续记录S.M.A.R.T数据。建议在所有服务器硬盘上都执行一遍,确保监控处于激活状态。
要让smartd守护进程在后台持续监控,需要编辑配置文件:
sudo nano /etc/smartd.conf
在文件中添加类似以下内容:
/dev/sda -a -o on -S on -n standby,15,q
这行配置的含义是:监控/dev/sda,记录所有属性,开启自动离线测试,每15分钟检查一次,如果发现问题就发邮件告警。然后启动服务:
sudo systemctl enable smartd sudo systemctl start smartd
六、编写自动化健康检查与预警脚本
光靠手动检查不现实,尤其是服务器多的时候。下面给一个实用的Shell脚本,可以定时运行并在发现问题时发送邮件告警:
#!/bin/bash
# 硬盘健康检查脚本
# 保存为 /usr/local/bin/disk_health_check.sh
LOGFILE="/var/log/disk_health.log"
ALERT_EMAIL="admin@yourdomain.com"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "===== $DATE 硬盘健康检查开始 =====" >> $LOGFILE
for disk in /dev/sda /dev/sdb /dev/nvme0; do
if [ -b "$disk" ]; then
echo "检查设备: $disk" >> $LOGFILE
STATUS=$(sudo smartctl -H $disk 2>/dev/null | grep -o "PASSED\|FAILED")
if [ "$STATUS" = "FAILED" ]; then
echo "警告: $disk 健康检查失败!" | mail -s "硬盘告警: $disk 故障" $ALERT_EMAIL
echo "告警已发送: $disk" >> $LOGFILE
else
# 检查关键属性
BAD_SECTORS=$(sudo smartctl -A $disk 2>/dev/null | grep -i "Reallocated_Sector_Ct" | awk '{print $10}')
PENDING=$(sudo smartctl -A $disk 2>/dev/null | grep -i "Current_Pending_Sector" | awk '{print $10}')
if [ "$BAD_SECTORS" -gt 0 ] 2>/dev/null || [ "$PENDING" -gt 0 ] 2>/dev/null; then
echo "警告: $disk 存在坏扇区或待处理扇区" | mail -s "硬盘预警: $disk 异常" $ALERT_EMAIL
fi
fi
fi
done
echo "===== $DATE 检查完成 =====" >> $LOGFILE给脚本执行权限并加入crontab定时任务:
sudo chmod +x /usr/local/bin/disk_health_check.sh sudo crontab -e
添加以下行,每天凌晨3点执行一次:
0 3 * * * /usr/local/bin/disk_health_check.sh
七、硬盘出现预警后的处理策略
当smartctl报告出现异常时,不要慌,按以下步骤处理:
第一步:立即备份数据。不管硬盘还能不能用,先把重要数据拷走。用rsync或者dd做镜像备份都行,越快越好。
第二步:确认是否是误报。有些时候S.M.A.R.T数据会出现短暂异常,可以间隔几小时再检查一次。如果连续多次检查都有问题,那就是真的有问题了。
第三步:检查数据线和接口。如果报的是UDMA_CRC_Error,先换SATA线、换接口,排除物理连接问题。
第四步:规划更换。如果确认硬盘有坏道或者寿命将尽,立刻采购同型号或更高规格的替换硬盘,做好RAID重建或系统迁移的准备。
第五步:建立长期监控机制。把smartctl检查纳入日常运维流程,配合Zabbix、Prometheus等监控系统做可视化展示,设定阈值告警,做到问题早发现早处理。
八、常见问题与注意事项
问:smartctl提示"SMART support is: Unavailable"怎么办?答:说明硬盘或者主板BIOS没有开启S.M.A.R.T功能。进BIOS找到S.M.A.R.T选项打开,或者用
sudo smartctl -s on /dev/sda
尝试强制开启。
问:USB外接硬盘能用smartctl检查吗?答:大部分USB转SATA桥接芯片不支持透传S.M.A.R.T命令,所以外接硬盘通常查不到数据。需要直接接在主板SATA口上才行。
问:RAID阵列里的硬盘怎么检查?答:如果是硬件RAID卡,需要用厂商提供的工具(如megacli、storcli);如果是软件RAID(mdadm),可以直接对底层物理盘执行smartctl检查。
问:SSD需要做健康检查吗?答:非常需要。SSD虽然没有机械部件,但闪存颗粒有写入寿命限制,而且SSD一旦开始出现坏块,数据丢失往往是突然性的,比机械硬盘更危险。
九、总结
硬盘健康管理是运维工作中最容易被忽视但最不能忽视的环节。smartctl是Linux下最权威、最轻量的硬盘检测工具,配合自动化脚本和定时任务,可以实现7×24小时无人值守监控。记住一个原则:不要等硬盘坏了才去检查,而是要在它坏之前就发现征兆并做好应对。定期执行smartctl -a,关注重映射扇区、待处理扇区、通电时间这几个核心指标,你的数据安全就有了基本保障。建议每季度做一次全面检查,每月跑一次快速健康状态扫描,把硬盘故障的风险降到最低。
