
1. 项目背景与核心需求这个存储检测脚本项目源于服务器硬件测试工程师的日常痛点。在数据中心运维和服务器出厂测试中我们经常需要同时检测12-24块甚至更多硬盘的状态。传统的手动逐盘检查方式效率极低且容易遗漏关键指标。我曾见过团队因为漏检一块盘的SMART错误导致整批服务器返厂损失近百万。脚本的核心价值在于三点自动化完成多盘并行检测实测12块盘检测时间从45分钟压缩到90秒标准化输出包含关键健康指标的检测报告建立可追溯的硬件状态基线特别适合服务器厂商的出厂批量测试2. 技术方案设计2.1 工具链选型选择Python作为开发语言主要考虑跨平台兼容性需同时支持Linux/Windows服务器丰富的硬件交互库如pySMART、nvme-cli封装报表生成灵活性PandasJinja2模板关键依赖库# 硬件检测核心库 import pySMART # 传统SATA/SAS盘检测 import subprocess # 调用nvme-cli等命令行工具 import humanize # 容量单位转换 # 报表处理库 import pandas as pd from jinja2 import Template # HTML报告模板2.2 检测指标设计完整检测清单包含基础信息设备类型NVMe/SATA/SAS厂商型号固件版本序列号健康状态SMART整体健康状态仅传统硬盘NVMe关键警告温度/介质错误计数剩余寿命百分比SSD专用性能参数逻辑扇区大小总可用容量当前温度3. 核心代码实现3.1 多盘并行检测使用多进程池加速检测注意避免NVMe的并发访问冲突from multiprocessing import Pool def scan_disks(): # 使用lsblk获取磁盘列表 lsblk_cmd lsblk -d -o NAME,ROTA,TYPE,TRAN -J disks json.loads(subprocess.check_output(lsblk_cmd, shellTrue)) # 过滤出物理磁盘 physical_disks [d for d in disks[blockdevices] if d[type] disk] # 进程池检测限制并发数避免IO冲突 with Pool(processes4) as pool: results pool.map(check_disk, physical_disks) return results3.2 NVMe专用检测针对NVMe设备的特殊处理def check_nvme(device): # 获取基础信息 info_cmd fnvme id-ctrl /dev/{device} -o json info json.loads(subprocess.check_output(info_cmd, shellTrue)) # 获取SMART日志 smart_cmd fnvme smart-log /dev/{device} -o json smart json.loads(subprocess.check_output(smart_cmd, shellTrue)) return { type: NVMe, model: info[mn].strip(), fw_version: info[fr].strip(), temperature: smart[temperature] - 273, # 开尔文转摄氏度 media_errors: smart[media_errors], life_remaining: smart[percentage_used] }4. 报告生成优化4.1 数据结构设计使用Pandas DataFrame存储检测结果便于后续分析def generate_report(disks): df pd.DataFrame(disks) # 添加健康状态列 df[health_status] df.apply(lambda x: FAIL if (x[media_errors] 10 or x[life_remaining] 90) else PASS, axis1) return df4.2 HTML模板示例采用响应式设计的Jinja2模板片段div classdisk-card {{ failed if disk.health_statusFAIL }} h3{{ disk.model }} ({{ disk.type }})/h3 div classprogress-bar stylewidth: {{ disk.life_remaining }}% {{ disk.life_remaining }}%寿命剩余 /div table trtd温度/tdtd{{ disk.temperature }}℃/td/tr trtd介质错误/tdtd{{ disk.media_errors }}/td/tr /table /div5. 实战经验与避坑指南5.1 权限管理要点需要root权限才能读取SMART数据推荐方案# 设置sudo免密码生产环境需谨慎 echo $USER ALL(ALL) NOPASSWD: /usr/sbin/smartctl | sudo tee /etc/sudoers.d/diskcheck5.2 常见错误处理NVMe设备忙状态try: return check_nvme(device) except subprocess.CalledProcessError as e: if Device or resource busy in e.output: time.sleep(5) # 等待设备就绪 return check_nvme(device)混合环境兼容def get_disk_type(device): if os.path.exists(f/sys/block/{device}/queue/rotational): with open(f/sys/block/{device}/queue/rotational) as f: return SATA if f.read().strip() 1 else SSD elif os.path.exists(f/dev/{device}): return NVMe6. 性能优化技巧缓存机制from functools import lru_cache lru_cache(maxsize12) def get_disk_info(device): # 昂贵的硬件检测操作 return raw_disk_info异步IO处理import asyncio async def async_check_disk(device): proc await asyncio.create_subprocess_exec( nvme, smart-log, f/dev/{device}, stdoutasyncio.subprocess.PIPE) stdout, _ await proc.communicate() return parse_output(stdout)这个脚本在我们实验室的日常测试中已经稳定运行超过6个月累计检测超过2000块硬盘。最实用的改进是添加了异常盘自动隔离功能——当检测到介质错误超过阈值时会自动调用ledctl工具点亮硬盘故障灯这对机房运维特别友好。