实现linux硬盘smart检测

一、下载交叉编译libatasmart库

下载链接:https://www.linuxfromscratch.org/blfs/view/svn/general/libatasmart.html
libatasmart库编译依赖libudev库,交叉编译器前先准备依赖的libudev:

设置libudev的环境变量,并通过configure编译文件生成库和头文件

export PKG_CONFIG_PATH=${PWD}/../../libeudev/build/lib/pkgconfig:$PKG_CONFIG_PATH
./configure --prefix=${PWD}/../build CC=aarch64-buildroot-linux-gnu-gcc --host=aarch64-buildroot-linux-gnu-  --disable-static
make & make install

生成的库和头文件如图:

接下来只需要把库和头文件添加到cmake工程中,就可以使用了:

二、libatasmart使用

只有一个头文件atasmart.h,包含了所有的接口,接下来介绍一些常用的接口:

1、启动smart自检

int sk_disk_smart_self_test(SkDisk *d, SkSmartSelfTest test);

SkDisk *d 要操作的硬盘对象 这个是通过sk_disk_open(const char *name, SkDisk **d)获取的

SkSmartSelfTest test smart自检类型

typedef enum SkSmartSelfTest {
        SK_SMART_SELF_TEST_SHORT = 1, //启动短时间的自检
        SK_SMART_SELF_TEST_EXTENDED = 2,//启动扩展(长时间)自检
        SK_SMART_SELF_TEST_CONVEYANCE = 3,//启动运输自检
        SK_SMART_SELF_TEST_ABORT = 127//终止当前的自检
} SkSmartSelfTest;

2、获取smart属性表

int sk_disk_smart_parse_attributes(SkDisk *d, SkSmartAttributeParseCallback cb, void* userdata);

SkDisk *d 操作的硬盘对象

SkSmartAttributeParseCallback cb 回调函数指针, 处理每个解析后的 SMART 属性的回调函数。

原型格式:

typedef void (*SkSmartAttributeParseCallback)(SkDisk *d, const SkSmartAttributeParsedData *a, void* userdata);

d:指向 SkSmartAttributeParsedData 的指针,包含一个 SMART 属性的解析结果。

userdata:用户自定义的数据,直接传递到回调函数中

void* userdata 用户自定义数据,用于传递到回调函数中。

使用实例:

 sk_disk_smart_parse_attributes(
      pDisk,
      [](SkDisk* _, SkSmartAttributeParsedData const* pData, void* pUserdata) 
	  {
        auto attribute = reinterpret_cast<std::vector<Attribute >*>(pUserdata);
       	Attribute  attr = {};
		/* 获取属性表*/
        attr.id = pData->id;
        attr.name = pData->name;
		attr.flags = pData->flags;
        attr.current = pData->current_value;
        attr.worst = pData->worst_value;
        attr.threshold = pData->threshold;

        for (auto i = 0;i < 6; ++i) 
		{
         attr.raw += pData->raw[i] << (8 * i);
        }

        attribute->push_back(attr);
      },
     &attribute);

属性类定义:

class Attribute
{
public:
    uint8_t id;            // 属性 ID,表示具体的 SMART 属性编号
    std::string name;      // 属性名称,表示该属性的具体含义(如 "Temperature")
    uint8_t current;       // 当前值,表示该属性的当前状态
    uint8_t worst;         // 最差值,表示该属性历史上的最差状态
    uint8_t threshold;     // 阈值,当属性值低于此值时可能意味着问题
    uint64_t raw;          // 原始数据,包含更详细的低级信息(通常以十六进制显示)
    uint16_t flags;        // 属性标志,描述该属性的特性(如是否关键)
};

3、获取硬盘的整体评估状态

int sk_disk_smart_get_overall(SkDisk *d, SkSmartOverall *overall);

SkDisk *d 要操作的硬盘对象

SkSmartOverall *overall 磁盘的整体健康状态

typedef enum SkSmartOverall  {
    SK_SMART_OVERALL_GOOD,                         // 磁盘健康状态良好
    SK_SMART_OVERALL_BAD_ATTRIBUTE_IN_THE_PAST,    // 过去至少有一个预失效属性超过了阈值
    SK_SMART_OVERALL_BAD_SECTOR,                   // 当前至少有一个坏扇区
    SK_SMART_OVERALL_BAD_ATTRIBUTE_NOW,            // 当前至少有一个预失效属性超过了阈值
    SK_SMART_OVERALL_BAD_SECTOR_MANY,              // 当前存在多个坏扇区
    SK_SMART_OVERALL_BAD_STATUS,                   // 磁盘自检报告评估为负面
    _SK_SMART_OVERALL_MAX                          // 枚举值的最大标记(内部使用)
} SkSmartOverall;

