📜  Python|使用 smartmontools 监控硬盘运行状况

📅  最后修改于: 2022-05-13 01:55:49.267000             🧑  作者: Mango

Python|使用 smartmontools 监控硬盘运行状况

Smartmontools是“SMART 监控”工具的首字母缩略词,是一个使用SMART (自我监控、分析和报告技术)系统控制和监控计算机存储系统的软件包,该系统内置于大多数现代 (P)ATA、串行 ATA、SCSI/ SAS 设备。
它包含 2 个实用程序: smartctlsmartd 。这些实用程序提供有关磁盘降级和故障的警告或警报。
smartmontools可用于任何基于 Unix/Linux 的操作系统。它允许我们运行各种测试来检查系统中 HDD 或 SSD 的运行状况。

聪明的

大多数现代硬盘驱动器使用 SMART(自我监控、分析和报告技术)来评估其状况,以确定设备是否有问题。这允许用户查看硬盘驱动器的 SMART 数据并采取必要的措施来修复或更换设备。

在本文中,我们将探索 smartmontools 并检索系统中 HDD 和 SSD 的信息。我们还将编写一个Python脚本来解析 smartmontools 的输出并将输出存储在 Excel 表中。

安装 –

sudo pip3 install pandas
sudo apt-get install smartmontools 

安装 smartmontools 后,我们可以使用终端或命令行来获取硬盘驱动器的详细信息。

设备信息 -

要查看您的设备是否支持SMART监控,以及获取设备型号、容量、序列号等其他信息,我们使用以下命令:

sudo smartctl -i /dev/sda

如果未启用,则以下命令启用 SMART 监控:

sudo smartctl -s on /dev/sda

检查设备的健康状况

要显示磁盘的整体健康状况,我们使用以下命令:

sudo smartctl -H /dev/sda

这将显示硬盘驱动器的状态。如果它显示任何错误,那么您的硬盘驱动器可能遇到了一些问题,您应该考虑备份您的数据。

测试——

运行一个简短的测试:

sudo smartctl --test=short /dev/sda

简短测试的目标是快速识别有缺陷的硬盘驱动器。因此,短测试的最长运行时间为 2 分钟。

要运行长时间的测试:

sudo smartctl --test=long /dev/sda

长时间的测试也可以识别缺陷,但这里没有时间限制。测试更彻底。

要检查测试结果:

sudo smartctl -l selftest /dev/sda

一个例子 -

我们可以使用Python自动执行此过程并生成报告。为此,我们将使用 Pandas 将结果存储在 excel 表中,并使用 os 模块来运行命令。

# importing libraries
import os
import pandas as pd
from pandas import ExcelWriter
  
# class to hold all the
# details about the device
class Device():
  
    def __init__(self):
  
        self.device_name = None
        self.info = {}
        self.results = []
  
    # get the details of the device
    def get_device_name(self):
  
        cmd = 'smartctl --scan'
  
        data = os.popen(cmd)
        res = data.read()
        temp = res.split(' ')
  
        temp = temp[0].split('/')
        name = temp[2]
        self.device_name = name
  
  
    # get the device info (sda or sdb)
    def get_device_info(self):
  
        cmd = 'smartctl -i /dev/' + self.device_name
  
        data = os.popen(cmd)
  
        res = data.read().splitlines()
  
        device_info = {}
  
        for i in range(4, len(res) - 1):
            line = res[i]
            temp = line.split(':')
            device_info[temp[0]] = temp[1]
  
        self.info = device_info
  
    # save the results as an excel file
    def save_to_excel(self):
  
        try:
            os.mkdir('outputs')
        except(Exception):
            pass
  
        os.chdir('outputs')
  
        col1 = list(self.info.keys())
        col2 = list(self.info.values())
  
        output = pd.DataFrame()
        output['Name'] = col1
        output['Info'] = col2
  
        writer = ExcelWriter('Device_info.xlsx')
        output.to_excel(writer, 'Info_report', index = False)
  
        workbook = writer.book
        worksheet = writer.sheets['Info_report']
  
        # Account info columns
        worksheet.set_column('A:A', 35)
        # State column
        worksheet.set_column('B:B', 55)
        # Post code
        # worksheet.set_column('F:F', 10)
        writer.save()
        os.chdir('..')
  
    # function to check the health
    # of the device
    def check_device_health(self):
  
        cmd = 'smartctl -H /dev/' + self.device_name
  
        data = os.popen(cmd).read()
        res = data.splitlines()
        health = res[4].split(':')
        print(health[0] + ':' + health[1])
  
  
    # function to run the short test
    def run_short_test(self):
  
        cmd = 'smartctl --test = short /dev/' + self.device_name
        data = os.popen(cmd).read().splitlines()
  
  
    # function to get the results
    # of the test.
    def get_results(self):
  
        cmd = 'smartctl -l selftest /dev/' + self.device_name
        data = os.popen(cmd).read()
        res = data.splitlines()
  
        # stores the names of columns
        columns = res[5].split(' ')
        columns = ' '.join(columns)
        columns = columns.split()
  
        info = [columns]
  
        # iterate through the important
        # rows since 0-5 is not required
        for i in range(6, len(res)):
                  
            line = res[i]
  
            line = ' '.join(line.split())
            row = line.split(' ')
            info.append(row)
  
        # save the results
        self.results = info
  
  
    # function to convert the 
    # results of the test to an
    # excel file and save it
    def save_results_to_excel(self):
  
        # create a folder to store outputs
        try:
            os.mkdir('outputs')
        except(Exception):
            pass
  
        os.chdir('outputs')
  
        # get the columns
        columns = self.results[0]
  
        # create a dataframe to store
        # the result in excel
        outputs = pd.DataFrame()
  
        col1, col2, col3, col4 = [], [], [], []
          
        l = len(self.results[1])
  
        # iterate through all the rows and store
        # it in the data frame
        for i in range(1, len(self.results) - 1):
  
            if(len(self.results[i]) == l):
                col1.append(' '.join(self.results[i][2:4]))
                col2.append(' '.join(self.results[i][4:7]))
                col3.append(self.results[i][7])
                col4.append(self.results[i][8])            
            else:
  
                col1.append(' '.join(self.results[i][1:3]))
                col2.append(' '.join(self.results[i][3:6]))
                col3.append(self.results[i][6])
                col4.append(self.results[i][7])    
  
        # store the columns that we 
        # require in the data frame
        outputs[columns[1]] = col1
        outputs[columns[2]] = col2
        outputs[columns[3]] = col3
        outputs[columns[4]] = col4
          
        # an excel writer object to save as excel.
        writer = ExcelWriter('Test_results.xlsx')
      
        outputs.to_excel(writer, 'Test_report', index = False)
  
        # manipulating the dimensions of the columns
        # to make it more presentable.
        workbook = writer.book
        worksheet = writer.sheets['Test_report']
  
        worksheet.set_column('A:A', 25)
        worksheet.set_column('B:B', 25)
        worksheet.set_column('C:C', 25)
        worksheet.set_column('D:D', 25)
  
        # saving the file
        writer.save()
  
        os.chdir('..')
  
  
# driver function
if __name__ == '__main__':
  
    device = Device()
    device.get_device_name() 
    device.get_device_info()  
    device.save_to_excel() 
    device.check_device_health()
    device.run_short_test()
    device.get_results()
    device.save_results_to_excel()

输出 :

设备信息:

测试结果: