OpenHarmony恢复启动子系统init进程之服务启动

本文详细介绍了设备从pre-init到post-fs-data阶段的启动流程,涉及初始化目录、权限设置、服务启动、挂载文件系统、加载内核驱动等多个环节。在pre-init阶段,启动ueventd、watchdog服务,创建目录并挂载vendor分区。init阶段,启动lo回环网卡,设置hostname。post-init阶段,触发各种fs阶段的命令,如early-fs、fs、post-fs、late-fs和post-fs-data。在这些阶段中,分别启动了vold、hdf_devmgr、hdf_host、inputmethodservice、updater_sa、timeservice、telephony等服务,并进行了权限和模块的配置。整个启动过程中,涉及到的硬件相关配置、系统服务和框架组件的初始化是关键步骤。

首先执行job,如果开发者的进程在启动之前需要首先执行一些操作(例如创建文件夹),可以把操作放到pre-init中先执行。一般pre-init阶段主要是为后面启动服务做准备的,比如挂载目录,设置权限,启动uevent、watchdog等,uevent主要是有些服务需要响应插拔事件才会被拉起。

执行job介绍:

job名

说明

pre-init

最先执行的job,如果开发者的进程在启动之前需要首先执行一些操作(例如创建文件夹),可以把操作放到pre-init中先执行。

init

中间执行的job,例如服务启动。

post-init

最后被执行的job,如果开发者的进程在启动完成之后需要有一些处理(如驱动初始化后再挂载设备),可以把这类操作放到该job执行。单个job最多支持30条命令(当前仅支持start/mkdir/chmod/chown/mount/loadcfg),命令名称和后面的参数(参数长度≤128字节)之间有且只能有一个空格。

pre-init,init,post-init 除了/etc/init.cfg 里定义的jobs外,也包括其他服务配置的jobs。也就是说其他服务进程也可以配置pre-init,init,post-init。

执行流程:

 

图为一次执行的顺序是pre-init,init,启动所有boot服务,post-init,所有Normal 服务。

pre-init

主要是启动ueventd,watch_dog, 其他的就是设置权限,挂载/data 和 硬件相关的挂载目录。具体看下面注释:

{

            "name" : "pre-init",

            "cmds" : [

                "write /proc/sys/kernel/sysrq 0",

                ##1、 写为0表示 关闭sysrq,1表示启动。 sysrq 是系统请求,在键盘上对应PrintScreen键。

                ## 这里是关闭了所有的请求。

                "mkdir /acct/uid",

                "chown root system /dev/memcg/memory.pressure_level",

                "chmod 0040 /dev/memcg/memory.pressure_level",

                "mkdir /dev/memcg/apps/ 0755 system system",

                "mkdir /dev/memcg/system 0550 system system",

                ##2、 设置内存压力相关的权限配置。

                "start ueventd",            ##3、 启动ueventd 服务

                "start watchdog_service",   ##4、 启动看门狗

                "mkdir /data",

                "mount_fstab /vendor/etc/fstab.${ohos.boot.hardware}",  ##5、 挂载vendor分区,跟硬件产品相关

                "chown system system /data",       ## 6 为userdata 分区 会挂载在/data 目录做准备

                "chmod 0771 /data",     ##  可读可写可执行,其他用户只读

                "mkdir /data/service 0711 root root",

                "mkdir /data/service/el0 0711 root root",

                "load_persist_params ",   ##7、 加载常驻参数,类似 persist.sys.usb.config=hdc

                "chown access_token access_token /dev/access_token_id",  ##8、 token id

                "chmod 0666 /dev/access_token_id"

            ]

}

init

init 是触发所有配置文件中的init字段的命令的。

  1. /etc/init.cfg

在init.cfg加载了"/etc/init.usb.cfg", "/etc/init.usb.configfs.cfg", /vendor/etc/init.${ohos.boot.hardware}.cfg"这几个config,会把它们的信息全部整合进来。

