在model.json中配置某个对象的某个属性配置"usage": ["CSR"]的作用是什么呢?

// 此模板仅供参考,如果不适用可以修改

问题描述

  1. 想知道这个配法的具体作用?意思该属性的值只能来源于CSR么还是后期通过代码可以更新?
  2. 如果我新建的某个对象要在CSR文件中使用的话要怎样做呢?
  3. 在定义path是最后/${id}的作用是什么

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

[您希望实现什么]

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

答案内容由AI生成,仅供参考:

总结

问题 回答
"usage": ["CSR"] 的作用? 表示该属性的初始值来自 CSR 配置文件
值只能来源于 CSR 吗? :cross_mark: 不是,CSR 提供初始值,运行时可通过代码修改
是否支持持久化? :cross_mark: 单独使用 CSR 不持久化,需配合 PoweroffPer
如何在 CSR 中使用对象? 1. 在 model.json 定义类和属性
2. 设置 usage: CSR
3. 在 CSR 文件中实例化对象
点击此处查看详细分析解答

model.json中配置 "usage": ["CSR"] 的作用详解

问题描述

在 OpenUBMC 系统的 model.json 文件中,为对象的某个属性配置 "usage": ["CSR"] 是一种常见的做法。本回答将详细解释该配置的具体作用、属性值来源、运行时可修改性,以及如何在 CSR 文件中正确使用该对象。


"usage": ["CSR"] 的作用

1. 核心作用:标识配置来源

当为 model.json 中的属性设置 "usage": ["CSR"] 时,其核心作用是明确该属性的初始值来源于 CSR(Configuration and Status Register)配置文件

  • :white_check_mark: 表示此属性的默认值或初始值由 CSR 文件提供
  • :white_check_mark: BMC 系统在启动过程中会解析 CSR 文件,并将其中定义的属性值加载到内存数据库中。
  • :white_check_mark: 若 CSR 文件中未配置该属性,则系统将使用 model.json 中定义的 default 值;若也未定义 default,则使用数据类型的默认值(如 int 类型为 0)。

知识依据

  • CSR Configuration 是系统级配置框架,用于定义硬件和软件参数,其中包含 register-level 配置和静态定义(如 Model、Version、Presence 等)。
  • model.json 定义了数据模型和类结构,usage: CSR 表示该字段的值可来源于 CSR。

2. 是否只能来源于 CSR?

:cross_mark: 不是“只能”来源于 CSR,而是“优先从 CSR 加载初始值”。

:white_check_mark: 后期可通过代码更新该属性值

一旦系统启动完成,该属性的值可以被业务代码(如 Lua 脚本)在运行时动态修改,并支持持久化(取决于其他 usage 配置)。

:warning: 持久化机制说明

  • 如果仅配置 usage: ["CSR"]该属性不会自动持久化
  • 若希望修改后的值在重启后保留,需配合其他持久化标识,如:
    "usage": ["CSR", "PoweroffPer"]     // 掉电持久化
    "usage": ["CSR", "PermanentPer"]   // 永久持久化
    
  • 根据持久化机制文档:包含 usage: CSR 的表,只有在业务代码修改过属性值后才会写入持久化数据库

知识依据

  • “在CSR文件中有配置的属性,业务没有修改过属性值的情况下不会持久化” —— 持久化机制FAQ
  • 启动时使用持久化数据覆盖 CSR 配置数据,避免 CSR 修改后因持久化值存在而失效。

如何在 CSR 文件中使用该对象?

要让你定义的对象能够在 CSR 文件中被识别和使用,必须满足以下条件:

:white_check_mark: 步骤 1:在 model.json 中正确定义类和属性

{
  "Class": "MyCustomComponent",
  "path": "/redfish/v1/Systems/System0/CustomComponent",
  "interfaces": ["bmc.myapp.ICustomComponent"],
  "properties": {
    "Model": {
      "type": "string",
      "usage": ["CSR"],           // 表示此属性值来自 CSR
      "default": "DEFAULT_MODEL"
    },
    "Presence": {
      "type": "boolean",
      "usage": ["CSR"]
    }
  }
}

