openbmc的fru配置

文章目录

  • 一、service
    • 1-1 路径
    • 1-2 文件内容
    • 1-3 of-name-to-eeprom.sh
    • 1-4 基于service的配置参数文件
  • 二、fru数据模板-yaml文件
    • 2-1 路径
    • 2-2 内容
    • 2-3 yaml文件数据解析
  • 三、配置
    • 3-1 yaml文件加载
    • 3-4 属性配置文件xxx-fru-properties.yaml文件


一、service

将eeprom数据读取到bus上的service

1-1 路径

xxx-project\meta-phosphor\recipes-phosphor\ipmi\phosphor-ipmi-fru\obmc-read-eeprom@.service

1-2 文件内容

[Unit]
Description=Read %I EEPROM
Wants=mapper-wait@-xyz-openbmc_project-inventory.service
After=mapper-wait@-xyz-openbmc_project-inventory.service
StartLimitBurst=10[Service]
Restart=on-failure
Type=oneshot
EnvironmentFile={envfiledir}/obmc/eeproms/%I
ExecStartPre={bindir}/of-name-to-eeprom.sh {envfiledir}/obmc/eeproms/%I
ExecStart=/usr/bin/env phosphor-read-eeprom --eeprom $SYSFS_PATH --fruid $FRUID
SyslogIdentifier=phosphor-read-eeprom[Install]
WantedBy=multi-user.target

这里涉及到几个参数:
%I:是文件名@后面的参数
SYSFS_PATH:eeprom的路径,该参数位于xxx-project\meta-quanta\meta-q71l\recipes-phosphor\ipmi\phosphor-ipmi-fru\obmc\eeproms\system\chassis\bmc文件下,ps:以meta-quanta为例
FRUID:fru id,同上

1-3 of-name-to-eeprom.sh

#!/bin/bash -eu
[ -n "${OF_NAME+1}" ] || exit 0
path="$(grep -xl "$OF_NAME" /sys/bus/i2c/devices/*/of_node/name)"
eeprom="${path%/of_node/name}/eeprom"
sed -i "s,^SYSFS_PATH=.*$,SYSFS_PATH=$eeprom," "$1"

这里结合service文件来看,是根据OF_NAME从i2c下的"of_node/name"参数grep出绝对路径,对SYSFS_PATH重新做了赋值,防止SYSFS_PATH参数错误导致service失败,所以要么保证OF_NAME对,要么保证SYSFS_PATH对,并且不用OF_NAME,用了OF_NAME,SYSFS_PATH参数值就不重要了

1-4 基于service的配置参数文件

ps:以meta-quanta为例
bmc

SYSFS_PATH=/sys/bus/i2c/devices/8-0050/eeprom
FRUID=50
OF_NAME=eeprom

参数前面有说明

二、fru数据模板-yaml文件

该文件是将数据更新到bus接口上的模板,或者说是"凹槽",只有yaml文件有的数据,你才能更新到bus上
这里我们以meta-ibm为例

2-1 路径

meta-ibm\recipes-phosphor\configuration\acx22-yaml-config\mihawk\acx22-ipmi-fru-bmc.yaml

2-2 内容

fru.yaml文件数据介绍

75:/system/chassis/motherboard/powersupply0:entityID: 10entityInstance: 1interfaces:xyz.openbmc_project.Inventory.Item:PrettyName:IPMIFruProperty: Board NameIPMIFruSection: BoardPartNumber:IPMIFruProperty: Part NumberIPMIFruSection: BoardSerialNumber:IPMIFruProperty: Serial NumberIPMIFruSection: BoardModel:IPMIFruProperty: Model NumberIPMIFruSection: BoardManufacturer:IPMIFruProperty: ManufacturerIPMIFruSection: BoardBuildDate:IPMIFruProperty: Mfg DateIPMIFruSection: Board
76:/system/chassis/motherboard/powersupply1:entityID: 10entityInstance: 2interfaces:xyz.openbmc_project.Inventory.Item:PrettyName:IPMIFruProperty: Board NameIPMIFruSection: BoardPartNumber:IPMIFruProperty: Part NumberIPMIFruSection: BoardSerialNumber:IPMIFruProperty: Serial NumberIPMIFruSection: BoardModel:IPMIFruProperty: Model NumberIPMIFruSection: BoardManufacturer:IPMIFruProperty: ManufacturerIPMIFruSection: BoardBuildDate:IPMIFruProperty: Mfg DateIPMIFruSection: Board

2-3 yaml文件数据解析

● entityID               #指定传感器entityID,具体见ipmi协议2.0中的43.14小结节
● entityInstance            #示例标号,相同entityID的sensor,要有不同的entityInstance编号进行区分,每个类型从0开始,具体见ipmi协议2.0中的39.1小结节
● sensorType            #传感器类型,具体见ipmi协议2.0中42.2小节
● path                  #传感器Dbus对象
● sensorReadingType #传感器读类型具体见ipmi协议2.0中42.1小节
● sensorNamePattern #可以给定字符串(最大长度为16),或者使用如下方式从path或者属性中获取○ nameLeaf:从path中解析(最后一个“/”后面的为传感器名)得到,一般用这个。○ nameParentLeaf:从path中解析,后两个为传感器名,例如“path:/xyz/openbmc_project/sensors/temperature/temp1”,怎传感器名为“temperature_temp1”○ nameProperty:传感器名即interfaces的属性○ interfaces:○ xyz.openbmc_project.Control.Boot.RebootAttempts:○ AttemptsLeft:○ Offsets:○ 0xFF:○ type: uint32_t○ 则传感器名为“AttemptsLeft”
● multiplierM       #ipmi协议中的算子,一般multiplierM*255 要稍大于可能的最大值,以保证精度
● offsetB           #偏移量
● bExp          #offsetB的指数,一般给0
● unit              #传感器单位,配置文件做了转换为字符串,具体见ipmi协议2.0中42.17小节
● scale         #缩放因子,是10的指数,一般温度电压等都是-3,即读取值是实际值的1000倍
● rExp              #和scale一样的指数,一般给0
1、scale是用于ipmid程序将从传感器中得到的值转化成实际值,一般hwmonz子系统中,传感器驱动创建的文件中存放的都是将实际值放大1000倍的值,因此sclae=-3 。如果自己写的驱动或者创建的文件中存放的值是实际值,则scale=0。
如hwmon子系统创建的文件 /sys/class/hwmon/hwmon1/temp1_input中的值是52000,则scal=-3。
如自己创建的文件/var/hwmon/hwmon0/temp1_input中值是52,则scale=0。
2、ipmi协议中一般阈值型传感器是有计算公式的(参见ipmi协议2.0的36.3小节),在ipmid程序中需要通过计算得到公式的中x值,并返回给发起者(netfn=04,cmd=0x21)。
3、配置文件中配置这些值会转化到ipmi协议数据中(multiplierM一个字节,offsetB一个字节,bExp(低4bits)和rExp(高4bits)一个字节,具体参见ipmi协议第43小节),命令发起者得到数据后,利用公式计算得到实际值,计算值的范围是[ offsetB * 10 ^bExp, multiplierM255 + offsetB * 10 ^bExp] * 10 ^rExp。在不考虑rExp和offsetB的情况下(rExp=bExp=0),计算值y的最大范围是[0,65025](此时 multiplierM=255)。
4、一般除了温度外,offsetB=0,rExp=-3,即计算值y的最大范围是[0, 65.25],为了保证精度,我们可以调小multiplierM值,尽量使最大值稍大于阈值中设置的最大值。快速计算:multiplierM=(最大阈值 - offsetB10 ^bExp) /255向上取整数。
例如例如12V的电压传感器,假设阈值中设置最大上限值是14V,则可以设置 multiplierM = 14000/255 ≈55(向上取整),即配置文件中内容如下:■ multiplierM=55■ offsetB=0■ bExp=0■ scale=-3■ rExp=-3
5、 一般温度传感器multiplierM=1,offsetB=-127,scale =-3, bExp =0,rExp=0,计算的y值范围是[-127,128]基本满足正常使用情况。
一般温度下限可能到不了-127,我们可以调整offsetB为-100,这样取值范围是[-100, 155]。
如果想提高精度,可以給rExp=-2, bExp=2,multiplierM=100,offsetB=-100,这样取值范围是[-100,155],并且可以显示两位小数。
6、ipmi计算得到的值和ipmid程序获取到的值是有细微的差距,例如bmcweb页面上显示的阈值是配置文件设置的值(一般在/etc/default/obmc/hwmon下),但是ipmitool显示是略小于设置的阈值。这是因为在计算得到 multiplierM和x都是8bits的整数,为了包含最大的阈值,进行了稍微的放大(向上取整),这样ipmid在计算时以及ipmitool计算时会存在除法除不尽时候的舍去误差,因此为了尽量缩小误差,尽量取最小满足条件的 multiplierM值( multiplierM越大,误差也越大(当然一些值和rExp也有关系))。
● hasScale          #是否缩放,取值“true”或者“false”
● mutability        # Mutability::Read和 Mutability::Write,用于设置是否可读写
● serviceInterface  #传感器DBus服务接口,不同的○ org.freedesktop.DBus.Properties #属性类,set设置属性,get获取属性○ xyz.openbmc_project.Inventory.Manager #管理类,get获取,notify通知
● readingType       #获取dbus接口值或者属性等的方法,这里是指定的是调用的函数名○ readingType和 serviceInterface接口有关,get(netfn cmd 0x4 0x2D)方法有四种,set(netfn cmd 0x4 0x30)方法有6种,对于接口时xyz.openbmc_project.Inventory.Manager的只有assertion一种,对于yaml文件一定不要写错了,这几种对应的是函数。○ readingAssertion #传感器有效状态作为值类型○ readingData #读取值常用的温度电压传感器○ assertion #bool有效型○ eventdata # 紧set方法有○ eventdata1 # 紧set方法才有○ eventdata2 #属性值是字符串○ 更多请参看源码下的sensordatahandler.hpp和sensordatahandler.cpp文件
● interfaces        #获取传感器信息Dbus的接口○ xyz.openbmc_project.Sensor.Value #获取传感器值接口○ xyz.openbmc_project.State.Boot.Progress #启动进度○ xyz.openbmc_project.State.OperatingSystem.Status #系统启动方式○ xyz.openbmc_project.Inventory.Manager #资产类,比如内存条、CPU核等○ 。。。。更多见DBus接口(cmd:busctrl tree)
● Value     #Dbus对应接口的的属性,常见的温度电压等传感器都是value○ Present #在位○ Functional #○ Prereqs #
● Offsets       #指定数据偏移字节,不同传感器类型偏移不一样,具体见ipmi协议2.0中42.2小节
● type      #vlaue的类型,一般传感器值是int64_t或者double,离散量是bool或者string
● skipOn        #指定跳过跟新类型,一般离散量不在位不能更新。○ xyz.openbmc_project.Inventory.Item:
Present:
Offsets:
0x07:
assert: true
deassert: false
skipOn: deassert
type: bool

