6

OpenHarmony Release3.1版本启动子系统功能分析

 2 years ago
source link: https://os.51cto.com/article/706898.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

f5d846c75e93e66ecc9785a4d3e5f1b8b04dd5.png

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

1、技术背景

OpenHarmony release3.1版本在2.0的基础之上不仅增加了功能,而且各模块组件的能力也有所增强,本文就3.1版本的init启动子系统模块,在启动引导系统服务方面进行分析。本文档是基于码云上release3.1分支代码进行分析。

启动子系统负责整个系统各个进程运行时环境的构建及进程引导,不同层级的进程有着不同的运行环境,运行环境决定着系统进程的设计。在增强启动子系统能力方面有以下方面:

  • 基础能力增强:进程启动、回收机制增强,维护命令统一以及插件化管理。
  • 并行启动:最大化并行启动,为依赖资源提供同步机制,运行时进行资源获取。
  • 按需启动:无访问不启动,减少常驻内存。
  • 分组启动:可对服务进行灵活组装,提供整机不同的启动级别能力。

2、Init启动功能概述

(1)基础能力的增强

进程启动,支持进程的selinux策略配置,扩展AccessToken设置,支持绑核配置;进程回收,支持进程频繁退出抑制机制;维护命令,统一init的维护命令,包括系统参数和进程管理;插件化管理,init部件与周边模块关联度高,通过插件化机制供其它模块扩展。

(2)进程分组&并行启动

支持服务分组配置,如支持系统知名group,支持整机开机、重启、关机、待机、充电等模式;支持服务依赖管理,支持并行启动依赖同步机制。

(3)按需启动

支持SA类进程按需启动,HDF类进程按需启动,socket类进程的按需启动;支持热插拔事件驱动进程按需启动;支持为按需启动定时启动、进程代持fd等辅助功能。

3、系统能力增强点分析

(1)进程启动能力增强

进程启动时,支持在配置文件中配置服务进程的绑核、优先级、selinux策略加载以及AccessToken信息。

配置服务进程绑核能力

在服务的cfg配置文件中,配置绑核,例如param_watcher服务。系统启动之后通过taskset -p pid,查看服务绑核情况,例如 current affinity mask: 3,即表示param_watcher服务运行在两个cpu上切换。

