ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Salt smbios 执行模块:基于 DMIdecode 的 SMBIOS 硬件信息采集实战指南

Salt smbios 执行模块:基于 DMIdecode 的 SMBIOS 硬件信息采集实战指南 运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读salt.modules.smbios是 Salt 中负责读取 SMBIOSSystem Management BIOS与 DMIDesktop Management Interface硬件信息的执行模块它通过调用系统自带的dmidecode或smbios命令完成底层解析为 Minion 提供 BIOS 厂商、系统 UUID、主板序列号、机箱类型、处理器频率等硬件元数据。在 Salt 的实际运维场景中它既是salt * smbios.get system-uuid这类命令式采集的直接入口也是核心 grains如uuid、biosversion、productname、serialnumber的底层数据来源广泛应用于资产盘点、硬件型号识别、虚拟化平台检测等自动化任务。读完本文你将掌握smbios.get与smbios.records的完整用法、DMI 类型对照、clean过滤机制以及该模块与 grains 系统之间的调用关系。模块概览SMBIOS/DMI 与 dmidecodeSMBIOS 与 DMI 是由 DMTFDistributed Management Task Force定义的固件标准主板 BIOS 会将这些硬件信息写入内存中的 SMBIOS 表操作系统则通过dmidecode之类的工具读取展示。salt.modules.smbios的设计思路很直接不做底层硬件访问而是解析dmidecode命令的文本输出。这一点在模块 docstring 中写得非常明确——Interface to SMBIOS/DMI (Parsing through dmidecode)模块源码位于 salt/modules/smbios.py。加载条件__virtual__该模块不是一个必然加载的模块它的__virtual__()函数会在 Minion 启动时被 Salt 加载器调用只有系统中存在dmidecode或smbios可执行文件时模块才会注册成功否则模块加载失败并记录原因def __virtual__(): Only work when dmidecode is installed. return ( bool(salt.utils.path.which_bin([dmidecode, smbios])), The smbios execution module failed to load: neither dmidecode nor smbios in the path., )从源码结构可以推断which_bin按顺序在两个候选命令中查找可用的那个dmidecode优先。这也意味着在大多数 Linux 发行版上需要先安装dmidecode如 Debian/Ubuntu 的dmidecode包、RHEL/CentOS 的dmidecode包才能使用本模块在某些 SmartOS/SunOS 系统上原生smbios命令可被用作替代品。smbios.get按 DMI 字符串名获取单项硬件信息smbios.get(string, cleanTrue)是模块最常用的入口它从 SMBIOS 信息中抓取单个 DMI 字符串底层等价于执行dmidecode -s string。支持的 DMI 字符串该函数完整支持的字符串参数如下源自模块源码 docstring分类支持的 string 参数BIOSbios-vendor、bios-version、bios-release-dateSystem系统system-manufacturer、system-product-name、system-version、system-serial-number、system-uuidBaseboard主板baseboard-manufacturer、baseboard-product-name、baseboard-version、baseboard-serial-number、baseboard-asset-tagChassis机箱chassis-manufacturer、chassis-type、chassis-version、chassis-serial-number、chassis-asset-tagProcessor处理器processor-family、processor-manufacturer、processor-version、processor-frequencyclean参数过滤厂商占位假数据clean默认值为True其作用是剔除众所周知的假信息例如全零 UUID、000000000之类的假序列号、以及 OEM 厂商预置的占位字符串如 To be filled by O.E.M.、Not Specified 等。当cleanTrue且检测到这类脏值时函数直接返回None。CLI 用法salt * smbios.get system-uuid cleanFalse salt * smbios.get system-manufacturer salt * smbios.get bios-version salt * smbios.get processor-frequency配合cleanFalse可以拿到未过滤的原始值例如在排查固件预置脏数据时很有用。实现原理get的核心实现非常短小精悍见 salt/modules/smbios.py 中的get函数def get(string, cleanTrue): val _dmidecoder(f-s {string}).strip() # Cleanup possible comments in strings. val \n.join([v for v in val.split(\n) if not v.startswith(#)]) if val.startswith(/dev/mem) or clean and not _dmi_isclean(string, val): val None return val这里有三点值得注意_dmidecoder底层调用的是salt.modules.cmdmod._run_quiet(dmidecoder args)源码中_dmidecoder函数即静默执行dmidecode -s string并捕获标准输出输出中的#注释行会被剥除若输出以/dev/mem开头dmidecode 无法访问内存时的报错信息或cleanTrue且_dmi_isclean判定为脏值则统一返回None。smbios.records结构化返回完整 DMI 记录smbios.records(rec_typeNone, fieldsNone, cleanTrue)返回结构化的 DMI 记录列表适合做批量采集与资产分析。它支持三个参数rec_type只返回指定 DMI 类型的记录传整数类型号如4表示处理器None时返回全部记录fields只保留指定字段的键值对字段名为 dmidecode 输出中属性名转小写、空格转下划线后的形式如core_count、thread_count、current_speedclean与get中的语义一致默认True。CLI 用法# 返回全部 DMI 记录 salt * smbios.records cleanFalse # 只返回 DMI type 14Group Associations的记录 salt * smbios.records 14 # 只返回处理器记录中的部分字段 salt * smbios.records 4 core_count,thread_count,current_speedDMI 类型对照表SMBIOS 规范定义records的rec_type参数接受以下 SMBIOS 规范定义的类型号完整继承自模块 docstringType信息类别Type信息类别0BIOS22Portable Battery1System23System Reset2Baseboard24Hardware Security3Chassis25System Power Controls4Processor26Voltage Probe5Memory Controller27Cooling Device6Memory Module28Temperature Probe7Cache29Electrical Current Probe8Port Connector30Out-of-band Remote Access9System Slots31Boot Integrity Services10On Board Devices32System Boot11OEM Strings3364-bit Memory Error12System Configuration Options34Management Device13BIOS Language35Management Device Component14Group Associations36Management Device Threshold Data15System Event Log37Memory Channel16Physical Memory Array38IPMI Device17Memory Device39Power Supply1832-bit Memory Error40Additional Information19Memory Array Mapped Address41Onboard Devices Extended Information20Memory Device Mapped Address42Management Controller Host Interface21Built-in Pointing Device——例如smbios.records 17会返回所有内存条Memory Device的结构化记录其中包含size、speed、manufacturer、part_number等字段可用于内存资产盘点。返回的数据结构records的输出是一条 DMI 记录对应一个字典的列表每条记录形如{ handle: 0x0001, # dmidecode 的 Handle 编号 description: System Information, # 记录类型描述 type: 1, # DMI 类型号int data: { manufacturer: Dell Inc., product_name: PowerEdge R740, serial_number: ABC123, ... } }顶层键handle、description、type由_dmi_parse解析生成见 salt/modules/smbios.py 中的_dmi_parse内部字段键名为 dmidecode 输出属性名的小写下划线形式例如输出中的Product Name:会变成键product_name_dmi_data中通过key.strip().lower().replace( , _)完成转换字段值会经过_dmi_cast的类型转换能转成整数的转成int包含逗号的按逗号拆成列表但serial、part、asset、product这类键保留字符串原样同一键下的多行子项例如Characteristics:下面的PCI is supported、PNP is supported等会被组装成列表。底层解析链路从 dmidecode 文本到结构化数据records与get共享同一套底层解析工具函数调用链为smbios.records / smbios.get └─ _dmidecoder(args) # 静默执行 dmidecode [-s/-t args] └─ _dmi_parse(data) # 按 Handle ... 正则切分记录 └─ _dmi_data(...) # 将单个 handle 的文本行解析为 dict └─ _dmi_cast(...) # 值类型转换int / list / str └─ _dmi_isclean(...) # 脏值判定clean 模式各工具函数的作用与实现要点全部位于 salt/modules/smbios.py_dmidecoder(argsNone)通过salt.utils.path.which_bin([dmidecode, smbios])定位可执行文件再以salt.modules.cmdmod._run_quiet静默执行并返回输出无参数时执行裸dmidecode全量 dump有参数时执行dmidecode args。_dmi_parse(data, cleanTrue, fieldsNone)用正则(handle [0-9]x[0-9a-f][^\n])\n把全量输出按 Handle 切分成多条记录逐条提取handle编号与type类型号第一条描述行作为description剩余内容交给_dmi_data。空记录与过滤后无数据的记录在cleanFalse时仍会保留仅有 handle/description/type。_dmi_data(dmi_raw, clean, fields)逐行识别\t一级键值与\t\t子项列表两种缩进层级支持同一键既有单值又有列表的罕见情况源码注释提到在所有系统上只遇到过 1 次。_dmi_cast(key, val, cleanTrue)先做_dmi_isclean脏值检查再按规则把值转为 int 或逗号分隔列表。_dmi_isclean(key, val)脏值判定规则集包括空值或以none开头 → 判脏键含uuid→ 依次用 RFC 4122 的 version 1~4 尝试解析全部失败则判脏该逻辑在源码中明确为Try each version (1-5) of RFC4122实际循环范围为 1~4键匹配serial|part|version→ 剔除全零串、1234567家族假序列号以及含sernum、part_number、specified、filled、applicable等关键词的占位值键匹配asset|manufacturer→ 剔除含manufacturer、to be filled、available、asset、no(n|t)等模式的占位值其他键 → 剔除to be filled与un(known|specified)、not (asset|provided|...)之类的未定义描述。这套clean机制保证了默认情况下 Salt 返回的硬件信息是干净的避免把 OEM 占位符当真实资产数据写入配置管理流程。与 grains 系统的集成uuid 与硬件 grains 的底层来源salt.modules.smbios不仅是一个可独立调用的执行模块它还深度参与了核心 grains 的生成。在 salt/grains/core.py 中模块顶部直接导入并注册了smbios.get/smbios.records到__salt__虚拟环境第 135-136 行这样 grains 函数才能调用它在_hw_data相关的 grains 生成逻辑中第 3370-3400 行附近当 Linux 上不存在/sys/class/dmi/id内核未开启 CONFIG_DMIID 的 sysfs 接口时会回退到 dmidecode 路径elif salt.utils.path.which_bin([dmidecode, smbios]) is not None and not (...): uuid __salt__smbios.get ... grains { biosversion: __salt__smbios.get, biosvendor: __salt__smbios.get, productname: __salt__smbios.get, manufacturer: __salt__smbios.get, biosreleasedate: __salt__smbios.get, uuid: uuid, } grains {key: val for key, val in grains.items() if val is not None} for serial in ( system-serial-number, chassis-serial-number, baseboard-serial-number, ): serial __salt__smbios.get if serial is not None: grains[serialnumber] serial break从这段代码可以提炼出几个重要的实现事实uuidgrain由smbios.get(system-uuid)提供且结果统一转小写若获取失败则回退到已从/sys/hypervisor/uuidXen 半虚拟化读取的值serialnumbergrain依次尝试system-serial-number、chassis-serial-number、baseboard-serial-number取第一个非空值cleanTrue的默认行为在这里自动过滤了占位序列号所以最终 grains 中通常不会出现 To be filled by O.E.M. 之类的脏值在 SmartOSsmbios 仅全局区可用以及 SunOS/SPARC系统不导出 SMBIOS 表上会跳过该路径这正是__virtual__中把smbios命令纳入候选的原因。此外核心 grains 中的虚拟化检测_virtual()也会在部分平台如 FreeBSD 等借助dmidecode/smbios输出识别虚拟机类型。测试覆盖与验证方式虽然仓库中暂无针对smbios模块本身的独立单元测试文件但其在 grains 体系中的行为已被测试覆盖。在 tests/pytests/unit/grains/test_core.py 中多个虚拟化 grains 测试如test_virtual_nutanix_*系列通过patch.dict(core.__salt__, {smbios.get: salt.modules.smbios.get, ...})的方式把真实的smbios.get注册进__salt__虚拟环境再模拟dmidecode输出包括 System Boot Information / Status: No errors detected 等 DMI type 32 记录来断言virtual、virtual_subtype等 grains 的结果。这说明smbios.get/smbios.records在 grains 上下文中通过__salt__点号调用约定使用测试以 mockcmd.run_all输出的方式间接验证了 dmidecode 解析逻辑对于本模块也可以在目标 Minion 上直接执行salt * smbios.records 1 cleanFalse与dmidecode -t 1对比结果来验证解析正确性。实战场景小结场景推荐调用获取机器唯一标识做资产入库salt * smbios.get system-uuid品牌型号盘点salt * smbios.get system-manufacturer、salt * smbios.get system-product-name排查内存条配置salt * smbios.records 17处理器信息汇总salt * smbios.records 4 core_count,thread_count,current_speed查看原始未过滤值排查脏数据salt * smbios.get system-serial-number cleanFalse判断是否虚拟化/容器环境salt * smbios.records 1比对system-manufacturer使用前提与限制需要 Minion 系统安装dmidecode或存在可用的smbios命令否则模块无法加载报错信息为 The smbios execution module failed to load: neither dmidecode nor smbios in the path.读取 SMBIOS 表通常需要 root 权限Minion 进程应以具备足够权限的用户运行在容器、部分云主机无物理 BIOS 暴露上dmidecode可能输出/dev/mem访问错误或被虚拟化平台填充为占位值此时cleanTrue会把这些值过滤为None不同固件厂商的占位符文本风格差异很大clean过滤规则基于模块中_dmi_isclean的正则集合若遇到未被覆盖的厂商脏值可在调用时使用cleanFalse获取原始输出后自行清洗。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Clover Bootloader SMBIOS信息生成自定义硬件标识终极指南Clover Bootloader SMBIOS信息生成自定义硬件标识终极指南 Clover Bootloader 是一个强大的引导加载程序支持在UEFI和固件操作系统Salt 的 osquery 执行模块用 SQL 驱动主机取证与系统信息采集Salt 的 osquery 执行模块用 SQL 驱动主机取证与系统信息采集 Salt本项目即开源版本 salt自 2015.8.0 起内置了 osque运维配置管理后端Salt 执行模块 systemd_service 完全指南基于 systemd 的服务管理实战Salt 执行模块 systemd_service 完全指南基于 systemd 的服务管理实战 本文是 Salt 官方参考文档 doc/ref/module运维配置管理后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表