可以看出,在 init.cfg 中,主要是做了如下事情:

创建相关的目录,修改各设备节点的权限,配置一些参数。 启动 lo 回环网卡,配置hostname为localhost, domainname为localdomain。

{

    "import" : [

            "/etc/init.usb.cfg",

            "/etc/init.usb.configfs.cfg",

            "/vendor/etc/init.${ohos.boot.hardware}.cfg"

    ],

  ],

    "jobs" : [ {

            "name" : "init",

            "cmds" : [

                "copy /proc/cmdline /dev/urandom",

                "copy /system/etc/prop.default /dev/urandom",

                "symlink /proc/self/fd/0 /dev/stdin",

                "symlink /proc/self/fd/1 /dev/stdout",

                "symlink /proc/self/fd/2 /dev/stderr",

                "symlink /system/bin /bin",

                "symlink /system/etc /etc",

                "symlink /sys/kernel/debug /d",

                "symlink /system/vendor /vendor",

                "mkdir /dev/stune/foreground",

                "mkdir /dev/stune/background",

                "mkdir /dev/stune/top-app",

                "mkdir /dev/stune/rt",

                "chown system system /dev/stune",

                "chown system system /dev/stune/foreground",

                "chown system system /dev/stune/background",

                "chown system system /dev/stune/top-app",

                "chown system system /dev/stune/rt",

                "chown system system /dev/stune/tasks",

                "chown system system /dev/stune/foreground/tasks",

                "chown system system /dev/stune/background/tasks",

                "chown system system /dev/stune/top-app/tasks",

                "chown system system /dev/stune/rt/tasks",

                "chmod 0664 /dev/stune/tasks",

                "chmod 0664 /dev/stune/foreground/tasks",

                "chmod 0664 /dev/stune/background/tasks",

                "chmod 0664 /dev/stune/top-app/tasks",

                "chmod 0664 /dev/stune/rt/tasks",

                "mkdir /dev/blkio/background",

                "chown system system /dev/blkio",

                "chown system system /dev/blkio/background",

                "chown system system /dev/blkio/tasks",

                "chown system system /dev/blkio/background/tasks",

                "chmod 0664 /dev/blkio/tasks",

                "chmod 0664 /dev/blkio/background/tasks",

                "write /dev/blkio/blkio.weight 1000",

                "write /dev/blkio/background/blkio.weight 500",

                "write /dev/blkio/blkio.group_idle 0",

                "write /dev/blkio/background/blkio.group_idle 0",

                "mount configfs none /config nodev noexec nosuid",

                "chmod 0770 /config/sdcardfs",

                "chown system package_info /config/sdcardfs",

                "mkdir /mnt/secure 0700 root root",

                "mkdir /mnt/secure/asec 0700 root root",

                "mkdir /mnt/asec 0755 root system",

                "mkdir /mnt/obb 0755 root system",

                "mkdir /mnt/media_rw 0750 root media_rw",

                "mkdir /mnt/user 0755 root root",

                "mkdir /mnt/user/0 0755 root root",

                "mkdir /mnt/expand 0771 system system",

                "mkdir /mnt/appfuse 0711 root root",

                "mkdir /mnt/runtime 0700 root root",

                "mkdir /mnt/runtime/default 0755 root root",

                "mkdir /mnt/runtime/default/self 0755 root root",

                "mkdir /mnt/runtime/read 0755 root root",

                "mkdir /mnt/runtime/read/self 0755 root root",

                "mkdir /mnt/runtime/write 0755 root root",

                "mkdir /mnt/runtime/write/self 0755 root root",

                "mkdir /mnt/runtime/full 0755 root root",

                "mkdir /mnt/runtime/full/self 0755 root root",

                "symlink /storage/self/primary /sdcard",

                "symlink /storage/self/primary /mnt/sdcard",

                "symlink /mnt/user/0/primary /mnt/runtime/default/self/primary",

                "write /proc/sys/kernel/panic_on_oops 1",

                "write /proc/sys/kernel/hung_task_timeout_secs 0",

                "write /proc/cpu/alignment 4",

                "write /proc/sys/kernel/sched_tunable_scaling 0",

                "write /proc/sys/kernel/sched_latency_ns 10000000",

                "write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000",

                "write /proc/sys/kernel/sched_child_runs_first 0",

                "write /proc/sys/kernel/randomize_va_space 2",

                "write /proc/sys/vm/mmap_min_addr 32768",

                "write /proc/sys/net/ipv4/ping_group_range 0 2147483647",

                "write /proc/sys/net/unix/max_dgram_qlen 600",

                "write /proc/sys/kernel/sched_rt_runtime_us 950000",

                "write /proc/sys/kernel/sched_rt_period_us 1000000",

                "write /proc/sys/net/core/rmem_max 262144",

                "write /proc/sys/net/core/wmem_max 262144",

                "write /proc/sys/net/ipv4/fwmark_reflect 1",

                "write /proc/sys/net/ipv6/fwmark_reflect 1",

                "write /proc/sys/net/ipv4/tcp_fwmark_accept 1",

                "write /proc/sys/net/ipv4/conf/all/accept_redirects 0",

                "write /proc/sys/net/ipv6/conf/all/accept_redirects 0",

                "chmod 0400 /proc/net/fib_trie",

                "chown system system /dev/cpuctl",

                "chown system system /dev/cpuctl/tasks",

                "chmod 0666 /dev/cpuctl/tasks",

                "write /dev/cpuctl/cpu.rt_period_us 1000000",

                "write /dev/cpuctl/cpu.rt_runtime_us 950000",

                "mkdir /dev/cpuset/foreground",

                "copy /dev/cpuset/cpus /dev/cpuset/foreground/cpus",

                "copy /dev/cpuset/mems /dev/cpuset/foreground/mems",

                "mkdir /dev/cpuset/background",

                "copy /dev/cpuset/cpus /dev/cpuset/background/cpus",

                "copy /dev/cpuset/mems /dev/cpuset/background/mems",

                "mkdir /dev/cpuset/system-background",

                "copy /dev/cpuset/cpus /dev/cpuset/system-background/cpus",

                "copy /dev/cpuset/mems /dev/cpuset/system-background/mems",

                "mkdir /dev/cpuset/restricted",

                "copy /dev/cpuset/cpus /dev/cpuset/restricted/cpus",

                "copy /dev/cpuset/mems /dev/cpuset/restricted/mems",

                "mkdir /dev/cpuset/top-app",

                "copy /dev/cpuset/cpus /dev/cpuset/top-app/cpus",

                "copy /dev/cpuset/mems /dev/cpuset/top-app/mems",

                "chown system system /dev/cpuset",

                "chown system system /dev/cpuset/foreground",

                "chown system system /dev/cpuset/background",

                "chown system system /dev/cpuset/system-background",

                "chown system system /dev/cpuset/top-app",

                "chown system system /dev/cpuset/restricted",

                "chown system system /dev/cpuset/tasks",

                "chown system system /dev/cpuset/foreground/tasks",

                "chown system system /dev/cpuset/background/tasks",

                "chown system system /dev/cpuset/system-background/tasks",

                "chown system system /dev/cpuset/top-app/tasks",

                "chown system system /dev/cpuset/restricted/tasks",

                "chmod 0775 /dev/cpuset/system-background",

                "chmod 0664 /dev/cpuset/foreground/tasks",

                "chmod 0664 /dev/cpuset/background/tasks",

                "chmod 0664 /dev/cpuset/system-background/tasks",

                "chmod 0664 /dev/cpuset/top-app/tasks",

                "chmod 0664 /dev/cpuset/restricted/tasks",

                "chmod 0664 /dev/cpuset/tasks",

                "chown system system /proc/pressure/memory",

                "chmod 0664 /proc/pressure/memory",

                "chown root net_bw_acct /proc/net/xt_qtaguid/ctrl",

                "chown root net_bw_stats /proc/net/xt_qtaguid/stats",

                "chmod 0644 /dev/xt_qtaguid",

                "chown root root /dev/cg2_bpf",

                "chmod 0600 /dev/cg2_bpf",

                "mount bpf bpf /sys/fs/bpf nodev noexec nosuid",

                "mkdir /dev/fscklogs 0770 root system",

                "mount pstore pstore /sys/fs/pstore nodev noexec nosuid",

                "chown system log /sys/fs/pstore",

                "chmod 0550 /sys/fs/pstore",

                "chown system log /sys/fs/pstore/console-ramoops",

                "chmod 0440 /sys/fs/pstore/console-ramoops",

                "chown system log /sys/fs/pstore/console-ramoops-0",

                "chmod 0440 /sys/fs/pstore/console-ramoops-0",

                "chown system log /sys/fs/pstore/pmsg-ramoops-0",

                "chmod 0440 /sys/fs/pstore/pmsg-ramoops-0",

                "write /proc/sys/abi/swp 1",

                "symlink /proc/self/fd /dev/fd",

                "export DOWNLOAD_CACHE /data/cache",

                "setrlimit RLIMIT_NICE 40 40",

                "setrlimit RLIMIT_NOFILE 32768 32768",

                "write /sys/class/leds/vibrator/trigger transient",

                "write /dev/cpu_variant:${ro.bionic.arch} ${ro.bionic.cpu_variant}",

                "chmod 0444 /dev/cpu_variant:${ro.bionic.arch}",

                "write /dev/cpu_variant:${ro.bionic.2nd_arch} ${ro.bionic.2nd_cpu_variant}",

                "chmod 0444 /dev/cpu_variant:${ro.bionic.2nd_arch}",

                "chown system system /sys/power/state",

                "chown system system /sys/power/wakeup_count",

                "chmod 0660 /sys/power/state",

                "ifup lo",

                "hostname localhost",

                "domainname localdomain"

            ]

        }

  1. /vendor/etc/init.${ohos.boot.hardware}.cfg

主要是跟硬件产品相关的配置,这里看hi3516dv300, 可见主要是挂载了debugfs(调试子系统),修改设备角色为 peripheral,即设备。

{

    "import" : [

            "init.${ro.hardware}.usb.cfg"

    ],

    "jobs" : [ {

            "name" : "init",

            "cmds" : [

                "mount debugfs /sys/kernel/debug /sys/kernel/debug mode=755",

                "write /sys/kernel/debug/hisi_inno_phy/role peripheral"

            ]

        }

    ]

}

  1. foundation.cfg 用户程序框架子系统

挂载cgroup到/dev/memcg主要做了如下事情:

挂载 cgroup 的memory、cpuset、cpu、freezer这几个到 /dev/memcg 目录下 cgroups子系统: Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等),其最早的名称为进程容器(process containers)。