“services” : [{
“name” : “param_watcher”,
…
“cpucore” : [0,1]
},

通过CJSON解析 cfg 文件,获取属性”cpucore”属性值的数组,然后通过接口CPU_SET设置进程的CPU。

18acb356996b7b8a89a9251f8450ecc4fa7c44.png

在init,fork()服务子进程时设置CPU绑核。

a28e79a41b97cb115fb1855854932c4b65ac18.png

配置服务进程优先级

在服务cfg文件中配置进程的优先级,例如appspawn.cfg中配置"importance" : -20,即设置appspawn的优先级为-20。

     {
            "services" : [{
            "name" : "appspawn",
            "path" : ["/system/bin/appspawn"],
            "importance" : -20,
            "uid" : "root",
            "gid" : ["root"],
            "start-mode" : "boot"
            }
          ]

代码中通过CJSON解析cfg文件中”importance”属性,得到服务的优先级,同时通过SetImportantValue回调函数保存优先级属性。

113e90061a2e3464cd1686149eaecc413060ab.png

f6bf07a224476ec7bec019ef1d05257e92ee84.png

在ServiceExec执行进程命令之前通过setpriority。

设置服务的优先级。

74d41b617821eda38ef34875e8436f31b5dfaf.png

服务的selinux策略加载

OpenHarmony正在不断完善selinux安全策略,后面对于服务的管控会更加严格。Init启动在服务cfg文件中提供配置进程的Selinux接口,例如updater_sa.cfg文件中配置。

“secon” : “u:r:updater_sa:s0”。
{
“services” : [{
“name” : “updater_sa”,
“path” : [“/system/bin/sa_main”, “/system/profile/updater_sa.xml”],
“uid” : “system”,
“gid” : [“system”, “shell”],
“secon” : “u:r:updater_sa:s0”
}
]
}

通过JSON解析cfg文件中"secon"属性,获取服务的selinux值。

e4cab0429da3d7749df8340bee1dd1b3ffb1ba.png

在init初始时,加载selinux LoadPolicy。

06ad126978d47b174bb257ba3b56ede14edd0a.png

在init fork子进程时,通过SetSecon 设置服务的selinux。

669c70a11d7d5984fc7823234eea632eb32614.png

配置服务进程AccessToken属性

在服务cfg文件中配置进程的AccessToken,即cfg文件中配置。

“apl”: “xxx”,设置一串令牌。

通过JSON解析cfg文件中"apl"属性,获取服务的apl值。

338153e776fe67d3841803b6ccb161bcbe66f4.png

在init fork 子进程的时候设置进程的AccessToken。

163259c46075c1af558997f55df04e3d8b0d38.png

(2)进程启动&回收能力增强

进程的启动流程

init启动系统服务进程时都是先fork再execv执行目标服务进程而完成启动。Fork的流程又细分为

  • pre-fork:即服务进程不需要真正的启动,只是由init做好服务的准备工作,服务被访问时拉起服务。
  • fork:只要fork成功,init就接着启动下一个进程,即使后面execv执行失败也忽略,最大承担并行启动服务。
  • execv:fork完成之后需要execv执行成功,才算服务启动完成。
  • service:在服务启动完成之后,通过setparameter 设置服务启动标志"startup.service.ctl.serviceName" 为SERVICE_STARTED。

265b3a8170f29e9956882079a373ca62077980.png

f4dd766890d4750aa8b7585ab98e7dc4d864f1.png

子进程退出资源回收

init监听到任何子进程退出都需要waitpid回收该进程,避免出现僵尸进程。

73a752a76c20b63ad78176588e1bb5d29146a0.png

设置服务启动特殊模式

通过在服务的cfg文件中配置Once、Disabled、Critical属性值设置服务启动的特殊方式。

  • Default:默认情况下服务退出之后,init会再次拉起服务。
  • Once:服务是单次启动模式,退出之后init不再拉起。
  • Disabled:服务是被禁用的,退出后也不会拉起。
  • Critical:服务失败后需要重新拉起,但是失败N次之后,系统就会重启,默认是4次。

常驻服务进程如果一直异常退出,为了避免频繁尝试拉起该服务,增加抑制机制,默认3秒内连续退出超过5次则不再自动拉起该服务。

核心服务进程如果一直异常退出,为了避免系统不可用,尝试系统重启;默认20秒内连续退出超过4次则不再自动拉起该服务。

例如 “critical” : [1, 1, 60], 代表有critical attribute,同时60秒内重启1次,就系统重启。通过GetCritical函数解析critical 属性,通过CalculateCrashTime函数判断是否需要重启服务,或是reboot系统。

312f93a307139065b9c8505e32aeb9366e4964.png

a40c7a5486c6d58ef4c714ba11b1b5449f4d33.png

(3)提供整机状态服务

各系统服务进程启动后,还需要相应整机提供的重启、关机等请求(对应整机状态变化能够对进程进行相应处理stop、suspend、freeze等)。

  • 重启、shutdown关机:关闭服务进程,通过stop命令关闭服务。
  • Suspend关机:STR带电低功耗关机,可快速开机,服务可选择的退出或清理资源。
  • Freeze关机:STD系统快照写到Disk,可完全掉电并快速开机。

通过reboot命令,设置 "startup.device.ctl"参数给外界提供当前整机的状态,系统服务进程可通过ParameterClient的watch机制监听整机的状态变化,处理自己的状态。

Reboot 命令:

1736c4277b99f886fad58012adb997898701b1.png

14f9d5c49ab3e4984519914bd361d9328f5502.png

服务可以通过start/stop来启动停止

通过以下命令可以启动或者停止服务。

start_service servicename --start service
stop_service servicename --stop service
service_control start servicename --start service
service_control stop servicename --stop service

c3e5edf60eb4476f558087b5c24e9aebc7a38e.png

最终通过SystemSetParameter(“ohos.ctl.start”, nameValue)启动服务,其中nameValue是服务名+服务的参数组合数组。

55f143d93a32c0cccc3390c577e23f0bd74d12.png

(4)按需启动

SA进程按需启动

需要按需启动的SA服务,通过在cfg文件配置”dynamic” : true,设置此SA服务为按需启动,即init在start service的时候解析到此属性,不直接拉起服务;而是通过client端触发samgr拉起服务。

动态加载系统服务进程及SystemAbility, 系统进程无需开机启动,而是在SystemAbility被访问的时候按需拉起,并加载指定SystemAbility。继承SystemAbilityLoadCallbackStub类,并覆写OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr& remoteObject)、OnLoadSystemAbilityFail(int32_t systemAbilityId)方法。

718a0dc84deb95c71ce522e2d1ebc47e1e2fda.png

调用samgr提供的动态加载接口LoadSystemAbility(int32_t systemAbilityId, const sptr& callback)。

c5d02fb217f297633cc992b64af359b64c170e.png

Samgr通过调用init提供的ServiceControlWithExtra接口,拉起服务。

d264ebb25fe60def6b5867729d6c9d4082dc2e.png

UHDF进程按需启动

同上SA服务的按需启动的分析,只是在HUDF服务中调用ServiceControlWithExtra接口,拉起服务。

f6abe7610ad9b514d28183b190b5a4e9962e16.png

socket进程按需启动

init在pre-fork阶段为socket类进程创建好socket,init中监听创建好的socket上的网络事件,socket上有报文事件后,init拉起socket进程进行报文处理。

socket进程无报文处理后,可以自动退出,退出后init回收该子进程并重新监听socket网络数据。

在服务cfg文件中添加”ondemand” : true 配置,设置socket服务为按需启动。

795037b237574c49256285805c1ca21daf31c1.png

在fork 子进程的时候,判断服务是ondemand的,则创建socket监听。

b80a8e479288c1b0f0157959741958f073b00f.png

210dece98569eb00f049831432e4d308bd1e5f.png

通过回调函数ProcessWatchEvent_处理socket按需启动的事件。

57045267848d6d74e9c7502ae0b8c6d3d8eb40.png

热插拔服务进程按需启动

配置ueventd.cfg配置文件中设备节点 属性,例如,/dev/binder 属性配置为 ohos.dev.binder,当设备节点被创建好,param设置ohos.dev.binder属性值为added。

在相应服务的cfg文件中,配置”job”为condition,如下:

“condition” : “ohos.dev.binder=added”

即当条件满足时触发服务拉起。

定时拉起&fd代持

定时拉起:服务进程在退出前可根据业务需要预约下次启动的时间。

fd代持:按需启动进程可以保持退出前的fd状态句柄不丢失。按需启动进程退出前可发fd发送给init代持,再次启动后再获取fd。

在服务的cfg配置"timer_start" : 6 ,设置服务6秒后拉起。通过LE_CreateTimer创建定时器,定时时间到达时,触发回调函数,拉起服务。

4466c1f18d0189971de144ecb197677d08f639.png

创建fdhold的socket,注册event loop回调函数ProcessFdHoldEvent监听。

f529964151e5fe6d6c854735c810149b22db83.png

e539ef631f756ea87a8452db72cdacedc3120c.png

(3)并行启动及依赖管理

begetd启动分三个阶段,pre-init和init阶段完成公共依赖部分;后续所有的服务都是并行化启动。服务启动的依赖包括Job和Service。

所有的Job由init特权进程完成,可包括:设置全局环境变量,设置特权/proc, /sys节点参数等。

Service

Service依赖的前置条件可在启动脚本里指定Job完成。例如在service 中配置:

“service”:
“jobs” : {
“on-start” : “services:console”
}
“job”:
{
“name” : “services:console”,
“cmds” : [
“chmod 0773 /data/misc/trace”,
“chmod 0775 /data/misc/wmtrace”
]
}

即在fork子进程的时候执行job相关的命令。

c9d167e04a3db092b0d139d8e00dffffec7ea9.png

通过cfg文件设置服务的”start-mode”来管理正常启动还是并行启动。

“start-mode” : “boot”
“start-mode” : “normal”
“start-mode” : “condition”

其中boot、normal 模式是并行启动,service不写start-mode默认也是normal。Condition模式必须通过 start service 来拉起。

Start-mode通过注册钩子函数,通过trigger拉起服务。

1202808631f2a58386e180d55dc2557d356911.png

23f977201eb36ee05f51607b41075c311837b7.png

963530b015aa5d5b53d870762eff171d04dae4.png

(6)分组管理

系统服务可以按照分组进行管理,设备级知名group用于完成整机的开机、待机、充电等功能。默认的整机开机是放到GROUP_BOOT中,GROUP_CHARING是充电模式。

以charging group举例说明。

配置device.charing.group.cfg 里面设置需要的jobs、services以及groups。

a785cd951eebd01095d540caff4394462e4f6a.png

解析group 的cfg文件。

a69722629586599edf88114e33df80a1f5550a.png

通过hash表保存group的配置。

通过cmdline获取当前的group 模式,从而启动进入不同的group,系统进入不同的模式。

443eab493d51befc2ec755704e0f922d66e284.png

Release3.1 版本在OpenHarmony2.0的基础上各方面能力都有所提升,性能和稳定性方面有所改善。Init组件中加入selinux配置,增强了系统的安全模式,按需启动模式节约系统的内存资源,并行启动增加了系统的启动效率,分组启动模式为后期系统进入不同状态模式提供有效的接口。总之OpenHarmony在开源社区中,通过大家的共同努力正在茁长成长,总有一天会长成苍天大树,枝繁叶茂,造福人类。

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

71eea7105a1cf9982d2996c42d853b97bd50ef.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK