startup_init 模块

1. 模块概述

源码地址:https://gitee.com/openharmony/startup_init

1.1 功能与目标

startup_init 主模块是系统用户态的启动入口(pid=1),负责从早期引导到系统服务拉起的全链路编排。核心目标如下:

  • 完成第一阶段初始化:创建设备节点、挂载关键分区、切换到第二阶段;
  • 完成第二阶段初始化:参数服务、配置加载、作业触发、服务拉起、信号回收;
  • 提供统一的 service 生命周期管理(启动、停止、重启、崩溃恢复);
  • 提供配置驱动的命令执行与触发机制(pre-init/init/post-init 与 trigger jobs)。

典型场景:

  • 正常开机流程;
  • 充电模式、救援模式、维护恢复模式等分支启动;
  • 服务崩溃后自动恢复或触发保护性重启(critical 服务)。

1.2 系统位置

该模块位于 startup 子系统核心位置,是系统启动主控模块:

  • 上游:内核启动后拉起 init/bin/init);
  • 下游:参数服务、文件系统管理、sandbox、ueventd、service 控制链路;
  • 对外:通过参数与服务控制接口向其他模块暴露状态与控制能力。

定位:核心模块(启动编排中心),其他启动相关模块多为其依赖或协作模块。

1.3 设计思路与模式

设计思路
  • 分阶段启动:first-stage(最小可用环境)+ second-stage(完整初始化);
  • 配置驱动:通过 .cfg/JSON 配置定义 jobs 与 services;
  • 事件驱动:基于 trigger/loop/signal 机制驱动作业与服务状态变化;
  • 容错恢复:服务崩溃计数、定时重启、critical 保护策略。
设计模式
  • 状态机模式:启动阶段与服务状态按固定状态流转;
  • 观察者/事件分发模式:信号、触发器、socket 事件回调;
  • 插件/钩子扩展模式HookMgr 在不同 boot stage 注入能力;
  • 命令模式:命令字符串映射到 CmdTable 执行函数。

1.4 系统框图

Kernel

init first-stage

Required Partition Mount

init second-stage

param service

cfg parser

job/trigger engine

service manager

command executor

child processes

signal handler


2. 模块结构

2.1 源文件与头文件

入口与阶段管理
  • services/init/main.c:主入口,串联 SystemPrepare -> SystemInit -> SystemExecuteRcs -> SystemConfig -> SystemRun
  • services/init/standard/main_early.c:早期 init 入口。
  • services/init/standard/init_firststage.c:first-stage 逻辑(挂载、切换 second-stage)。
  • services/init/standard/init.c:second-stage 主流程实现。
  • services/init/include/init.h:模块总入口声明。
配置与解析
  • services/init/init_config.c:解析 .cfg,加载 services/jobs/import。
  • services/init/include/init_jobs_internal.h:job 结构与配置路径定义。
服务管理
  • services/init/init_service_manager.c:Service 实例构建、属性解析、按名控制。
  • services/init/init_common_service.c:Service 生命周期核心逻辑(start/stop/reap/timer)。
  • services/init/standard/init_service.c:标准平台服务执行细节。
  • services/init/include/init_service.h:Service 结构体、属性位、核心 API。
  • services/init/include/init_service_manager.h:service 管理接口。
命令与作业
  • services/init/init_common_cmds.c:通用命令解析与执行框架。
  • services/init/standard/init_cmds.c:标准平台命令集实现。
  • services/init/standard/init_cmdexecutor.c:命令执行器注册与插件命令。
  • services/init/standard/init_jobs.c:jobs 与 trigger 执行。
  • services/init/include/init_cmds.h:命令表与执行上下文定义。
运行支撑
  • services/init/standard/init_signal_handler.c:SIGCHLD/SIGTERM 处理与子进程回收。
  • services/init/adapter/init_adapter.c:平台适配(能力保留、rcS 执行等)。
  • services/init/standard/init_mount.c:分区挂载辅助。
  • interfaces/innerkits/include/service_control.h:服务状态枚举与控制 API。

2.2 类、结构体、函数与方法