cgroups可控制的子系统主要如下: cpu 子系统,主要限制进程的 cpu 使用率。 cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。 cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。 memory 子系统,可以限制进程的 memory 使用量。 blkio 子系统,可以限制进程的块设备 io。 devices 子系统,可以控制进程能够访问某些设备。 net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。 net_prio — 这个子系统用来设计网络流量的优先级 freezer 子系统,可以挂起或者恢复 cgroups 中的进程。 ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

{

    "jobs" : [{

            "name" : "init",

            "cmds" : [

                "mkdir /dev/memcg",

                "mount cgroup none /dev/memcg memory",

                "chown system system /dev/memcg",

                "chown system system /dev/memcg/tasks",

                "chown system system /dev/memcg/memory.oom_control",

                "chown system system /dev/memcg/cgroup.event_control",

                "chown system system /dev/memcg/memory.pressure_level",

                "chmod 0755 /dev/memcg",

<think>我们正在讨论OpenHarmony恢复出厂设置的流程。根据用户的问题,需要了解具体操作步骤和流程。首先,我们需要明确恢复出厂设置是系统级别的操作,通常涉及清除用户数据、恢复系统默认设置等。在OpenHarmony中,这一流程可能由特定的系统服务或应用程序管理。 根据引用[5]中提到,init进程是用户态的第一个应用程序,它在系统启动时运行。因此,恢复出厂设置可能涉及重新初始化系统分区或用户数据分区。此外,引用[1]中提到了升级包的制作和校验,虽然与升级相关,但恢复出厂设置可能使用类似的机制来还原系统。 在OpenHarmony中,恢复出厂设置通常有两种触发方式: 1. 通过系统设置应用(Settings)的图形界面触发。 2. 通过系统命令(如命令行)触发,这通常在开发或调试时使用。 具体流程可能包括以下步骤: 1. 触发恢复出厂设置(用户通过UI确认或执行命令)。 2. 系统服务(可能是DeviceSettingsManager或类似服务)接收到请求。 3. 系统服务调用底层清除数据的接口。 4. 清除用户数据分区(如data分区)中的数据。 5. 清除缓存分区(如cache分区)中的数据。 6. 重新初始化系统设置(可能包括重置系统配置、网络设置等)。 7. 重启设备。 注意:恢复出厂设置不会影响系统分区的升级,即不会回退系统版本,只会清除用户数据。因此,它依赖于当前已安装的系统版本。 引用[5]中提到烧录rootfs.img,但恢复出厂设置通常不涉及重新烧录系统镜像,而是清除用户数据。不过,在开发阶段,烧录rootfs.img可以用于恢复整个系统(包括出厂设置),但这不是常规的恢复出厂设置操作。 下面我们详细描述操作步骤: ### OpenHarmony 恢复出厂设置流程 #### 1. **触发恢复出厂设置** - **图形界面方式**:在系统设置应用中,用户进入“备份与恢复”或“重置”选项,选择“恢复出厂设置”。系统会要求用户确认,并可能要求输入密码(如果设置了安全锁)。 - **命令行方式**:在具有root权限的终端中,执行恢复出厂设置的命令。例如,OpenHarmony可能提供了`reset_device`命令(具体命令可能因设备厂商而异)。 #### 2. **系统处理流程** - 系统设置应用(或命令行工具)会调用系统服务(如`DeviceResetService`)的接口。 - 系统服务会执行以下操作: - 停止用户相关的服务和应用,确保数据不会被修改。 - 清除用户数据分区(挂载在`/data`)的所有数据。这包括应用数据、系统设置、用户文件等。 - 清除缓存分区(`/cache`)的数据。 - 重置系统配置,例如网络设置、蓝牙配对信息等(这些配置可能存储在`/data`分区中,因此清除该分区即重置)。 - 重新创建必要的目录结构(如`/data`下的基础目录)。 #### 3. **重启设备** - 清除完成后,系统服务会触发设备重启。 - 重启过程中,系统会重新初始化,进入首次开机的设置向导(类似于新设备的状态)。 #### 4. **底层实现细节** - 在OpenHarmony中,恢复出厂设置的核心操作是格式化用户数据分区。这通常通过调用`mksh`(命令解释器)执行`format`命令来实现。例如: ```shell format /data ``` - 此外,系统可能会删除其他分区(如`/cache`)的内容,但不会影响系统分区(如`/system`、`/vendor`等)。 - 引用[5]中提到,系统启动时由init进程挂载rootfs,然后运行`/bin/init`。恢复出厂设置后,设备重启,init进程会重新初始化用户数据分区,并启动系统服务。 #### 注意事项 - **数据备份**:恢复出厂设置前,用户应备份重要数据,因为此操作不可逆。 - **安全机制**:为防止误操作,系统通常需要多次确认,并可能要求输入密码。 - **设备差异**:不同设备厂商可能定制恢复出厂设置的流程,例如增加清除内部存储或SD卡的选项。 #### 开发调试相关 - 在开发板上,可以通过串口或adb连接执行命令来触发恢复出厂设置。例如: ```shell reboot recovery # 进入恢复模式,然后选择恢复出厂设置(如果支持) 或 reset_device # 假设这是设备提供的命令 ``` 但具体的命令需要参考设备厂商的文档。 - 引用[1]提到升级包制作工具的BUG,虽然与恢复出厂设置不直接相关,但说明系统升级和恢复出厂设置可能共享部分底层机制(如分区操作)。 ### 相关问题 §§相关问题§§ 1. 如何防止OpenHarmony设备被误恢复出厂设置? 2. 恢复出厂设置后,OpenHarmony系统如何重新初始化用户数据分区? 3. OpenHarmony恢复出厂设置是否会清除系统更新? 4. 如何在OpenHarmony中实现自定义的恢复出厂设置逻辑?</think>### OpenHarmony 恢复出厂设置流程详解 恢复出厂设置(Factory Reset)是设备维护的关键操作,OpenHarmony 通过系统服务实现该功能。以下是完整流程(基于标准系统解决方案): #### 1. **用户触发恢复操作** - **图形界面路径**:设置 → 系统 → 重置 → 恢复出厂设置 - **物理按键组合**(设备特定):同时按住音量+和电源键进入恢复模式 - **命令行触发**(开发者模式): ```shell # 通过hilog工具触发重置 hilog -p reset_device ``` 此命令会调用系统底层的恢复接口[^5] #### 2. **系统服务处理流程** ```mermaid graph TD A[用户触发操作] --> B(DeviceSettingsManager服务) B --> C{验证设备状态} C -->|正常| D[停止所有用户进程] C -->|异常| E[进入安全恢复模式] D --> F[挂载/data分区为读写] F --> G[执行数据清除操作] G --> H[重建文件系统结构] H --> I[重启设备] ``` #### 3. **数据清除阶段(核心步骤)** 1. **分区格式化**: - `/userdata` 分区完全格式化(使用 `mkfs.vfat` 或设备专用格式) - `/cache` 分区清空 - 保留 `/system` 和 `/vendor` 系统分区不变 2. **关键目录重建**: ```shell # 重建基础目录结构 mkdir -p /data/app mkdir -p /data/service chmod 0755 /data/app ``` 3. **配置重置**: - 删除 `/data/system/` 下的配置文件: ```shell rm -rf /data/system/device_policies.xml rm -rf /data/system/accounts.db ``` - 重置网络配置: ```shell rm /data/misc/ethernet/ipconfig.txt ``` #### 4. **安全验证机制 - **数字签名验证**:恢复前校验系统镜像签名(使用 security 子系统的证书链)[^2] - **防误触保护**:连续3次确认操作(带5秒倒计时) - **硬件级保护**:TrustZone 环境执行敏感操作(如加密密钥销毁) #### 5. **重启初始化 - 重新执行 init 进程(用户态首个进程)[^5] - 重建基础服务: ```shell # init.rc 部分配置 service zygote /system/bin/app_process class main user root ``` - 首次启动向导激活(类似新设备初始化) #### 注意事项 1. 数据清除不可逆,建议提前备份 2. 部分设备需保持充电状态(电量 > 30%) 3. 企业设备可能受 MDM 策略限制[^4] 4. 若遇失败(如引用[1]的BUG),需升级系统版本解决 > **技术原理**:本质是通过 Linux 底层文件操作 + 系统服务管理实现,核心是 `/data` 分区格式化。系统版本升级不会回退,仅清除用户数据[^2][^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值