实现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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯算法|基础笔记(1)

**时间复杂度** 一、概念理解 时间复杂度是用来衡量算法运行时间随输入规模增长而增长的量级。它主要关注的是当输入规模趋向于无穷大时&#xff0c;算法执行基本操作的次数的增长趋势&#xff0c;而不是精确的运行时间。 二、分析代码中的基本操作 确定关键操作 在一段代码…

Uniapp判断设备是安卓还是 iOS,并调用不同的方法

在 UniApp 中&#xff0c;可以通过 uni.getSystemInfoSync() 方法来获取设备信息&#xff0c;然后根据系统类型判断当前设备是安卓还是 iOS&#xff0c;并调用不同的方法。 示例代码 export default {onLoad() {this.checkPlatform();},methods: {checkPlatform() {// 获取系…

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…

【Go】:深入解析 Go 1.24:新特性、改进与最佳实践

前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新&#xff0c;并通过具体示例展示这些变化如何影响日常开发工作&#xff0c;确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …

macos arm 本地/docker/本地k8s 安装jupyterhub 并登陆

概述 很多文章写的启动官方docker镜像后,新建linux用户即可直接登录,不知道是否版本原因,总之目前最新版我亲测不可以,踩坑两天,这里记录下解决过程,以及各种细节在文档中的位置.以及为什么官方镜像不能直接使用的原因. part1 本地安装jupyterhub https://jupyterhub.readth…

Multi-Agent如何设计

文章小结 研究背景和目的 在单一大语言模型长期主导人工智能领域的背景下&#xff0c;多智能体系统在对话任务解决中逐渐崭露头角。 虽然先前的研究已经展示了多智能体系统在推理任务和创造性工作中的潜力&#xff0c;但对于其在对话范式方面的局限性以及单个智能体的影响&am…

Web端实时播放RTSP视频流(监控)

一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <

Linux 机器学习

Linux 机器学习是指在 Linux 操作系统环境下进行机器学习相关的开发、训练和应用。 具体步骤 环境搭建&#xff1a; 选择合适的 Linux 发行版&#xff1a;如 Ubuntu、Fedora、Arch Linux 等。Ubuntu 因其易用性和丰富的软件包管理系统&#xff0c;适合初学者&#xff1b;Fed…

keepalived双机热备(LVS+keepalived)实验笔记

目录 前提准备&#xff1a; keepalived1&#xff1a; keepalived2&#xff1a; web1&#xff1a; web2&#xff1a; keepalived介绍 功能特点 工作原理 应用场景 前提准备&#xff1a; 准备4台centos&#xff0c;其中两台为keepalived&#xff0c;两台为webkeepalive…

CentOS 7 下 Nginx 的详细安装与配置

1、安装方式 1.1、通过编译方式安装 下载Nginx1.16.1的安装包 https://nginx.org/download/nginx-1.16.1.tar.gz 下载后上传至/home目录下。 1.2、通过yum方式安装 这种方式安装更简单。 2、通过编译源码包安装Nginx 2.1、安装必要依赖 sudo yum -y install gcc gcc-c sudo…

八股学习 Redis

八股学习 Redis 常见场景常见问题问题1、2示例场景缓存穿透解决方案一解决方案二 问题3示例场景缓存击穿解决方案 问题4示例场景缓存雪崩解决方案 问题5示例场景双写一致性强一致方案允许延时一致方案 问题6RDB方式AOF方式两种方式对比 问题7数据过期策略惰性删除定期删除 问题…

Python自学 - 标准库介绍

<< 返回目录 1 Python自学 - 标准库介绍 标准库是安装Python时自带的一些模块集合&#xff0c;集成了丰富的功能&#xff0c;避免用户反复造轮子&#xff0c;这极大的提高了生产效率&#xff01; 1.1 几种常用的标准库 1.1.1 os 模块 提供了与操作系统交互的接口&…

Flutter中Get.snackbar和Get.dialog关闭冲突问题记录

背景&#xff1a; 在使用GetX框架时&#xff0c;同时使用了Get.snackbar提示框和Get.dialog加载框&#xff0c;当这两个widget同时存在时&#xff0c;Get.dialog加载框调用Get.back()无法正常关闭。 冲突解释&#xff1a; 之所以会产生冲突&#xff0c;是因为Get.snackbar在关…

C++ 在线编译软件介绍、杭电OJ、北大OJ、力扣OJ

在线编译软件的话&#xff0c;可见下&#xff1a; https://www.jyshare.com/compile/12/ 杭州电子科技大学开发的一个免费的写代码地址 &#xff0c;杭电OJ https://bestcoder.hdu.edu.cn/ 北大OJ http://poj.org/ 力扣OJ 力扣 (LeetCode) 全球极客挚爱的技术成长平台

【全套】基于机器学习的印度森林火灾发生概率的分析与预测

【私信送源码文档】基于机器学习的印度森林火灾发生概率的分析与预测 对应的ppt 摘 要 随着全球气候变化的不断加剧&#xff0c;火灾的频发和规模逐渐增大&#xff0c;成为备受关注的问题。本文旨在提高对火灾发生概率的准确性&#xff0c;为火灾的预防和管理提供科学支持。在…

mysql性能压测

软件安装 安装sysbench yum install epel-release -y yum install sysbench sysbench --version 创建测试库 CREATE DATABASE demobench CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 创建测试表&#xff08;不需要&#xff0c;执行准备阶段的命令即可&#xff09;…

Python的秘密基地--[章节11] Python 性能优化与多线程编程

第11章&#xff1a;Python 性能优化与多线程编程 在开发复杂系统时&#xff0c;性能优化和并发编程是不可忽视的重点。Python 提供了多种工具和技术用于优化代码性能&#xff0c;并通过多线程、多进程等方式实现并发处理。本章将探讨如何在 Python 中提升性能&#xff0c;并实…

vite功能之---TypeScript

Vite 天然支持引入 .ts 文件 意思是不需要额外配置&#xff0c;vite内置了对.ts文件的转译 vite仅执行转译 请注意&#xff0c;Vite 仅执行 .ts 文件的转译工作&#xff0c;并不执行 任何类型检查。并假定类型检查已经被你的 IDE 或构建过程处理了。Vite 之所以不把类型检查…

RabbitMQ中有哪几种交换机类型?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ中有哪几种交换机类型&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ中有哪几种交换机类型&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中&#xff0c;交换机&#xf…

11-1.Android 项目结构 - androidTest 包与 test 包(单元测试与仪器化测试)

androidTest 包与 test 包 在 Android 项目中&#xff0c;androidTest 包与 test 包用于存放不同类型的测试代码的 1、测试类型 &#xff08;1&#xff09;androidTest 包 主要用于存放单元测试&#xff08;Unit Tests&#xff09;代码 单元测试是针对应用程序中的独立模块…