举例,根据overall大致可以分为三个状态:

switch(overall)
		{

			case SK_SMART_OVERALL_GOOD:
				log_info("硬盘整体评估良好");
				stSmartDetection.enAllAssessment = System::AllAssessment_E::WELL;
				break;

			case SK_SMART_OVERALL_BAD_SECTOR:
        	case SK_SMART_OVERALL_BAD_ATTRIBUTE_IN_THE_PAST:
				log_info("存在少量坏扇区");
				stSmartDetection.enAllAssessment = System::AllAssessment_E::EXIST_BAD;
				break;

			case SK_SMART_OVERALL_BAD_ATTRIBUTE_NOW:
			case SK_SMART_OVERALL_BAD_SECTOR_MANY:
			case SK_SMART_OVERALL_BAD_STATUS:
				log_info("故障即将发生");
				stSmartDetection.enAllAssessment = System::AllAssessment_E::FAIILURE;
				break;

			default:
				break;
		}

4、 解析磁盘的 SMART 数据

int sk_disk_smart_parse(SkDisk *d, const SkSmartParsedData **data);

SkDisk *d 要操作的硬盘对象

const SkSmartParsedData **data 解析后的 SMART 数据

typedef struct SkSmartParsedData {
    /* 动态数据 (Volatile data) */
    
    // 离线数据收集的当前状态,指示离线健康检查是否正在进行、已完成或出现错误。
    SkSmartOfflineDataCollectionStatus offline_data_collection_status;

    // 离线数据收集的累计时间(秒),表示磁盘已经花费的时间来完成健康检查。
    unsigned total_offline_data_collection_seconds;

    // 自检执行状态,指示当前自检操作的状态,例如运行中、成功完成或失败。
    SkSmartSelfTestExecutionStatus self_test_execution_status;

    // 自检剩余百分比,表示当前运行的自检任务还需要完成的百分比。
    unsigned self_test_execution_percent_remaining;

    /* 固定数据 (Fixed data) */
    
    // 是否支持短时测试和扩展测试,使用布尔值表示(1 = 支持,0 = 不支持)。
    SkBool short_and_extended_test_available : 1;

    // 是否支持传输测试(Conveyance Test),用于检测传输过程中的损伤。
    SkBool conveyance_test_available : 1;

    // 是否支持启动测试功能。
    SkBool start_test_available : 1;

    // 是否支持中止测试功能。
    SkBool abort_test_available : 1;

    // 短时测试所需的时间(分钟),即运行短时健康检查的预期时间。
    unsigned short_test_polling_minutes;

    // 扩展测试所需的时间(分钟),即运行完整健康检查的预期时间。
    unsigned extended_test_polling_minutes;

    // 传输测试所需的时间(分钟),即运行传输过程健康检查的预期时间。
    unsigned conveyance_test_polling_minutes;
} SkSmartParsedData;

在调用这个接口前需要先用sk_disk_smart_read_data读取smart数据

sk_disk_smart_read_data (pDisk)

解析数据,比如获取自检状态:

switch(pData->self_test_execution_status)

常用的接口还有获取硬盘温度、使用时长、获取硬盘容量等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【GIS操作】使用ArcGIS Pro进行海图的地理配准(附:墨卡托投影对比解析)

文章目录 一、应用场景二、墨卡托投影1、知识点2、Arcgis中的坐标系选择 三、操作步骤1、数据转换2、数据加载3、栅格投影4、地理配准 一、应用场景 地理配准是数字化之前必须进行的一项工作。扫描得到的地图数据通常不包含空间参考信息&#xff0c;需要通过具有较高位置精度的…

模型 多元化思维(系统科学)

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。融合多学科知识&#xff0c;全面解决问题。 1 多元化思维模型的应用 1.1 完美日记的私域流量运营 完美日记作为美妆行业的新兴品牌&#xff0c;通过多元化的思维模型在私域流量运营中取得了显著成功。…

剧本杀门店预约系统开发,门店如何走下去?

近几年来&#xff0c;剧本杀行业经历了大浪淘金&#xff0c;行业进入到创新发展时期&#xff0c;如何在市场中占领一席之地成为了商家探讨的问题。 剧本杀作为一种社交游戏方式&#xff0c;深受年轻人的关注&#xff0c;不仅可以体验游戏的乐趣&#xff0c;还可以满足各种社交…

