Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
80898702
D
Docs
项目概览
OpenHarmony
/
Docs
大约 1 年 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
80898702
编写于
10月 13, 2022
作者:
C
cheng_jinsong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add log sub-unit subsys readme
Signed-off-by:
N
cheng_jinsong
<
chengjinsong2@huawei.com
>
上级
9d66e5f2
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
168 addition
and
0 deletion
+168
-0
zh-cn/device-dev/subsystems/subsys-boot-init-log.md
zh-cn/device-dev/subsystems/subsys-boot-init-log.md
+57
-0
zh-cn/device-dev/subsystems/subsys-boot-init-sub-unit.md
zh-cn/device-dev/subsystems/subsys-boot-init-sub-unit.md
+111
-0
未找到文件。
zh-cn/device-dev/subsystems/subsys-boot-init-log.md
0 → 100644
浏览文件 @
80898702
# init运行时日志规范化
## 概述
### 功能简介
日志的基本功能就是记录init启动中的关键节点,以及定位故障问题。
### 基本概念
基于日志可以定位故障问题,可以查看各子系统启动时长,命令执行时长等;可以查看不同模块的日志tag,如param、uevent、module等;输出关键阶段日志,如第一阶段启动日志、required partition设备节点、uevent创建日志、服务启动日志等;日志等级可控,根据需要输出不同级别日志,目前日志级别分为INIT_DEBUG,
INIT_INFO,INIT_WARN,INIT_ERROR,INIT_FATAL。
-
日志输出原理
init日志采用内核的dmesg log,即int fd = open("/dev/kmsg", ...),同时将stdin、stdout、stderr重定向到/dev/null,即关闭标准输入输出。设置基础的log等级g_logLevel,当调用的log等级大于等于g_logLevel才会打印出log。
### 约束与限制
对于标准版本log采用dmesg log,对于非标准版本的liteos L1版本log采用hilog接口,对于L0版本采用printf接口。
## 开发指导
### 场景介绍
init log主要应用在init的启动过程中,启动相关模块(param、ueventd、module等)中,以及对外提供的begetutils接口中。
### 参数说明
**表1**
log接口说明
| 接口 | 接口格式和示例 | 说明 |
| -------- | -------- | -------- |
| INIT_LOGV | INIT_LOGV("Add %s to job %s", service->name, jobName); | 输出debug log |
| INIT_LOGI | INIT_LOGI("Start init first stage."); | 输出info log |
| INIT_LOGW | INIT_LOGW("initialize signal handler failed"); | 输出warning log |
| INIT_LOGE | INIT_LOGE("Failed to format other opt"); | 输出err log |
| INIT_LOGF | INIT_LOGF("Failed to init system"); | 输出fatal log |
| INIT_ERROR_CHECK | INIT_ERROR_CHECK(ctx != NULL, return NULL, "Failed to get cmd args "); | 判断 ctx != NULL 不成立的情况下输出log,同时执行 return NULL |
| INIT_INFO_CHECK | INIT_INFO_CHECK(sockopt != NULL, return SERVICE_FAILURE, "Failed to malloc for service %s", service->name); | 判断 sockopt != NULL 不成立的情况下输出log,同时执行 return SERVICE_FAILURE |
| INIT_WARNING_CHECK | INIT_WARNING_CHECK(argsCount <= SPACES_CNT_IN_CMD_MAX, argsCount = SPACES_CNT_IN_CMD_MAX, "Too much arguments for command, max number is %d", SPACES_CNT_IN_CMD_MAX); | 判断 argsCount <= SPACES_CNT_IN_CMD_MAX 不成立的情况下输出log,同时执行 argsCount = SPACES_CNT_IN_CMD_MAX |
| INIT_CHECK | INIT_CHECK(arg != NULL, return NULL); | 判断arg != NULL 不成立的情况下执行 return NULL |
| INIT_CHECK_RETURN_VALUE | INIT_CHECK_RETURN_VALUE(errno == 0, -1); | 判断errno == 0 不成立的情况下执行 return -1 |
| INIT_CHECK_ONLY_RETURN | INIT_CHECK_ONLY_RETURN(cmd != NULL); | 判断cmd != NULL 不成立的情况下执行 return |
| INIT_CHECK_ONLY_ELOG | INIT_CHECK_ONLY_ELOG(execv(argv[0], argv) == 0, "execv %s failed! err %d.", argv[0], errno); | 判断execv(argv[0], argv) == 0 不成立的情况下只打印log "execv %s failed! err %d." |
**表2**
关键日志说明
| 日志内容 | 说明 |
| -------- | -------- |
| INIT_LOGI("Start init first stage."); | 当前处理init第一阶段启动,第一阶段包括创建基础的设备节点,以及mount基础的required分区(system、chipset等)|
| INIT_LOGI("Start init second stage."); | 开始第二阶段启动,包括解析配置文件、拉起服务等等 |
| INIT_LOGI("Handle required partitionName %s", uevent->partitionName); | 创建关键的required 设备节点 |
| BEGET_LOGI("Mount %s to %s successful", item->deviceName, item->mountPoint); | fstab文件系统分区挂载成功 |
| INIT_LOGI("Service %s(pid %d) started", service->name, pid); | 提示init拉起服务成功 |
| INIT_LOGE("Child process %s(pid %d) exit with code : %d",
service == NULL ? "Unknown" : service->name, sigPID, sigPID, WTERMSIG(procStat)); | 提示服务异常退出 |
| INIT_LOGE("Child process %s(pid %d) exit with code : %d",
service == NULL ? "Unknown" : service->name, sigPID, WEXITSTATUS(procStat)); | 提示服务正常退出 |
**表3**
log等级设置命令
| 命令 | 提示 | 说明 |
| -------- | -------- | -------- |
| setloglevel | Command list:setloglevel level --set init log level 0:debug, 1:info, 2:warning, 3:err, 4:fatal | 设置init log等级在0~4之间 |
| setloglevel 3 | Success to set log level by param "persist.init.debug.loglevel" 3. | 说明成功设置log等级为3:err |
| getloglevel | Success to get init log level: 3 from param "persist.init.debug.loglevel" | 获取当前log level为3:err |
zh-cn/device-dev/subsystems/subsys-boot-init-sub-unit.md
0 → 100644
浏览文件 @
80898702
# 组件化启动
## 概述
### 功能简介
构建四个基础组件镜像,提供相应的组件化目录,包括系统组件:system、产品通用配置组件:sys_prod、芯片组件:chipset、产品硬件配置组件:chip_prod;
确保系统参数以及启动脚本都可以按照组件的优先级进行扫描初始化;
完成系统组件和芯片组件的独立编译构建。
### 基本概念
system:系统组件文件系统挂载点,与芯片及硬件无关的平台业务;sys_prod:对系统组件的能力扩展以及能力定制,承载产品级差异能力,存放产品相关的配置文件;
chipset:芯片组件文件系统挂载点,为系统组件提供统一的硬件抽象服务,相同的芯片平台可统一一份芯片组件;
chip_prod:单板外设特有硬件能力以及产品级硬件差异配置, 存放芯片相关的配置文件。
-
组件化编译构建
通过"target_cpu" 指定系统组件的指令集;通过"inherit" 继承base、headless或者rich等通用组件集合;最后通过"subsystems" 定义该形态更多的部件。
-
系统参数以及启动脚本按照组件的优先级进行扫描初始化
系统参数以及启动脚本包括:服务的cfg配置文件、param文件、沙盒json配置文件以及module插件化库文件等。相关文件优先级顺序是 /system < /chipset < /sys_prod < /chip_prod,即优先级高的配置文件将取代、更新低优先级配置。
### 约束与限制
对于标准版本和小型系统都支持组件化编译构建,以及系统参数以及启动脚本按照组件的优先级进行扫描初始化。
## 开发指导
### 场景介绍
组件化启动主要是满足厂家、硬件平台通过模块化的组合快速实现产品开发。以下以rk3568产品为例介绍组件化启动。
### rk3568产品的组件化构建编译
//vendor/hihope/rk3568/config.json 配置文件实现构建此产品需要的组件,如下所示:
{
"product_name": "rk3568",
"device_company": "rockchip",
...
"target_cpu": "arm",
...
"inherit": [ "productdefine/common/inherit/rich.json", "productdefine/common/inherit/chipset_common.json" ],
"subsystems": [
{
"subsystem": "security",
"components": [
{
"component": "selinux",
"features": []
}]
}
...
}
从中可以看出产品名称、芯片厂家、支持的指令集等;inherit指出依赖的通用组件;subsystems指出通用组件以外的部件。
//productdefine/common/inherit/rich.json 如下所示配置系统组件完整的部件;系统组件还可以包括base.json(所有产品都要包含的最小部件集合列表)、headless.json(没有ui界面的产品支持应用安装管理的最小部件集合)。
{
"version": "3.0",
"subsystems": [
{
"subsystem": "arkui",
"components": [
{
"component": "ace_engine",
"features": []
},
{
"component": "napi",
"features": []
}
]
},
{
"subsystem": "account",
"components": [
{
"component": "os_account",
"features": []
}
]
},
...
}
### 系统参数根据优先级扫描初始化
对于服务的cfg配置文件优先级是/system/etc < /system/etc/init < /chipset/etc,即优先级高的配置文件将取代、更新低优先级配置。例如/system/etc/init/camera_service.cfg,
{
"services" : [{
"name" : "camera_service",
"path" : ["/system/bin/sa_main", "/system/profile/camera_service.xml"],
"uid" : "cameraserver",
"gid" : ["system", "shell"],
"secon" : "u:r:camera_service:s0",
"permission" : ["ohos.permission.GET_SENSITIVE_PERMISSIONS"],
"permission_acls" : ["ohos.permission.GET_SENSITIVE_PERMISSIONS"]
}]
}
同时存在/chipset/etc/camera_B_service.cfg
{
"services" : [{
"name" : "camera_service",
"path" : ["/system/bin/sa_main", "/system/profile/camera_B_service.xml"],
"uid" : "cameraserver",
"gid" : ["system", "shell"],
"secon" : "u:r:camera_service:s0",
"permission" : ["ohos.permission.GET_SENSITIVE_PERMISSIONS"],
"permission_acls" : ["ohos.permission.GET_SENSITIVE_PERMISSIONS"],
"disabled" : 1
}]
}
那么根据优先级的要求,camera_service服务"path"属性将会被优先级高的["/system/bin/sa_main", "/system/profile/camera_B_service.xml"]取代,同时增加"disabled"属性。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录