系统服务进程退出后不自动重启
查看服务进程的cfg文件,是否将"once"项配置为1;该项若为1,则表示为一次性进程,进程退出后不会再被init拉起
如何默认disable系统服务进程
当前服务的cfg文件中配置"disable" 项未启用,可以通过配置"start-mode" 项来控制启动方式
如何关闭系统服务进程沙盒
在服务的cfg文件中配置 "sandbox" : 0 即服务不进入沙盒、1为进入沙盒,默认服务是进入沙盒
如何设置一个系统参数
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" 告警信息设置对应规则
三方应用为何无法访问系统参数
三方应用访问系统参数需要配置对应的selinux权限
错误码说明
枚举 | 枚举值 | 错误信息 | 说明 |
---|---|---|---|
INIT_OK | 0 | 执行成功 | |
INIT_EPARAMETER | 1 | parameter | 接口参数无效 |
INIT_EFORMAT | 2 | Format string fail | 字符串格式化错误 |
INIT_ECFG | 3 | cfg error | cfg解析错误 |
INIT_EPATH | 4 | Invalid path | 服务path配置错误 |
INIT_EFORK | 5 | Fork fail | fork子进程失败 |
INIT_ESANDBOX | 6 | Create sandbox fail | 服务进沙盒失败 |
INIT_EACCESSTOKEN | 7 | Set access token fail | 设置access token失败 |
INIT_ESOCKET | 8 | Create socket fail | 创建socket失败 |
INIT_EFILE | 9 | Create file fail | 创建文件失败 |
INIT_ECONSOLE | 10 | Open console fail | 打开console失败 |
INIT_EHOLDER | 11 | Publish holder fail | Publish holder失败 |
INIT_EBINDCORE | 12 | Bind core fail | 绑核失败 |
INIT_EKEEPCAP | 13 | Set keep capability fail | 设置keep capability失败 |
INIT_EGIDSET | 14 | Set gid fail | 设置服务gid失败 |
INIT_ESECCOMP | 15 | Set SECCOMP fail | 设置服务安全策略 |
INIT_EUIDSET | 16 | Set uid fail | 设置服务uid失败 |
INIT_ECAP | 17 | Set capability fail | 设置服务capability失败 |
INIT_EWRITEPID | 18 | Write pid fail | pid写入失败 |
INIT_ECONTENT | 19 | Set sub content fail | 设置服务安全上下文失败 |
INIT_EPRIORITY | 20 | Set priority fail | 设置服务优先级失败 |
INIT_EEXEC_CONTENT | 21 | Set exec content fail | 设置selinux标签失败 |
INIT_EEXEC | 22 | Exec fail | 执行exec失败 |
错误码说明
枚举 | 枚举值 | 说明 |
---|---|---|
PARAM_CODE_ERROR | -1 | 系统错误 |
PARAM_CODE_SUCCESS | 0 | 成功 |
PARAM_CODE_INVALID_PARAM | 100 | 系统参数接口的入参为空 |
PARAM_CODE_INVALID_NAME | 101 | 系统参数key不符合规范,长度或非法字符 |
PARAM_CODE_INVALID_VALUE | 102 | 系统参数value值不符合规范,长度或非法字符 |
PARAM_CODE_REACHED_MAX | 103 | 树节点已达最大值 |
PARAM_CODE_NOT_SUPPORT | 104 | 不支持此接口 |
PARAM_CODE_TIMEOUT | 105 | 访问服务端超时 |
PARAM_CODE_NOT_FOUND | 106 | 没有找到该参数 |
PARAM_CODE_READ_ONLY | 107 | 系统参数为只读参数 |
PARAM_CODE_IPC_ERROR | 108 | IPC通信异常 |
PARAM_CODE_NODE_EXIST | 109 | 系统参数的节点存在 |
PARAM_WATCHER_CALLBACK_EXIST | 110 | watcher的callback重复添加 |
PARAM_WATCHER_GET_SERVICE_FAILED | 111 | watcher获取服务失败 |
PARAM_CODE_MEMORY_MAP_FAILED | 112 | 建立文件共享内存映射失败 |
PARAM_WORKSPACE_NOT_INIT | 113 | workspace 没有初始化 |
PARAM_CODE_FAIL_CONNECT | 114 | 连接paramServer 失败 |
PARAM_CODE_MEMORY_NOT_ENOUGH | 115 | 系统参数空间不足 |
DAC_RESULT_INVALID_PARAM | 1000 | 无用,定义权限错误的起始值 |
DAC_RESULT_FORBIDED | 1001 | DAC权限被禁止 |
SELINUX_RESULT_FORBIDED | 1002 | selinux权限被禁止 |
PARAM_CODE_MAX | 1003 | 枚举最大值 |
错误定位关键日志
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!
原因分析:
解决方法:
原因分析:
解决方法:
请参考系统开机启动过程
[32.173144][pid=1] [Init] [INFO] [init.c:206]Start init second stage.
[33.173144][pid=1] [Init] [DEBUG] [init.c:206]Parse init configs from /etc/init.cfg.
如果此时hdcd服务没有启动,或者分区没有挂载好,无法执行begetctl 命令。需要修改init 代码,设置log等级。确保init 的debug log能正常输出。
原因分析:init.cfg 解析失败。
解决方法:
原因分析:required mount 分区没有正常挂载。
解决方法:
查看日志, 查看Kernel command line 中是否required mount 分区配置; 如果配置, 查看cmdline格式是否出错,按照格式修改或添加命令。
[0.000000] Kernel command line: currentslot=0 bootslots=0 rw rootwait earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 ohos.boot.eng_mode=on root=PARTUUID=614e0000-0000 hardware=rk3568 default_boot_device=fe310000.sdhci ohos.required_mount.system=/dev/block/platform/fe310000.sdhci/by-name/system@/usr@ext4@ro,barrier=1@wait,required ohos.required_mount.vendor=/dev/block/platform/fe310000.sdhci/by-name/vendor@/vendor@ext4@ro,barrier=1@wait,required ohos.required_mount.misc=/dev/block/platform/fe310000.sdhci/by-name/misc@none@none@none@wait,required ohos.required_mount.bootctrl=/dev/block/platform/fe310000.sdhci/by-name/bootctrl@none@none@none@wait,required
或 在设备中通过cat /proc/cmdline 查看。
或 在设备中通过cat /proc/cmdline 查看。
查看 ramdisk.img 中是否存在fstab.required文件。
原因分析:图形服务没有启动, 导致无开机动画。
解决方案: 根据日志定位问题。
原因分析: bootanimation 启动失败。
解决方法:
在日志中查看log:
[10.175192] [pid=1] [Init] [INFO] [init_service_manager.c:1088]Start service bootanimation
表示服务启动。
原因分析:data分区没有正常挂载
解决方法:
对应的关键内核日志:
原因分析:
解决方法:
原因分析:
解决方法:
原因分析:
解决方法:
08-10 18:48:07.653 1421 1421 D C02c0b/BEGET: [init_reboot_innerkits.c:51]Reboot cmd reboot
查看 reboot 命令, reboot命令不超过96。
原因分析:
解决方法:
原因分析: 相关服务访问不到所需要的so等资源文件
解决方案: 分析hilog,通过分析log检查失败的原因,在设备中搜索报错so的path,修改对应so的BUILD.gn文件。如下步骤:
log分析,hilog搜索关键字"failed"或".so"结果
08-05 17:27:29.302 488 488 E C02500/driver_loader_full: get driver entry failed, /vendor/lib/libcamera_host_service_1.0.z.so load fail, Error loading shared library libdisplay_buffer_proxy_1.0.z.so: No such file or directory (needed by /system/lib/chipset-pub-sdk/libdisplay_buffer_hdi_impl.z.so)
08-05 17:27:29.303 488 488 E C02500/devhost_service_full: DevHostServiceAddDevice failed and return -207
08-05 17:27:29.305 488 488 E C02500/devhost_service_stub: Dis patch failed, add service failed and ret is -207
08-05 17:27:29.307 488 488 I C02500/devhost_service_stub: add device 0x7000201
08-05 17:27:29.308 488 488 E C02500/driver_loader_full: /vendor/lib/libhdi_media_layer_service.z.so no valid, errno:2
根据结果,camera报错是由于libdisplay_buffer_proxy_1.0.z.so加载失败,两种方式进行处理,方式一在沙盒中对该file进行mount进行快速修复(仅支持本地debug,源码修改需要进行评审),方式二需要修改对应BUILD.gn文件
快速修复方式:沙盒中mount file/path
系统沙盒: 编辑设备中/system/etc/sandbox/system-sandbox.json文件,默认只mount vendor路径下的部分文件,如有报错缺失在其中进行单独mount
chipset沙盒: 编辑设备中/system/etc/sandbox/chipset-sandbox.json文件,默认只mount system路径下的部分文件,如有报错缺失在其中进行单独mount
如上case需要在/system/etc/sandbox/chipset-sandbox.json中添加如下:
"mount-bind-files" : [
{
"src-path" : "/system/lib/libdisplay_buffer_proxy_1.0.z.so",
"sandbox-path" : "/system/lib/libdisplay_buffer_proxy_1.0.z.so",
"sandbox-flags" : [ "bind", "rec", "private" ]
},{...}
],
方式二:添加innerapi_tags
ohos_shared_library("xxx") {
...
innerapi_tags = [
"chipsetsdk",
]
}
innerapi_tags相关:
沙盒权限相关的tags包含"passthrough"、"chipsetsdk"、"passthrough_indirect "、"chipsetsdk_indirect"
可通过 Openharmony实时架构信息网站查看so信息,如果是间接依赖模块使用chipsetsdk_indirect或者passthrough_indirect , 其余使用chipsetsdk或者passthrough
安装到系统目录的so使用"chipsetsdk"和"chipsetsdk_indirect",供芯片组件访问
安装到芯片目录的so使用"passthrough"和"passthrough_indirect ",供系统组件访问
通过innerapi_tags标记添加可以指定so安装的路径,比如标记了chipsetsdk的就装在/lib/chipset-sdk/目录下,具体逻辑源码如下,代码路径: build/templates/cxx/cxx.gni
# auto set auto_relative_install_dir by innerapi_tags
if (defined(invoker.innerapi_tags)) {
is_chipsetsdk = false
is_platformsdk = false
is_passthrough = false
foreach(tag, filter_include(invoker.innerapi_tags, [ "chipsetsdk*" ])) {
is_chipsetsdk = true
}
foreach(tag, filter_include(invoker.innerapi_tags, [ "platformsdk*" ])) {
is_platformsdk = true
}
foreach(tag, filter_include(invoker.innerapi_tags, [ "passthrough*" ])) {
is_passthrough = true
}
if (is_chipsetsdk && is_platformsdk) {
auto_relative_install_dir = "chipset-pub-sdk"
} else if (is_chipsetsdk) {
auto_relative_install_dir = "chipset-sdk"
} else if (is_platformsdk) {
auto_relative_install_dir = "platformsdk"
}
if (is_passthrough) {
auto_relative_install_dir = chipset_passthrough_dir
}
...
}
Init的日志记录主要分为hilog 和demsg, hilog主要记录系统业务流程相关的日志,demsg 记录内核相关的日志。
init 日志级别分为五级,可以通过设置(INIT_DEBUG_LEVEL)persist.init.debug.loglevel参数来控制
InitLogLevel:
INIT_DEBUG = 0,
INIT_INFO,
INIT_WARN,
INIT_ERROR,
INIT_FATAL
Kmsg 日志级别:
"<7>" =====> "DEBUG"
"<6>" =====> "INFO"
"<4>" =====> "WARNING"
"<3>" =====> "ERROR"
"<3>" =====> "FATAL"
INIT_DMESG 控制是否记录内核日志 /dev/kmsg INIT_FILE 控制是否将日志写入文件 /data/init_agent/begetctl.log INIT_AGENT 控制是否走Hilog记录日志
关键接口:
void EnableInitLog(InitLogLevel level) 使能log
void SetInitLogLevel(InitLogLevel level) 设置log 的级别,控制日志的输出
void StartupLog(InitLogLevel logLevel, uint32_t domain, const char *tag, const char *fmt, ...) 是init log的入口
STARTUP_LOGI 是对StartupLog 定义的宏,在头文件/base/startup/init/interfaces/innerkits/include/beget_ext.h中定义,其他log都是基于STARTUP_LOGI这个宏重定义的:
DINFO_LOGI
DINFO_LOGE
DINFO_LOGV
PARAM_JS_LOGI
PARAM_JS_LOGE
PARAM_JS_LOGV
PARAM_JS_LOGW
BSH_LOGI
BSH_LOGE
BSH_LOGV
LE_LOGI
LE_LOGE
LE_LOGV
PLUGIN_LOGI
PLUGIN_LOGE
PLUGIN_LOGV
PLUGIN_LOGW
PARAM_LOGI
PARAM_LOGE
PARAM_LOGV
PARAM_LOGW
WATCHER_LOGI
WATCHER_LOGE
WATCHER_LOGV
INIT_LOGV
INIT_LOGI
INIT_LOGW
INIT_LOGE
INIT_LOGF
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。