openharmony标准系统方案之瑞芯微RK3568移植案例

标准系统方案之瑞芯微RK3568移植案例 ​本文章是基于瑞芯微RK3568芯片的DAYU200开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c…

Linux的常用命令(三)

目录 六、网络通信命令 1.网络通信命令ping 2.网络通信命令ifconfig 七、系统命令 1. 系统命令shutdown 2. 系统命令reboot 八、vi编辑器 六、网络通信命令 1.网络通信命令ping 命令名称&#xff1a;ping 命令所在路径&#xff1a;/usr/sbin/ping 执行权限&#xff…

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

STM32W5500以太网应用开发003_TCP服务器添加OLED&#xff08;u8g2&#xff09;显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…

Pytorch|YOLO

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…

2025.1.15——六、SQL结构【❤sqlmap❤】

一、打开靶机&#xff0c;整理已知信息 查看页面信息&#xff0c;提示”MySQL结构”&#xff0c;所以为sql注入&#xff0c;两种思路&#xff1a;①手工注入&#xff1b;②sqlmap 二、手工注入解题 step 1&#xff1a;查看注入类型 键入&#xff1a;1 键入&#xff1a;1键入…

螺旋矩阵探讨

文章目录 54.螺旋矩阵59.螺旋矩阵II 54.螺旋矩阵 59.螺旋矩阵 II 54.螺旋矩阵 总体的思路分析&#xff1a; 顺时针&#xff0c;先遍历右边&#xff0c;再下面&#xff0c;再往左&#xff0c;再向上&#xff0c;然后再缩小一圈范围即可 原本的代码情况 class Solution:def spi…

Java IDEA中Gutter Icons图标的含义

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 很多人刚开始用IDEA来学习编程&#xff0c;会发现下面这些图标。 但是…

计算机网络 (46)简单网络管理协议SNMP

前言 简单网络管理协议&#xff08;SNMP&#xff0c;Simple Network Management Protocol&#xff09;是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议&#xff0c;它使网络管理员能够管理网络效能&#xff0c;发现并解决网…

掌握C语言内存布局:数据存储的智慧之旅

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 引言正文一、数据类型介绍1.内置类型2.自定义…

【C++篇】红黑树的实现

目录 前言&#xff1a; 一&#xff0c;红黑树的概念 1.1&#xff0c;红黑树的规则 1.2&#xff0c;红黑树的最长路径 1.3&#xff0c;红黑树的效率分析 二&#xff0c;红黑树的实现 2.1&#xff0c;红黑树的结构 2.2&#xff0c;红黑树的插入 2.2.1&#xff0c;大致过程…

【MySQL】使用C语言链接

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;MySQL 目录 一&#xff1a;&#x1f525; MySQL connect &#x1f98b; Connector / C 使用&#x1f98b; mysql 接口介绍&#x1f98b; 完整代码样例 二&#xff1a;&#x1f525; 共勉 一&#…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…

SSM项目简单的增删改查

目录 一、表 二、创建项目 1.创建mavenJavaWeb项目 2.补齐目录 3.导入依赖 三、创建包结构 四、实体类 五、spring框架 1.service接口和实现类 (1)service接口 (2)实现类 2.applicationContext.xml配置文件 六、spring整合springMVC 1.web.xml 2.spring-mvc.xml …

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7&#xff1a;Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…

el-table多级表头和列单元格合并

1、表格结构 <el-table:data"dialogForm.tableData"stripe:border"true":span-method"arraySpanMethod"><!-- 日期列 --><el-table-column prop"time" label"日期" align"center" /><!-- 重…

工程水印相机结合图纸,真实现场时间地点,如何使用水印相机,超简单方法只教一次!

在工程管理领域&#xff0c;精准记录现场信息至关重要。水印相机拍照功能&#xff0c;为工程人员提供了强大的现场信息记录工具&#xff0c;助力工程管理和统计工程量&#xff0c;更可以将图片分享到电脑、分享给同事&#xff0c;协同工作。 一、打开图纸 打开手机版CAD快速看图…

uniApp开通uniPush1.0个推,SpringBoot集成uniPush1.0个推

uniApp开通unipush1.0个推&#xff0c;SpringBoot程序集成 一、APP开通unipush1.0个推(商户App源码仅支持1.0个推) 1.app模块配置开通推送 2.应用开通推送 3.开通后点击消息推送菜单会看到如下页面 完成以上步骤后 此时android 仅支持在线推送。 4.配置各厂商离线推送 暂未…