# init组件
- [简介](#section469617221261)
- [目录](#section15884114210197)
- [约束](#section12212842173518)
- [使用说明](#section837771600)
- [相关仓](#section641143415335)
## 简介
init组件负责处理从内核加载第一个用户态进程开始,到第一个应用程序启动之间的系统服务进程启动过程。启动恢复子系统除负责加载各系统关键进程之外,还需在启动的同时设置其对应权限,并在子进程启动后对指定进程实行保活(若进程意外退出要重新启动),对于特殊进程意外退出时,启动恢复子系统还要执行系统复位操作。
## 目录
```
base/startup/init_lite/ # init组件
├── LICENSE
└── services
├── include # init组件头文件目录
├── src # init组件源文件目录
├── etc # init配置文件目录(json格式,镜像烧写后部署于/etc/init.cfg)
└── test # init组件测试用例源文件目录
└── unittest
device
└──hihope
└──rk3568
└──build
└──rootfs # init配置文件目录(适用于rk3568平台)
vendor
└──hisilicon
└──hispark_taurus_linux
└──init_configs # init配置文件目录(适用于L1 Linux内核版本)
```
## 约束
目前支持小型系统设备(参考内存≥1MB),如Hi3516DV300、Hi3518EV300以及RK3568等
## 使用说明
init将系统启动分为三个阶段:
“pre-init”阶段:启动系统服务之前需要先执行的操作,例如挂载文件系统、创建文件夹、修改权限等
“init”阶段:系统服务启动阶段
“post-init”阶段:系统服务启动完后还需要执行的操作
上述每个阶段在配置文件init.cfg中都用一个job表示,每个job都对应一个命令集合,init通过依次执行每个job中的命令来完成系统初始化。job执行顺序:先执行“pre-init”,再执行“init”,最后执行“post-init”,所有job都集中放在init.cfg的jobs数组中。
除上述jobs数组之外,init.cfg中还有一个services数组,用于存放所有需要由init进程启动的系统关键服务的服务名、可执行文件路径、权限和其他属性信息。
对于每个service的启动,从init拉起的方式上来区分,大致可分为以下三种策略:
* 通过start命令
在job中添加start service的命令,init将会在执行该job的阶段将对应服务拉起
* 分组并行启动
无须显式添加start命令,服务的start-mode属性为非condition配置,init将会为该服务按策略分组并在该分组服务启动时统一拉起
* 按需启动
按需启动的服务应当被认为是无须在系统启动过程中被拉起的,而是当需要时,这个当需要时的触发条件可能是被init监听的相关socket有消息上报、samgr收到客户端的请求需要拉起SA服务等情况,按需启动的服务需要配置ondemand属性为true,start-mode属性需要配置为condition
对于每个服务的启动,进程的运行,init提供了以保障系统安全性为目的的沙盒运行环境。每个进程运行时都有不同的环境约束,各个分层之间进程的资源隔离,确保每个进程都在各自的沙盒环境下运行,只访问允许的系统资源。
每个沙盒环境的分为只读资源和可写资源,只读资源由init在初始化时创建好,通过mount bind把只读文件指向全局FS中对应的目录,然后启动相应沙盒进程时通过chroot跳入到沙盒环境运行。对于可写目录,通过对全局/data目录进行划分,由存储服务进行统一管理分配,通过mnt namespace完成可写目录的沙盒化。
init的关键配置文件init.cfg位于代码仓库base/startup/init_lite/service/etc目录,部署在/etc/下,采用json格式,文件大小目前限制在100KB以内。
配置文件格式和内容说明如下所示:
```
{
"jobs" : [{
"name" : "pre-init",
"cmds" : [
"mkdir /testdir",
"chmod 0700 /testdir",
"chown 99 99 /testdir",
"mkdir /testdir2",
"mount vfat /dev/mmcblk0p0 /testdir2 noexec nosuid"
]
}, {
"name" : "init",
"cmds" : [
"copy /testfile /testfile2",
"symlink /testfile /testlink",
"write /testfile 0",
"ifup lo",
"hostname testhost",
"domainname testdomain"
]
}, {
"name" : "post-init",
"cmds" : [
"trigger testjob",
"trigger testjob2"
]
}, {
"name" : "services:service2",
"cmds" : [
"chmod 0773 /data/service2"
]
}
],
"services" : [{
"name" : "service1",
"path" : ["/system/bin/process1"],
"socket" : [{
"name" : "process1",
"family" : "AF_NETLINK",
"type" : "SOCK_DGRAM",
"protocol" : "NETLINK_KOBJECT_UEVENT",
"permissions" : "0660",
"uid" : "system",
"gid" : "system",
"option" : [
"SOCKET_OPTION_PASSCRED",
"SOCKET_OPTION_RCVBUFFORCE"
]
}],
"critical" : [ 0, 15, 5],
"ondemand" : true,
"start-mode" : "condition"
}, {
"name" : "service2",
"path" : ["/system/bin/process2"],
"start-mode" : "condition",
"disabled" : 1,
"console" : 1,
"uid" : "root",
"gid" : ["shell", "log", "readproc"],
"jobs" : {
"on-start" : "services:service2"
}
}
]
}
```
**表 1** 执行job介绍
job名
|
说明
|
pre-init
|
最先执行的job,如果开发者的进程在启动之前需要首先执行一些操作(例如创建文件夹),可以把操作放到pre-init中先执行。
|
init
|
中间执行的job,例如服务启动。
|
post-init
|
最后被执行的job,如果开发者的进程在启动完成之后需要有一些处理(如驱动初始化后再挂载设备),可以把这类操作放到该job执行。
|
单个job最多支持30条命令(当前仅支持start/mkdir/chmod/chown/mount/loadcfg),命令名称和后面的参数(参数长度≤128字节)之间有且只能有一个空格。
**表 2** 命令集说明
命令
|
命令格式和示例
|
说明
|
mkdir
|
mkdir 目标文件夹
如:mkdir /storage/myDirectory
|
创建文件夹命令,mkdir和目标文件夹之间有且只能有一个空格。
|
chmod
|
chmod 权限 目标
如:chmod 0600 /storage/myFile.txt
chmod 0750 /storage/myDir
|
修改权限命令,chmod 权限 目标 之间间隔有且仅有一个空格,权限必须为0xxx格式。
|
chown
|
chown uid gid 目标
如:chown 900 800 /storage/myDir
chown 100 100 /storage/myFile.txt
|
修改属组命令,chown uid gid 目标 之间间隔有且仅有一个空格。
|
mount
|
mount fileSystemType src dst flags data
如:mount vfat /dev/mmcblk0 /sdc rw,umask=000
mount jffs2 /dev/mtdblock3 /storage nosuid
|
挂载命令,各参数之间有且仅有一个空格。flags当前仅支持nodev、noexec、nosuid、rdonly,data为可选字段。
|
start
|
start serviceName
如:start foundation
start shell
|
启动服务命令,start后面跟着service名称,该service名称必须能够在services数组中找到。
|
loadcfg
|
loadcfg filePath
如:loadcfg /patch/fstab.cfg
|
加载其他cfg文件命令。后面跟着的目标文件大小不得超过50KB,且目前仅支持加载/patch/fstab.cfg,其他文件路径和文件名均不支持。/patch/fstab.cfg文件的每一行都是一条命令,命令类型和格式必须符合本表格描述,命令条数不得超过20条。
|
export
|
export key value
如:export TEST /data/test
|
设置环境变量命令。后面跟两个参数,第一个参数是环境变量名,第二个参数是环境变量值。
|
rm
|
rm filename
如:rm /data/testfile
|
删除文件命令。后面跟一个参数,即文件的绝对路径。
|
rmdir
|
rmdir dirname
如:rmdir /data/testdir
|
删除目录命令。后面跟一个参数,即目录的绝对路径。
|
write
|
write filename value
如:write /data/testfile 0
|
写文件命令。后面跟两个参数,第一个参数是文件的绝对路径,第二个参数是要写入文件的字符串。
|
stop
|
stop servicename
如:stop console
|
关闭服务命令。后面跟一个参数,即要关闭的服务名。
|
copy
|
copy oldfile newfile
如:copy /data/old /data/new
|
拷贝文件命令。后面跟两个参数,第一个参数是原文件绝对路径,第二个参数是新文件绝对路径。
|
reset
|
reset servicename
如:reset console
|
重启服务命令。后面跟一个参数,即要重启的服务名。目前reset命令的策略是,如果一个服务没有启动,则该命令会将其拉起,如果一个服务处于运行状态,则该命令会将其关闭后重启。
|
reboot
|
reboot (subsystem)
如:reboot updater
|
重启系统命令。后面可以跟一个参数,也可以没有参数,当没有参数时执行该命令,将会使设备重启到当前系统,当后面跟参数时,参数应当是子系统的名字,例如,reboot updater,将会重启进入updater子系统。
|
sleep
|
sleep time
如:sleep 5
|
睡眠命令。后面可以跟一个参数,该参数是睡眠时间。
|
**表 3** service字段说明
字段名
|
说明
|
name
|
当前服务的名称,须确保非空且长度≤32字节。
|
path
|
当前服务的可执行文件全路径和参数,数组形式。须确保第一个数组元素为可执行文件路径、数组元素个数≤20、每个元素为字符串形式以及每个字符串长度≤64字节。
|
uid
|
当前服务进程的uid值。
|
gid
|
当前服务进程的gid值。
|
secon
|
当前服务进程的安全上下文(当前不需要设置该字段)。
|
once
|
当前服务进程是否为一次性进程:
1:一次性进程,当该进程退出时,init不会重新启动该服务进程
0 : 常驻进程,当该进程退出时,init收到SIGCHLD信号并重新启动该服务进程;
注意:对于常驻进程,若在4分钟之内连续退出5次,第5次退出时init将不会再重新拉起该服务进程。
|
importance
|
当前服务进程优先级, 取值范围[19, -20]
|
caps
|
当前服务所需的capability值,根据安全子系统已支持的capability,评估所需的capability,遵循最小权限原则配置(当前最多可配置100个值)。
|
critical
|
critical服务启动失败后, 需要M秒内重新拉起, 拉起失败N次后, 直接重启系统, N默认为4, M默认20。(仅L2以上提供 "critical" : [0, 2, 10])
0:不使能;
1:使能;
|
cpucores
|
服务需要的绑定的cpu核心数, 类型为int型数组
|
d-caps
|
分布式能力 (仅L2以上提供)
|
apl
|
能力特权级别:system_core, normal, system_basic。 默认system_core (仅L2以上提供)
|
start-mode
|
服务的启动模式,具体描述:init服务启动控制(仅L2以上提供)
|
jobs
|
当前服务在不同阶段可以执行的job。具体说明可以看:init服务并行控制(仅L2以上提供)
|
ondemand
|
按需启动的服务需要配置的属性,配置有该属性的服务不会被start命令拉起,如果该服务同时配置有socket,init将会在解析服务时创建该socket并将其监听,当socket有消息上报时,init拉起对应服务
|
## 相关仓
[启动恢复子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E5%90%AF%E5%8A%A8%E6%81%A2%E5%A4%8D%E5%AD%90%E7%B3%BB%E7%BB%9F.md)
[startup\_syspara\_lite](https://gitee.com/openharmony/startup_syspara_lite/blob/master/README_zh.md)
[startup\_appspawn\_lite](https://gitee.com/openharmony/startup_appspawn_lite/blob/master/README_zh.md)
[startup\_bootstrap\_lite](https://gitee.com/openharmony/startup_bootstrap_lite/blob/master/README_zh.md)
**[startup\_init\_lite](https://gitee.com/openharmony/startup_init_lite/blob/master/README_zh.md)**