:white_check_mark: 步骤 2:确保 MDS 编译时包含该定义

  • model.json 放在组件仓的 /mds 目录下。
  • 使用 merge_model.py 脚本生成最终的 model.json
  • 构建系统会根据此文件自动生成 D-Bus 接口、数据库 Schema 和访问代码。

:white_check_mark: 步骤 3:在 CSR 文件中配置该对象

.sr.json 格式的 CSR 文件中添加该对象实例:

{
  "Objects": {
    "MyCustomComponent0": {
      "Class": "MyCustomComponent",
      "Model": "ModelX200",
      "Presence": true
    }
  }
}

:white_check_mark: 步骤 4:CSR 文件校验与加载

  • 使用 BMC Studio 工具进行语法校验和一致性检查(如 /studio-tool/consistency-check/checkStatus)。
  • 确保对象名、类名、属性类型和值均符合 model.json 定义。
  • 系统启动时,硬件自发现机制会自动解析 CSR 文件并实例化对象。

知识依据

  • “Objects对象下配置的属性,需在对象对应类管理的资源协作接口属性或私有属性中定义,且 usage 字段要被设置为 ‘CSR’。” —— 硬件自描述文件(CSR)
  • CSR 文件是 structured document,定义 hardware 和 system parameters。

注意事项与常见问题

问题 原因 解决方案
属性值未生效 CSR 中未配置该属性,且 model.jsondefault 在 CSR 或 model.json 中补全配置
修改后重启失效 仅配置 usage: CSR,未加持久化字段 添加 PoweroffPerPermanentPer
对象无法创建 CSR 中属性未在 model.json 定义 检查类定义和 usage 配置
主键冲突 多个 CSR 对象主键值相同 确保 primaryKey 属性在 CSR 中唯一

参考:持久化机制 FAQ 指出,主键冲突会导致 AddObject failed 和数据干扰。


总结

问题 回答
"usage": ["CSR"] 的作用? 表示该属性的初始值来自 CSR 配置文件
值只能来源于 CSR 吗? :cross_mark: 不是,CSR 提供初始值,运行时可通过代码修改
是否支持持久化? :cross_mark: 单独使用 CSR 不持久化,需配合 PoweroffPer
如何在 CSR 中使用对象? 1. 在 model.json 定义类和属性
2. 设置 usage: CSR
3. 在 CSR 文件中实例化对象

参考资料

  1. ${Id}是一个展位,最终解析的对象路径将会把${Id}替换为对象名

配法的作用:

  1. 资源树对象的属性的初始值来源大致有:数据库的持久化数据、自发现的csr配置数据、自发现对象添加回调中的赋值
  2. 某个属性配置CSR后该对象就是自发现对象,需要通过on_add_object注册回调的方式添加对象,在执行添加回调前后会经历获取属性类型默认值->模型定义的默认值->根据自发现解析的属性配置->数据库中持久化的值->添加回调中赋值 这样的优先级顺序来确认资源树上树后的初始值,并且后续可以随时在代码中更新

1.那使用on_add_object添加的对象要怎样访问呢?

2.比如我在csr定义了MyCSRModel_1这个自发现对象,那实际添加对象的时候使用self.mycsrmodel= object_manage.on_add_object金接口来添加 对象; 那我如果定义了MyCSRModel_1,MyCSRModel_2这两个或者多个的情况要怎样添加对象呢?

这种${id}语法使用场景是咋样的呢?能具体举例说下吗?

参考这个文档,硬件自发现 | 文档中心 | openUBMC
on_add_object会把object传入注册的回调函数,每当有一个MyCSRModel对象分发,就会触发一次回调,你可以用对象名(或别的什么标识)作为键把对象存起来,这样就可以在需要的时候查表访问对象。