全局属性特性说明与配置指导
适用对象:开发、测试、维护人员 关联实现:
pre-commit-hooks/hooks/check_global_properties.py(提交期校验)、bingo/tools/payload/usr/share/bingo/schema/global_model.schema.json(模型定义)
1. 特性说明
1.1 什么是全局属性
全局属性(Global Properties)是 openUBMC 提供的一类跨组件共享的配置/状态数据。它以固定资源协作路径对外暴露,供 BMC 上各子系统(管理器、传感器、FRU 控制等)统一读写,避免各组件各自定义私有接口造成数据孤岛。
全局属性的配置统一定义在 global.json 中,产品构建时由 Manifest 产品仓库预置,原样打包进镜像:
manifest/build/product/{产品线}/{单板}/rootfs/opt/bmc/conf/global/global.json
→ 打包进镜像 /opt/bmc/conf/global/global.json1.2 核心设计约束
| 约束 | 规则 |
|---|---|
| 资源路径 | 固定为 /bmc/kepler/Global(完全匹配,不允许带子路径) |
| 接口前缀 | 接口名必须以 bmc.kepler.Global. 开头 |
| 属性命名 | 必须以大写字母开头,仅含字母和数字(`^[A-Z][a-zA-Z0-9]*--- |
全局属性特性说明与配置指导
适用对象:开发、测试、维护人员 关联实现:
pre-commit-hooks/hooks/check_global_properties.py(提交期校验)、bingo/tools/payload/usr/share/bingo/schema/global_model.schema.json(模型定义)
1. 特性说明
1.1 什么是全局属性
全局属性(Global Properties)是 openUBMC 提供的一类跨组件共享的配置/状态数据。它以固定资源协作路径对外暴露,供 BMC 上各子系统(管理器、传感器、FRU 控制等)统一读写,避免各组件各自定义私有接口造成数据孤岛。
全局属性的配置统一定义在 global.json 中,产品构建时由 Manifest 产品仓库预置,原样打包进镜像:
manifest/build/product/{产品线}/{单板}/rootfs/opt/bmc/conf/global/global.json
→ 打包进镜像 /opt/bmc/conf/global/global.json1.2 核心设计约束
| 约束 | 规则 |
|---|---|
| 资源路径 | 固定为 /bmc/kepler/Global(完全匹配,不允许带子路径) |
| 接口前缀 | 接口名必须以 bmc.kepler.Global. 开头 |
| 属性命名 | 必须以大写字母开头,仅含字母和数字() |
| 数据类型 | 仅支持整型 / String / Boolean,不支持 Array / Struct / Dictionary |
| 字符串长度 | String 最大 256 Byte |
| 属性数量 | 总数 ≤ 500 个 |
1.3 校验机制(两层)
校验由 pre-commit 钩子 check-global-properties 在 git 提交时自动执行,分两层:
Layer 1 — 静态结构规则(始终执行)
对文件本身做合法性检查:路径、接口前缀、属性名、类型白名单、String 长度、数量上限。不合法则报错并阻断提交。
Layer 2 — 变更检测(对比 git HEAD 已提交版本)
| 字段类别 | 字段 | 变更后果 |
|---|---|---|
| 禁止变更 | baseType、usage、enum、minimum、maximum、minLength、maxLength、pattern | ERROR,阻断提交(变更会引入兼容性问题) |
| 允许变更 | privilege、readOnly、default | WARNING,不阻断,但提醒评估影响 |
禁止变更的原因:类型、持久化方式、取值范围决定了属性的存储格式与外部契约。一旦变更,旧版本持久化数据、依赖该属性的组件会读取失败,引发兼容性故障。
2. 配置指导
2.1 文件整体结构
{
"Global": {
"path": "/bmc/kepler/Global",
"interfaces": {
"bmc.kepler.Global.<分组>.<子分组>": {
"properties": {
"<属性名>": { ... }
}
}
}
}
}结构要点:
- 顶层只能有
Global一个类,不允许其他类。 Global下只有path与interfaces两个字段。- 每个接口只允许
properties,不允许methods、signals等。 - 接口名、属性名、字段均区分大小写。
2.2 属性字段速查表
| 字段 | 类型 | 必填 | 说明 | 变更限制 |
|---|---|---|---|---|
baseType | string | ✅ | 数据类型,取值见 2.3 | 🚫 禁止变更 |
default | JSON 值 | ❌ | 默认值,类型须与 baseType 匹配 | ⚠️ 允许变更(告警) |
readOnly | boolean | ❌ | 是否只读,false 表示可读写 | ⚠️ 允许变更(告警) |
privilege | object | ❌ | 读写角色权限,见 2.4 | ⚠️ 允许变更(告警) |
usage | array | ❌ | 持久化类型,见第 3 节 | 🚫 禁止变更 |
enum | array | ❌ | 取值范围:枚举值列表 | 🚫 禁止变更 |
minimum / maximum | number | ❌ | 取值范围:数值下/上限 | 🚫 禁止变更 |
minLength / maxLength | integer | ❌ | 取值范围:字符串长度下/上限(≤256) | 🚫 禁止变更 |
pattern | string | ❌ | 取值范围:字符串正则匹配模式 | 🚫 禁止变更 |
description | string | ❌ | 属性描述 | ✅ 自由修改 |
critical | boolean | ❌ | 是否关键属性 | ✅ 自由修改 |
notAllowNull | boolean | ❌ | 是否不允许为空 | ✅ 自由修改 |
options | object | ❌ | 扩展选项(如 emitsChangedSignal) | ✅ 自由修改 |
禁止出现的字段:
alias、featureTag、sensitive。出现即校验失败。
2.3 baseType 类型白名单
| 类别 | 取值 |
|---|---|
| 无符号整型 | U64、U32、U16、U8 |
| 有符号整型 | S64、S32、S16、S8 |
| 字符串 | String |
| 布尔 | Boolean |
不支持:Array、Struct、Dictionary、浮点型。
2.4 privilege 访问权限
privilege 描述读、写分别允许的角色列表:
"privilege": {
"read": ["ReadOnly"],
"write": ["BasicSetting"]
}常见角色:ReadOnly、BasicSetting、AdminSetting 等。只读属性可省略 write。
2.5 String 长度规则
maxLength不得超过 256。default为字符串时,其 UTF-8 Byte长度不得超过 256。
3. 硬件自描述同步全局属性语法
硬件自描述同步在 CSR 配置(.sr 文件) 中声明:通过 <=/ 表达式,把硬件自描述对象的属性与其他对象属性建立双向同步;当目标为全局属性时,目标对象名须以 Global 开头。解析实现见 devmon 的 libs/common/src/csr_parser.cpp、csr_utils.cpp(is_sync / get_sync_targets / make_simple_sync_url 等)。
注意:同步语法写在 .sr 配置的属性值中,不是写进 global.json。global.json 只定义全局属性侧的契约(类型、权限、持久化、取值范围等,见第 2 节)。
3.1 usage 类型枚举
| 取值 | 含义 |
|---|---|
PermanentPer | 永久持久化,掉电不丢失 |
PoweroffPer | 下电持久化 |
ResetPer | 复位持久化 |
TemporaryPer | 临时持久化(运行时有效) |
PoweroffPerRetain / ResetPerRetain / TemporaryPerRetain | 对应持久化类型的保留变体 |
Memory | 仅存内存,不持久化 |
CSR | 全局属性映射 CSR 寄存器(属性侧声明) |
3.2 同步标记语法
同步全局属性的格式为 <=/::Global.<分组>.<属性名>:
"propA": "<=/::Global.Common.Power.PowerState"| 语法要素 | 含义 |
|---|---|
<=/ | 同步标记(SYNC_TAG),声明该属性与目标属性双向同步 |
:: | 全局标记;目标对象名以 Global 开头时,解析器通过全局模型(global.json)查找全局属性;否则目标为 root.sr / platform.sr 中的全局对象属性,与全局属性无关 |
Global.<分组>.<属性名> | 全局属性目标:global.json 接口 bmc.kepler.Global.<分组> 下注册的属性 |
不带 :: 时,目标为本地对象组中的对象属性。
3.3 语法形态
| 形态 | 示例 | 说明 |
|---|---|---|
| 简单同步目标 | "<=/objA.propA" | 同步本CSR属性 |
| 全局属性同步目标 | "<=/::Global.Common.Power.PowerState" | 目标对象名以 Global 开头,同步 global.json 定义的全局属性 |
| 表达式管道 | "<=/::objB.propB |> string.cmp($1, 'ON')" | |> 后接转换表达式 |
3.4 与全局属性模型的分工
| 侧 | 文件 | 职责 |
|---|---|---|
| 全局属性侧 | global.json | 定义属性契约:类型、权限、持久化(usage 含 CSR 表示映射 CSR 寄存器)、取值范围 |
| 硬件自描述侧 | .sr 配置 | 通过 <=/::Global.<分组>.<属性名> 引用全局属性,声明同步关系 |
同步双方的类型、取值范围必须匹配,否则运行时绑定失败。
4. 开发样例
4.1 完整示例
{
"Global": {
"path": "/bmc/kepler/Global",
"interfaces": {
"bmc.kepler.Global.Managers.SOC": {
"properties": {
"BmcResetType": {
"baseType": "U8",
"readOnly": false,
"usage": [],
"default": 255,
"privilege": {
"read": ["ReadOnly"],
"write": ["BasicSetting"]
}
}
}
},
"bmc.kepler.Global.Systems.FruCtrl": {
"properties": {
"SystemPowerOnStatus": {
"baseType": "U32",
"readOnly": false,
"usage": ["CSR", "TemporaryPer"],
"default": 0,
"privilege": {
"read": ["ReadOnly"],
"write": ["BasicSetting"]
}
}
}
},
"bmc.kepler.Global.NodeLocation": {
"properties": {
"LocationId": {
"baseType": "String",
"maxLength": 64,
"readOnly": true,
"usage": ["CSR", "TemporaryPer"],
"default": "",
"description": "节点位置标识",
"privilege": {
"read": ["ReadOnly"]
}
}
}
},
"bmc.kepler.Global.ActiveStandby": {
"properties": {
"Status": {
"baseType": "Boolean",
"readOnly": false,
"usage": ["TemporaryPer"],
"default": false,
"description": "本板主备状态,false:Standby,true:Active",
"privilege": {
"read": ["ReadOnly"],
"write": ["BasicSetting"]
}
}
}
}
}
}
}4.2 常见类型样例
整型带取值范围(禁止后续变更范围):
"FanSpeedLevel": {
"baseType": "U8",
"minimum": 0,
"maximum": 100,
"default": 50,
"readOnly": false
}枚举型:
"WorkMode": {
"baseType": "U8",
"enum": [0, 1, 2],
"default": 0,
"description": "0:正常 1:节能 2:高性能"
}字符串带长度与模式约束:
"DeviceSerial": {
"baseType": "String",
"minLength": 8,
"maxLength": 64,
"pattern": "^[A-Z0-9]+$",
"default": "",
"readOnly": true
}5. 场景问题定位指南
钩子输出的每条日志都带定位信息:<文件>: [级别] 属性 <接口>.<属性名> 的 <字段> ...。对照下表快速定位。
5.1 静态规则错误(阻断提交)
| 报错关键字 | 原因 | 处理 |
|---|---|---|
全局属性路径 '...' 不合法 | path 不是 /bmc/kepler/Global | 改回固定值,不要带子路径 |
接口 ... 不合法,必须以 bmc.kepler.Global. 为前缀 | 接口名拼错或前缀缺失 | 接口名以 bmc.kepler.Global. 开头 |
属性名 ... 必须以大写字母开头 | 属性名小写开头或含非法字符 | 改为大写驼峰,仅字母数字 |
类型 ... 不在白名单内 | baseType 用了 Float/Array 等 | 改用 10 种白名单类型 |
未配置 baseType | 属性缺 baseType | 补充 baseType |
maxLength ... 超过上限 256 | String 长度超限 | maxLength ≤ 256 |
默认值长度超过 256 Byte | String 默认值超长 | 缩短默认值(注意中文占 3 Byte) |
属性总数 ... 超过上限 500 | 属性过多 | 精简或拆分 |
解析失败 | JSON 格式错误 | 检查括号、逗号、引号 |
5.2 禁止变更错误(阻断提交)
报错形如:
[禁止变更] 属性 bmc.kepler.Global.X.Y 的 baseType 发生了变更,变更后会引入兼容性问题。旧值: "U8",新值: "U32"| 触发字段 | 含义 | 处理 |
|---|---|---|
baseType | 改了数据类型 | 不允许改。如确需新类型,新增属性并废弃旧属性 |
usage | 改了持久化类型(含增删 CSR) | 不允许改。需新属性承载 |
enum | 改了枚举取值 | 不允许改。只读场景评估后用新属性 |
minimum / maximum | 改了数值范围 | 不允许改 |
minLength / maxLength | 改了字符串长度范围 | 不允许改 |
pattern | 改了匹配模式 | 不允许改 |
排查思路:用
git diff HEAD -- <global.json>查看该属性的变更。若是误改,还原即可;若业务确需变更契约,走"新增属性 + 废弃旧属性"流程,不要原地修改。
5.3 允许变更告警(不阻断)
告警形如:
[可能影响] 属性 bmc.kepler.Global.X.Y 的 default 发生了变更,请评估影响。旧值: 255,新值: 128| 字段 | 变更影响评估点 |
|---|---|
default | 新部署/恢复出厂时生效值变化,确认不影响存量逻辑 |
readOnly | 读写能力变化,确认上层是否有写依赖 |
privilege | 角色权限变化,确认是否有角色被收紧/放宽 |
告警不阻断提交,但需在提交说明或评审中给出影响评估结论。
6. 配置检查清单(提交前自查)
- [ ]
path为/bmc/kepler/Global,无子路径 - [ ] 所有接口名以
bmc.kepler.Global.开头 - [ ] 所有属性名大写驼峰、仅字母数字
- [ ] 每个属性都配置了
baseType,且在白名单内 - [ ] String 属性
maxLength≤ 256,默认值Byte长度 ≤ 256 - [ ] 属性总数 ≤ 500
- [ ] 未使用
alias/featureTag/sensitive字段 - [ ] 本次提交未改动已有属性的
baseType/usage/ 取值范围 - [ ] 若改动了
privilege/readOnly/default,已完成影响评估 - [ ] JSON 格式合法(可用
python3 -m json.tool <file>验证)