# 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)**