鸿蒙OpenHarmony【系统参数】子系统init启动引导组件

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

概述

功能简介

OHOS系统参数为各系统服务提供简单易用的键值对访问接口,使得各个系统服务可以通过各自的系统参数来举行业务功能的设置。
系统参数定义

每个子系统定义各自模块的系统参数,包括系统参数名称、默认值以及系统参数的权限访问信息。
系统参数定义文件



  • 系统参数定义文件后缀名为".para" ,其格式示比方下:
    1. const.product.name=OHOS-PRODUCT
    2. const.os.version.api=26
    3. const.telephony.enable=false|true
    复制代码
系统参数名(key)定义



  • 系统参数定名格式
    系统参数名称接纳点分格式,由多段组成,每一段可以由字母、数字、下划线组成,总长度不超过96字节;系统参数名称分为两类:
    系统参数名称
       种别名称示例说明参数名称Parameter Nameconst.product.name完备的系统参数名称,末尾不是"."。参数目录Parameter Directoryconst.**.以"."结尾,标知趣同前缀的全部系统参数集合。
  • 系统参数类型
    系统参数一共分为三大类:
    系统参数分类
       种别前缀说明常量const.常量参数,一旦赋值后续不会再变动;值最大长度为4096字节(包括竣事符)。可写别的可写参数,重启后丢失,值最大长度96字节(包括竣事符)。可持久化persist.可写并可持久化保存参数,重启后不会丢失,值最大长度96字节(包括竣事符)。每个系统参数名称总体格式如下:
    1. [ const | persist ].$sub_system.$desc
    2. java
    复制代码
    $sub_system为子系统或模块的名称。
    $desc为子系统或模块下参数的形貌字符,可以为点分格式举行分级形貌。
系统参数值(value)定义



  • 系统参数的赋值分为三大类:
系统参数赋值方式
种别示例说明字符串const.product.name=OHOS-PRODUCT多行字符串必要通过引号扩起来。数字const.os.version.api=26数字不必要。布尔const.telephony.enable=false布尔型的可以为0,1,false,true。 系统参数权限设置

系统参数支持DAC和MAC访问控制。
默认权限

系统参数没有定义任何DAC,MAC权限时,其默认权限为:
[DAC] User[DAC] Group[DAC] UGO[MAC] SELinux Labelrootroot775default_param Other进程对默认权限参数的访问行为枚举如下:
操纵系统Native进程系统应用进程三方应用进程get答应答应答应watch答应答应答应set不答应不答应不答应 DAC访问控制权限设置



  • 系统参数DAC访问控制定义文件
    当前系统参数的访问权限控制通过自主访问控制(Discretionary Access Control)方式管理,访问权限定义文件后缀名为".para.dac" ,init下的文件路径为/base/startup/init/services/etc/param/ohos.para.dac,详细定义内容示比方下:
    1. const.product.              = root:root:0775
    2. persist.init.               = root:root:0775
    3. startup.appspawn.           = root:root:0750
    4. startup.uevent.             = ueventd:ueventd:0775
    复制代码
    如上所示,可以为相同前缀的全部系统参数定义一类访问权限信息,DAC信息通过":"分三段来形貌,分别为参数的user,group以及UGO规则信息。
    UGO规则信息每一位的定义如下:
    图1 UGO规则信息

MAC访问控制权限设置



  • 添加selinux标签
    为系统参数添加selinux标签,首先必要在文件/base/security/selinux_adapter/sepolicy/base/public/parameter.te中定义标签,比方:
    1. type servicectrl_param, parameter_attr
    2. java
    复制代码
    标签订义完成后,在文件/base/security/selinux_adapter/sepolicy/base/public/parameter_contexts中添加和标签关联的系统参数前缀,这里以前缀ohos.servicectrl.为例:
    1. ohos.servicectrl.           u:object_r:servicectrl_param:s0
    2. java
    复制代码
  • 给init授权,答应map等操纵,在文件/base/security/selinux/sepolicy/ohos_policy/startup/init/public/init.te中增补下面内容:
    1. allow servicectrl_param tmpfs:filesystem associate;
    2. allow init servicectrl_param:file { map open read relabelto relabelfrom };
    3. java
    复制代码
  • 设置写权限,这里答应init samgr hdf_devmgr 举行系统参数写:
    1. allow { init samgr hdf_devmgr } servicectrl_param:parameter_service { set };
    2. java
    复制代码
  • 设置读权限,假如只答应部分进程访问可单独对该进程授权:
    1. allow { xxx } servicectrl_param:file { map open read };
    2. java
    复制代码
  • 假如全部答应,则设置为:
    1. allow { domain -limit_domain } servicectrl_param:file { map open read };
    2. java
    复制代码