主模块以 C 实现为主,核心是结构体 + 函数组合:

  • Serviceinit_service.h
    • 描述服务全量状态:名称、pid、属性位、权限、cap、socket/file、timer、jobs、context、error。
    • 关键字段:statusattributestartModeendModeserviceJobs
  • ServiceSpace
    • 全局服务空间计数与管理上下文(g_serviceSpace)。
  • CmdLine / CmdLines
    • job 命令集合抽象,支持索引执行。
  • ConfigContext
    • 配置上下文(主系统/芯片上下文),影响命令执行域。

关键函数:

  • 主流程:
    • SystemPrepare():first-stage 准备;
    • SystemInit():second-stage 基础初始化;
    • SystemConfig():参数/配置/trigger/service 启动编排;
    • SystemRun():进入事件循环。
  • 配置解析:
    • ParseInitCfg()ReadConfig()ParseAllServices()ParseAllJobs()
  • 服务控制:
    • ServiceStart()ServiceStop()ServiceTerm()ServiceReap()
    • StartServiceByName()StopServiceByName()TermServiceByName()
  • 命令执行:
    • DoCmdByIndex()ExecCmd()GetCmdLinesFromJson()
    • 标准命令如 start/stop/mount/chmod/chown/write/reboot/...

2.3 继承与多态

主模块为 C 风格实现,无 C++ 继承层次。
“多态”由以下机制实现:

  • 命令表 CmdTable + 函数指针,按命令名动态分派;
  • 插件命令 PluginCmdExecutor + hook 扩展,实现运行时行为扩展;
  • 不同平台目录(standard / lite)实现同名接口的编译期切换。

2.4 模块“类图/结构关系图”

1

1

*

*

Service

+name

+pid

+status

+attribute

+startMode

+endMode

+serviceJobs

+pathArgs

+servPerm

+socketCfg

+fileCfg

+timer

+lastErrno

ServiceSpace

+serviceCount

CmdLine

+cmdIndex

+cmdContent

CmdLines

+cmdNum

+cmds[]

ConfigContext

+type

2.5 模块内部依赖框图

main.c

SystemPrepare

SystemInit

SystemConfig

SystemRun

init_config.c

init_service_manager.c

init_jobs.c

init_common_cmds.c / init_cmds.c

init_common_service.c / init_service.c

LE_RunLoop / StartParamService

init_signal_handler.c


3. 模块间交互

3.1 交互描述

  • param 子系统:

    • 初始化参数服务(InitParamService);
    • 读写系统参数(SystemReadParam/SystemWriteParam);
    • 通过参数发布服务状态(startup.service.ctl.<name>)。
  • fs_manager/挂载链路:

    • first-stage 加载 fstab.required、挂载关键分区;
    • second-stage 执行 mount_fstab 等命令。
  • ueventd

    • first-stage 触发设备事件,确保必要设备节点就绪。
  • sandbox

    • 根据服务路径与策略进入对应 sandbox。
  • samgr/其他服务

    • 通过 init 启动配置拉起系统服务进程。

3.2 异步、事件驱动与多线程

  • 事件驱动
    • 基于 loopevent 处理 signal、watcher、timer;
    • trigger/job 事件驱动作业执行。
  • 异步处理
    • 服务进程由 fork+exec 启动,SIGCHLD 异步回收;
    • 定时重启由 LE_Timer 异步触发。
  • 多线程/多进程
    • 主体为单进程事件循环 + 多子进程服务模型;
    • 关键并发来自子进程生命周期与异步信号。

3.3 外部依赖框图

startup_init

param service

fs_manager

ueventd

sandbox

loopevent

libinit_utils

config_policy

boot modules/hooks


4. 状态机转换图

4.1 状态机模型

主模块建议分为两层状态机:

  • 系统启动阶段状态机(Boot Pipeline);
  • 服务生命周期状态机(Service Lifecycle)。

4.2 状态机树图

Init状态机

启动阶段状态机

服务状态机

FirstStage

SecondStageInit

ConfigLoaded

JobsTriggered

EventLoopRunning

SERVICE_IDLE

SERVICE_STARTING

SERVICE_STARTED

SERVICE_READY

SERVICE_STOPPING

SERVICE_STOPPED

SERVICE_ERROR

SERVICE_CRITICAL