三、配置

3-1 yaml文件加载

TODO

3-4 属性配置文件xxx-fru-properties.yaml文件

在最新的openbmc代码中,关于fru多了一个在位信息判断,这里我是通过yaml配置的,然后和fru.yaml一同加载
文件路径和fru.yaml文件一致,内容如下:

/system/chassis/motherboard/bmc:xyz.openbmc_project.Inventory.Decorator.Cacheable:Cached: 'true'xyz.openbmc_project.Inventory.Decorator.Replaceable:Field Replaceable: 'true'xyz.openbmc_project.Inventory.Item:Present: 'true'

【openbmc添加fru信息通过ipmitool命令读取】【后续】相关推荐

  1. 【openbmc添加fru信息通过ipmitool命令读取】

    生不带来,死带不走系列 文章目录 前言 一.下载软件包 二.添加fru信息到ipmi 1.ipmi配置文件转cpp 2.配置ipmi配置文件 3.fru配置文件说明 3-1 ipmi目录下创建phos ...

  2. openbmc开发23:添加fru信息到ipmi

    前面说过如何添加sensor传感器信息(I2C.ADC.FAN)到ipmi,本文内容说明如何将fru信息添加到ipmi中,下面将详细说明. 1 ipmi配置文件转换成cpp 在软件包下有一个scrip ...

  3. 036、Linux下ipmitool命令

    http://www.ibm.com/developerworks/cn/linux/l-ipmi/ http://my.oschina.net/davehe/blog/88801 1.IPMI(In ...

  4. ipmitool命令使用

    一.开关机,重启 查看开关机状态: ipmitool -H (BMC的管理IP地址) -I lanplus -U (BMC登录用户名) -P (BMC 登录用户名的密码) power status 开 ...

  5. ipmitool命令详解

    原文链接:https://www.cnblogs.com/EricDing/p/8995263.html [root@localhost ~]# yum install -y ipmitool #安装 ...

  6. 通过srvctl add命令添加database信息到srvctl管理器

    ================================================ 通过srvctl add命令添加database信息到srvctl管理器 ============== ...

  7. Android添加联系人信息并读取

    Android添加联系人信息并读取 效果图 题目 1. 创建一个File文件,路径为/mnt/sdcard/temp/zhiyuan.txt 2. 进入主页面后自动从File文件中读取联系人数据,每个 ...

  8. Linux操作命令之ipmitool命令参数详解

    Ipmitool --   对于控制支持IPMI的设备有效. Synopsis(概要) ipmitool [-c|-h|-v|-V]-I open <command> ipmitool [ ...

  9. ipmitool命令总结

     Name(名字) Ipmitool --   对于控制支持IPMI的设备有效. Synopsis(概要) ipmitool [-c|-h|-v|-V]-I open <command> ...

最新文章

  1. 听说数据标注行业缺“中立”平台,京东金融竖起了大旗
  2. hadoop配置安装
  3. python官网32位下载_python32位下载-Python for Windows 32位下载 v3.8.0官方版--pc6下载站...
  4. 细水长flow之f-VAEs:Glow与VAEs的联姻
  5. securecrt delete键向后删除
  6. 计算机语言可读性排名,计算机语言可读性强,容易记忆
  7. 一步一步实现一个简单的OS(先小装一下)
  8. git is outside repository
  9. 计算机如何删除已连接的打印机驱动程序,hp打印机驱动怎么彻底卸载 hp打印机驱动卸载教程...
  10. 分类和标注词汇(基于nltk)
  11. linux和windows内存管理知乎,windows server 哪个版本好 知乎
  12. [offer收割]编程联系赛2-A 买零食
  13. 连接ARM设备的两种方式
  14. Linux Overview
  15. 英语语法汇总(11.直接引语和间接引语)
  16. linux md是什么格式文件,MD_ 文件扩展名: 它是什么以及如何打开它?
  17. 智慧环保综合解决方案 大数据打造生态治理系统平台
  18. 使用 OpenCV+CVzone 进行实时背景替换
  19. python接口测试返回数据为字典取值
  20. SpeedSeq:快速的基因组数据分析软件

热门文章

  1. 华里士(Wallis)公式推导
  2. win10与Linux虚拟机进行文件共享
  3. listeners和advertised.listeners区别
  4. matlab之矩阵两列合并一列
  5. 待办事项清单和提醒软件有哪些 好用的每日待办提醒便签
  6. ARM 汇编命令参考AREA
  7. 54页智慧城市大脑建设方案
  8. 智能婴儿床市场现状研究与发展前景预测分析
  9. python坐标系图解_入门-Python-GIS坐标转换
  10. django admin系统