系统参数权限根本要求

  1. 每个selinux标签对应的系统参数有独立的共享内存区,同类型的系统参数建议共用selinux标签,减少系统共享内存的开销。
  2. 以sample部件为例,建议增加以下几类标签进行访问控制:
  3. a)公开只读的系统参数,不需要定义新的标签,使用default_param
  4. b)可写系统参数:增加标签{component}_writable_param
  5. c)仅部件内部可读的系统参数(隐私数据):增加标签【可选】 {component}_private_param
复制代码
系统参数标签设置

系统参数标签文件大小设置

每个标签默认分配1K内存,能存放5个左右的系统参数。假如标签下支持的系统参数较多,需在ohso.para.size文件中按照标签扩大内存大小。
支持/system/etc/param/ohos.para.size和/sys_prod/etc/param/ohos.para.size举行扩展。
设置规则:
系统参数标签=大小
比方:
  1. devinfo_public_param=30720
  2. hilog_param=40960
复制代码
默认系统参数的共享内存大小:80KB
系统参数标签说明

init 会根据系统参数标签在/dev/parameters/目录下创建对应的共享内存映射文件,该共享内存用来存储与该标签绑定的系统参数。
共享内存文件示例:
  1. -rwxr-xr-- 1 root root 30720 2017-08-10 16:22 u:object_r:default_param:s0
  2. -rwxr-xr-- 1 root root  1024 2017-08-10 16:22 u:object_r:devinfo_private_param:s0
  3. -rwxr-xr-- 1 root root 30720 2017-08-10 16:22 u:object_r:devinfo_public_param:s0
  4. -rwxr-xr-- 1 root root 40960 2017-08-10 16:22 u:object_r:hilog_param:s0
复制代码
系统参数标签会在/base/security/selinux_adapter/sepolicy/base/public/parameter.te文件中定义:
系统参数标签订义:
  1. type default_param, parameter_attr;
  2. type devinfo_private_param, parameter_attr;
  3. type devinfo_public_param, parameter_attr;
  4. type hilog_param, parameter_attr;
复制代码
系统参数标签与系统参数的关联在/base/security/selinux_adapter/sepolicy/base/public/parameter_contexts定义:
以hilog_param标签为例:
  1. hilog.                   u:object_r:hilog_param:s0  #以hilog.为前缀的系统参数存储在hilog_param标签对应的共享内存中
  2. persist.sys.hilog.       u:object_r:hilog_param:s0  #以persist.sys.hilog.为前缀的系统参数也存储在hilog_param标签对应的共享内存中
复制代码
查看系统参数共享内存占用情况

  1. 系统参数共享内存占用情况的查询,提供了查询命令:param dump [verbose]
  2. 查询结果的介绍说明如下:
  3. ```
  4.   Dump all parameters begin ...
  5.   Local security information
  6.   pid: 1612 uid: 0 gid: 0
  7.   map file: u:object_r:default_param:s0            // 系统参数标签名称(共享内存映射文件名)
  8.   total size: 10485720                             // 系统参数标签文件大小(标签映射的共享内存大小)
  9.   first offset: 0                                  // 第一个参数节点的偏移量
  10.   current offset: 15948                            // 当前的参数节点的偏移量
  11.   total node: 242                                  // 该标签内节点总数
  12.   total param node: 219                            // 参数节点总数
  13.   total security node: 0                           // selinux节点数
  14.   commitId        : 26                             //
  15.   commitPersistId : 0                              //
  16.   node info:                                       // 该标签下所有节点的信息
  17.   ... ...
  18. ```
复制代码
系统参数的加载次序

  1. 系统参数加载顺序
  2. | 类别 | 路径 | 说明 |
  3. | -------- | -------- | -------- |
  4. | 内核参数    | /proc/cmdline | 将内核参数中的部分值转化成系统参数,并保存。内核参数中.xxx=valXXX类型的参数都转换成ohos.boot.xxx=valXXX系统参数。 |
  5. | OS系统参数 | /system/etc/param/ohos_const/*.para | OS固定系统参数值参数优先加载。                               |
  6. | vendor参数 | /vendor/etc/param/*.para | 厂商定义的系统参数次优先级加载。                             |
  7. | system参数 | /system/etc/param/*.para | 加载各子系统定义的参数参数。如果系统参数已经存在,则忽略掉。 |
  8. | persist参数 | /data/parameters/ | 如果持久化参数存在,则最后加载持久化系统参数。持久化系统参数会覆盖加载的默认系统参数。 |
复制代码
参数和标签的展示

目前按照子系统,部件把参数和标签统计的信息已经录入数据库,可以搭建[OpenHarmony实时架构信息网络与分析系统]举行查看
数据库也可以取逐日构建的dayu200-db
系统参数的根本操纵

系统参数操纵原语

系统参数操纵原语说明
功能说明get获取系统参数的值set设置系统参数的值wait同步等候系统参数的值变动watch异步观察系统参数的值变动 约束与限制

仅限小型系统、尺度系统下利用。
开发指导

场景介绍

设定特定的系统参数
接口说明



  • Shell下令接口
    通过shell下令中可直接操纵系统参数(只在尺度系统提供)。系统参数shell下令如下表所示:
    表6 系统参数shell下令说明
       功能说明param get [key]获取指定key名称的系统参数值;假如不指定任何name,则返回全部系统参数值。param set key value设置指定key名称的参数值为value。param wait key value同步等候指定key名称的系统参数值与value匹配。value可支持含糊匹配,如""表示任何值,"val"表示只匹配前三个val字符。
  • syspara系统接口
    在Coding中可以调用下列函数接口,获取对应的系统参数值(系统参数接口返回的为const字符串,不支持free操纵)。
    表7 系统属性接口说明
       接口名形貌int GetParameter(const char* key, const char* def, char* value, unsigned int len)获取系统参数。int SetParameter(const char* key, const char* value)设置/更新系统参数。const char* GetDeviceType(void)返回当前设备类型。const char* GetManufacture(void)返回当前设备生产厂家信息。const char* GetBrand(void)返回当前设备品牌信息。const char* GetMarketName(void)返回当前设备传播名。const char* GetProductSeries(void)返回当前设备产品系列名。const char* GetProductModel(void)返回当前设备认证型号。const char* GetSoftwareModel(void)返回当前设备内部软件子型号。const char* GetHardwareModel(void)返回当前设备硬件版本号。const char* GetHardwareProfile(void)返回当前设备硬件profile。const char* GetSerial(void)返回当前设备序列号(SN号)。const char* GetOSFullName(void)返回操纵系统名。const char* GetDisplayVersion(void)返回当前设备用户可见的软件版本号。const char* GetBootloaderVersion(void)返回当前设备Bootloader版本号。const char* GetSecurityPatchTag(void)返回安全补丁标签。const char* GetAbiList(void)返回当前设备支持的指令集(Abi)列表。int GetSdkApiVersion(void)返回与当前系统软件匹配的SDK API 版本号。int GetFirstApiVersion(void)返回系统软件首版本SDK API 版本号。const char* GetIncrementalVersion(void)返回差异版本号。const char* GetVersionId(void)返回版本id。const char* GetBuildType(void)返回构建类型。const char* GetBuildUser(void)返回构建账户用户名。const char* GetBuildHost(void)返回构建主机名。const char* GetBuildTime(void)返回构建时间。const char* GetBuildRootHash(void)返回当前版本hash。const char* GetOsReleaseType(void)返回系统发布类型。int GetDevUdid(char *udid, int size)获取设备udid。const char *AclGetSerial(void);返回当前设备序列号(SN号)(带访问权限检查)。int AclGetDevUdid(char *udid, int size);获取设备udid(带访问权限检查)。
开发步骤


  • 系统参数定义
    通过定义子系统大概产品的.para和.para.dac文件,实现默认系统参数的定义和权限控制。
    ​ 在尺度系统上通过ohos_prebuilt_para模版安装设置文件到到/etc/param/目录下,GN脚本示比方下:
    1. import("//base/startup/init/services/etc/param/param_fixer.gni")
    2. ohos_prebuilt_para("ohos.para") {
    3.     source = "//base/startup/init/services/etc/ohos.para"
    4.     part_name = "init"
    5.     module_install_dir = "etc/param"
    6. }
    7. ohos_prebuilt_para("ohos.para.dac") {
    8.     source = "//base/startup/init/services/etc/ohos.para.dac"
    9.     part_name = "init"
    10.     module_install_dir = "etc/param"
    11. }
    12. go
    复制代码
    在小系统上,通过copy下令,把对应的系统参数定义文件拷贝到system/etc/param目录下
    1. copy("ohos.para") {
    2.   sources = [ "//base/startup/init/services/etc/param/ohos.para" ]
    3.   outputs = [ "$root_out_dir/system/etc/param/ohos.para" ]
    4. }
    5. copy("ohos.para.dac") {
    6.   sources = [ "//base/startup/init/services/etc/param/ohos.para.dac" ]
    7.   outputs = [ "$root_out_dir/system/etc/param/ohos.para.dac" ]
    8. }
    9. go
    复制代码
    在mini系统上,通过action把全部定义的默认系统参数转化成头文件,并编译到系统中
    1. action("lite_const_param_to") {
    2.   script = "//base/startup/init/scripts/param_cfg_to_code.py"
    3.   args = [
    4.     "--source",
    5.     rebase_path(
    6.         "//base/startup/init/services/etc_lite/param/ohos_const/ohospara"),
    7.     "--dest_dir",
    8.     rebase_path("$root_out_dir/gen/init/"),
    9.     "--priority",
    10.     "0",
    11.   ]
    12.   outputs = [ "$target_gen_dir/${target_name}_param_cfg_to_code.log" ]
    13. }
    14. go
    复制代码
  • 系统参数利用实例
    1. // set && get
    2. char key1[] = "rw.sys.version";
    3. char value1[] = "10.1.0";
    4. int ret = SetParameter(key1, value1);
    5. char valueGet1[128] = {0};
    6. ret = GetParameter(key1, "version=10.1.0", valueGet1, 128);
    7. // get sysparm
    8. char* value1 = GetDeviceType();
    9. printf("Product type =%s\n", value1);
    10. char* value2 = GetManufacture();
    11. printf("Manufacture =%s\n", value2);
    12. char* value3 = GetBrand();
    13. printf("GetBrand =%s\n", value3);
    14. char* value4 = GetMarketName();
    15. printf("MarketName =%s\n", value4);
    16. char* value5 = GetProductSeries();
    17. printf("ProductSeries =%s\n", value5);
    18. char* value6 = GetProductModel();
    19. printf("ProductModel =%s\n", value6);
    20. char* value7 = GetSoftwareModel();
    21. printf("SoftwareModel =%s\n", value7);
    22. char* value8 = GetHardwareModel();
    23. printf("HardwareModel =%s\n", value8);
    24. char* value9 = GetHardwareProfile();
    25. printf("Software profile =%s\n", value9);
    26. char* value10 = GetSerial();
    27. printf("Serial =%s\n", value10);
    28. char* value11 = GetOSFullName();
    29. printf("OS name =%s\n", value11);
    30. char* value12 = GetDisplayVersion();
    31. printf("Display version =%s\n", value12);
    32. char* value13 = GetBootloaderVersion();
    33. printf("bootloader version =%s\n", value13);
    34. char* value14 = GetSecurityPatchTag();
    35. printf("secure patch level =%s\n", value14);
    36. char* value15 = GetAbiList();
    37. printf("abi list =%s\n", value15);
    38. int value16 = GetFirstApiVersion();
    39. printf("first api level =%d\n", value16);
    40. char* value17 = GetIncrementalVersion();
    41. printf("Incremental version = %s\n", value17);
    42. char* value18 = GetVersionId();
    43. printf("formal id =%s\n", value18);
    44. char* value19 = GetBuildType();
    45. printf("build type =%s\n", value19);
    46. char* value20 = GetBuildUser();
    47. printf("build user =%s\n", value20);
    48. char* value21 = GetBuildHost();
    49. printf("Build host = %s\n", value21);
    50. char* value22 = GetBuildTime();
    51. printf("build time =%s\n", value22);
    52. char* value23 = GetBuildRootHash();
    53. printf("build root later..., %s\n", value23);
    54. char* value24 = GetOsReleaseType();
    55. printf("OS release type =%s\n", value24);
    56. char* value25 = GetOsReleaseType();
    57. printf("OS release type =%s\n", value25);
    58. char value26[65] = {0};
    59. GetDevUdid(value26, 65);
    60. printf("device udid =%s\n", value26);
    复制代码
系统参数错误码说明

错误码说明
枚举枚举值说明PARAM_CODE_ERROR-1系统错误PARAM_CODE_SUCCESS0乐成PARAM_CODE_INVALID_PARAM100系统参数接口的入参为空PARAM_CODE_INVALID_NAME101系统参数key不符合规范,长度或非法字符PARAM_CODE_INVALID_VALUE102系统参数value值不符合规范,长度或非法字符PARAM_CODE_REACHED_MAX103树节点已达最大值PARAM_CODE_NOT_SUPPORT104不支持此接口PARAM_CODE_TIMEOUT105访问服务端超时PARAM_CODE_NOT_FOUND106没有找到该参数PARAM_CODE_READ_ONLY107系统参数为只读参数PARAM_CODE_IPC_ERROR108IPC通信异常PARAM_CODE_NODE_EXIST109系统参数的节点存在PARAM_WATCHER_CALLBACK_EXIST110watcher的callback重复添加PARAM_WATCHER_GET_SERVICE_FAILED111watcher获取服务失败PARAM_CODE_MEMORY_MAP_FAILED112创建文件共享内存映射失败PARAM_WORKSPACE_NOT_INIT113workspace 没有初始化PARAM_CODE_FAIL_CONNECT114毗连paramServer 失败PARAM_CODE_MEMORY_NOT_ENOUGH115系统参数空间不足DAC_RESULT_INVALID_PARAM1000无用,定义权限错误的起始值DAC_RESULT_FORBIDED1001DAC权限被克制SELINUX_RESULT_FORBIDED1002selinux权限被克制PARAM_CODE_MAX1003枚举最大值 错误定位关键日志


  • system parameter set:
    SetParameter failed! the errNum is: xx!
    SystemSetParameter failed! name is : xxx, errNum is: xx!
  • system parameter get:
    GetParameter_ failed! the errNum is: xx!
    SystemReadParam failed! name is: xxxx, errNum is: xx!
  • system parameter wait:
    WaitParameter failed! the errNum is: xx!
    SystemWaitParameter failed! name is: xxx, errNum is: xx!
  • system parameter Watcher:
    WatchParameter failed! the errNum is xx!
    SystemWatchParameter is failed! keyPrefix is:xxx, errNum is:xx!
系统参数常见标题

怎样设置一个系统参数

1、hdc shell进入终端,执行param set param.key.xxx(系统参数名) param.value.xxx(系统参数名值), 确认参数是否可以设置乐成,乐成则无需其他设置
2、代码侧设置系统参数,调用SetParameter接口
3、执行param set 失败,则根据失败的日志确定对应的排查操纵:
若dac 权限不足,参照DAC访问控制权限设置举行设置
若selinux 权限不足,根据" avc: denied" 告警信息设置对应规则
怎样读取一个系统参数

1、hdc shell进入终端,执行param get param.key.xxx(系统参数名), 查看参数是否可以读取乐成,读取乐成则无需其他操纵
2、代码侧获取系统参数,调用GetParameter接口
3、执行param get 失败,则根据失败的日志确定对应的排查操纵:
首先必要确认该参数是否被设置,若没有被设置,则必要先设置该参数;若已设置,则举行下一步排查
若dac 权限不足,参照DAC访问控制权限设置举行设置
若selinux 权限不足,根据" avc: denied" 告警信息设置对应规则
怎样订阅一个系统参数的变革

1、hdc shell进入终端,执行param shell,进入Parameter shell后执行 watcher parameter param.key.xxx(系统参数名),当系统参数值发生变革时,会收到类似"Receive parameter commit 691 change aaa.aaa 11111"的消息
2、代码侧监控系统参数变革,调用WatchParameter接口
3、执行watcher parameter 失败,则根据失败的日志确定对应的排查操纵:
若dac 权限不足,参照DAC访问控制权限设置举行设置
若selinux 权限不足,根据" avc: denied" 告警信息设置对应规则
三方应用为何无法访问系统参数

默认DAC规则只答应三方应用对参数具有get, watch 的权限,因此三方应用若必要set权限必要重新设置DAC规则。 别的, 三方应用的selinux权限默认是未设置的,因此必要参照mac访问控制权限设置举行设置
Code Linter针对ArkTS/TS代码举行最佳实践/编程规范方面的检查。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表