4.3 状态机切换规则

  • 启动阶段切换

    • FirstStage -> SecondStageInit:关键分区挂载并 execv("/bin/init --second-stage")
    • SecondStageInit -> ConfigLoaded:参数服务与配置解析完成;
    • ConfigLoaded -> JobsTriggered:触发 pre-init/init/post-init
    • JobsTriggered -> EventLoopRunning:进入主循环。
  • 服务状态切换

    • IDLE -> STARTING/STARTED:执行 ServiceStart
    • STARTED -> READY:服务主动上报 ready(若支持);
    • STARTED/READY -> STOPPING -> STOPPED:stop/term 或退出回收;
    • STOPPED -> STARTED:按策略重启(once/ondemand/timer/critical 规则)。
  • 事件触发

    • 配置命令触发:start/stop/reset/trigger
    • 信号触发:SIGCHLD 子进程退出;
    • 时间触发:周期/延迟重启定时器;
    • 条件触发:critical 崩溃阈值触发 panic reboot

4.4 状态机转换图

mount required partitions + exec second stage

init param + read cfg

trigger pre-init/init/post-init

StartParamService / LE_RunLoop

FirstStage

SecondStageInit

ConfigLoaded

JobsTriggered

EventLoopRunning

ServiceLifecycle

start cmd

fork+exec success

service set ready

stop/term/reap

stop/term/reap

restart policy

crash threshold exceeded

SERVICE_IDLE

SERVICE_STARTING

SERVICE_STARTED

SERVICE_READY

SERVICE_STOPPING

SERVICE_STOPPED

SERVICE_CRITICAL


5. 接口设计

5.1 公共接口

模块主入口接口(内部主控)
  • void SystemPrepare(long long uptime);
    • 功能:first-stage 环境准备与必要分区挂载;
    • 返回:无,失败路径可触发中止/重启。
  • void SystemInit(void);
    • 功能:second-stage 基础环境初始化(socket、fd holder、时区等)。
  • void SystemConfig(const char *uptime);
    • 功能:参数服务初始化、配置加载、触发 boot jobs、启动服务。
  • void SystemRun(void);
    • 功能:进入事件循环。
  • void SystemExecuteRcs(void);
    • 功能:执行 /etc/init.d/rcS(按平台宏控制)。
服务控制接口(对外)
  • int ServiceControl(const char *serviceName, int action);
  • int ServiceControlWithExtra(const char *serviceName, int action, const char *extArgv[], int extArgc);
  • int ServiceWaitForStatus(const char *serviceName, ServiceStatus status, int waitTimeout);
  • int ServiceSetReady(const char *serviceName);
  • int StartServiceByTimer(const char *serviceName, uint64_t timeout);
  • int StopServiceTimer(const char *serviceName);

ServiceStatus 典型值:SERVICE_IDLE/STARTING/STARTED/READY/STOPPING/STOPPED/ERROR/CRITICAL

命令接口(配置驱动)

命令通过 CmdTable 暴露,典型包括:

  • 服务类:start/stop/reset/termservice
  • 文件系统类:mount/mount_fstab/umount/mkdir/chmod/chown
  • 系统类:setparam/trigger/reboot/export/write/sleep/wait

5.2 数据交换接口

  • 配置交换

    • 输入:/etc/init.cfgetc/init/*.cfg、模式特定目录配置;
    • 格式:JSON(services/jobs/import)。
  • 参数交换

    • 通道:SystemReadParam/SystemWriteParam
    • 关键参数:ohos.boot.modestartup.service.ctl.<service> 等。
  • 进程与事件交换

    • 通道:signal(SIGCHLD/SIGTERM)、socket watcher、timer 回调;
    • 协议:POSIX 信号 + loopevent 事件模型。

5.3 接口调用时序图

ParamService ServiceManager JobEngine ConfigParser init(second-stage) init(first-stage) Kernel ParamService ServiceManager JobEngine ConfigParser init(second-stage) init(first-stage) Kernel exec /bin/init (pid=1) SystemPrepare() mount required partitions exec /bin/init --second-stage SystemInit() InitParamService() ReadConfig()/ParseInitCfg() ParseAllServices() ParseAllJobs() trigger pre-init/init/post-init start/stop/reset command write startup.service.ctl.<name> SystemRun() event loop
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