【鸿蒙OS开发入门】13 – 启动流程代码分析之第一个用户态进程:init 进程 之 init 任务详解

【鸿蒙OS开发入门】13 - 启动流程代码分析之第一个用户态进程:init 进程 之 init 任务详解

  • ​​一、 /etc/init.cfg 系统默认cfg:启动lo回环网卡​​
    • ​​1.1 init.华为官网Hi3516DV300.cfg:持载debugfs到/sys/kernel/deharmonyos2.0.0系统好用吗bug​​
  • ​​二、/system/etc/init 下的cfg​​
    • ​​2.1 foundation.cfg 用户程序框架子系统 :挂载cgroup到/dev/memcg​​
    • ​​2.2 samgr_L2.cfg 用户程序框架子系linux系统统:启动samgr 服务​​

本系列文章汇总:

  1. 《​​【鸿蒙OS开发入门】01 - 搭建Ubuntu虚拟机开发环境​​》
  2. 《​​【鸿蒙harmonyos是鸿蒙吗OS开发入门】02 - 启动流程代码分析之Uboot 第一阶段:之解压并引导加载u-boot.bin​​》
  3. harmonyos好用吗​​【鸿蒙OS开发入门】03 - 启动程代码分析之Uboot 第二阶段:之board_init初始化​​》
  4. 《​​【鸿蒙OS开发入门】04 - 启动程代码分析之Uboot 第二阶段:之U_BOOT_CMD原理​​》
  5. 《​​【鸿蒙OS开发入门】05 - 启动流程代码分析之Uboot 第二阶段:之bootm引导加载Kernel OS​​linux删除文件命令
  6. 《​​【鸿蒙OS开发入门】06 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核​​》
  7. 《​​harmonyos【鸿蒙OS开发入门】07 - 安装docker环境编译openharmony 2.0代码​​》
  8. 《​​【鸿蒙OS开发入门】08 - 启动流程代码分析华为mate40pro之KernelOS:之启动 liteos_a 内核​​》
  9. 《​​【鸿蒙OS开发入门linux】09 - 启动流程代码分析之KernelOS:之启动Linux-4.19 Kernel内核 中do_basic_setup()所干的华为官网大事​​》
  10. 《​​【鸿蒙OS开发入门】10 - 启动流程代码分析之第一个用户态进程:init 进程​​》
  11. 《​​【鸿蒙OS开发入门】11 - 启动流程代码分析之第一个用户态进程:ilinux是什么操作系统nit 进程 之 Services简linux操作系统基础知识介​​》
  12. 《​​【鸿蒙OS开发入门】12 - 启动流程代码分析之第一个用户态进程:in系统运维工资一般多少it 进程 之 pre-init 任务详解​​》
  13. 《​​【鸿蒙OS开发入门】13 - 启动流程代码分析之第系统运维工作内容一个linux是什么操作系统用户态进程:系统运维工资一般多少init 进系统运维面试题及答案程 之 init 任务详解​​》
  14. 《​​【鸿蒙OS开发入门】14 - 启动流程代码分析之第一个系统运维工作内容用户态进程:in华为将和苹果三星谈判it 进程 之 post-init 任务详解​​》
  15. 《【鸿蒙OS开harmonyos设备是什么手机发入门】15 - 启动流程代码分析之第一个用户态进程:init 进程 之 libuv 做了啥?》代码分析
  16. 《​​【鸿蒙OS开发入门】16 - 重头搭建Ubuntu新环境编译OpenHarmony 3.0 LTS​​》

在前面我们分析到:​​pre-系统/运维init​​ 阶段主要是做了启动​​ueventd​​服务,以及挂载​​vendor、userdata​​ 这两个分区。

本文,我们来看下,​​init​​ 阶段又做了什么呢?

注:本文先看正常开机的流程,有关reco华为mate50ver模式,或updater情况下,我们后续再单独分析

# base\startup\init_lite\services\src\main.c
int main(int argc, char **argv)
{
......
// 4. 分别执行pre-init、init、post-init 等相关的事情
InitReadCfg();
--------->
+ ParseInitCfg(INIT_CONFIGURATION_FILE); // "/etc/init.cfg"
+ DumpAllServices(); // 打印所有的服务信息,系统中所有现有的服务保存在 static Service* g_services 中,通过g_servicesCnt来进行索引计数。
+ DoJob("pre-init"); // 执行 `/etc/init.cfg` 中 `pre-init`的内容
+ DoJob("init"); // 执行 `/etc/init.cfg` 中 `init`的内容
+ DoJob("post-init"); // 执行 `/etc/init.cfg` 中 `post-init`的内容
+ ReleaseAllJobs(); // 释放init.cfg中所有的jobs 命令所占用的空间
<---------
......
}

​DoJob("init");​​的作用是,触发启动 ​​json cfg​​文件中所有​​init​字段的命令,我们分别来看看这些命令的功能吧。

一、 /etc/init.cfg 系统默认cfg:启动lo回环网系统运维工作内容

在​​init.clinuxfg​​​加载了​​"/etc/init.usb.cfg", "/etc/init.usb.configfs.cfg", "/etc/init.Hi3516DV300.us华为b.cfg", "/etc/init.Hi3516Dlinux系统安装V300.cfg"​​这几个config,会把它们的信息全部整合进来。

可以看出代码分析工具,在 init系统运维工程师面试问题及答案.cfg 中,主要是做了如下事情harmonyos和安卓的区别

  1. 创建相关的目录,修改各设备节点的权限,配置一些参数。
  2. 启动 ​​lo​​​ 回环网卡,配置​​hostname​​​为​​localhost​​​, ​​domainname​​​为​​localdomain​​。
# base/startup/init_lite/services/etc/init.cfg
{
"import" : [
"/etc/init.usb.cfg",
"/etc/init.usb.configfs.cfg",
"/etc/init.usb.cfg",
"/etc/init.Hi3516DV300.usb.cfg",
"/etc/init.Hi3516DV300.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.1 init.Hi3516DV300.cfg:持载debugfs到/sys/kernel/debug

  1. 挂载 ​​debugfs​​​ 到​​/linux是什么操作系统sys/kernel/debug​​中。
  2. 修改设备角色为 ​​peharmonyos2.0.0系统好用吗ripheral​​,即设备。linux重启命令
# device/hisilicon/hi3516dv300/build/rootfs/init.Hi3516DV300.cfg
{
"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"
]
}

二、/system/etc/init 下的cfg

存在 ​​init​​ 的cfg 总共有这些文件:

./foundation/appexecfwk/standard/sa_profile/foundation.cfg:3:            "name" : "init",
./foundation/distributedschedule/samgr/services/samgr/native/samgr_L2.cfg:3: "name" : "init",

2.1 flinux常用命令ounharmonyos官网dation.cfg 用户程序框架子系统 :挂载cgr代码分析工具oup到/dev/memcg

华为商城户程序框架子linux删除文件命令系统 初始化过程中,主要做了如下事情:

挂载 ​​cgroup​​ 的​​memory、cpuset、cpu、freezer​​这几个到 ​​/dev/memcg​​ 目录下

​cgroupsharmonyos怎么读​子系统: ​​Linux CGroup​​全称​​Linux Control Group​​, 是​​Linux​​内核的一个功能,用来限制,控制与分离一个进程组群的资源(如​​CPU​​、内存、磁盘输入输出等系统/运维),harmonyos官网其最早的名称为进程容器(​​proclinux操作系统基础知识ess containers​​)harmonyos有什么新功能。详细可参考:《​​LI系统运维包括哪些内容NUX CGROUP总结​​》

​cgrouharmonyos和安卓的区别ps​​可控制的子系统主要如下:

​cpu​​ 子系统,主要限制进程的 cpu 使用率。

linux必学的60个命令cpuacct​​ 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。

​cpuset​linux重启命令 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。

​memory​​ 子系统,可以限制进程的 memory 使用量。

​blkio​​ 子系统,可以限制进程的块设备 io。harmonyos和安卓的区别

​devices​harmonyos有什么新功能 子系统,可以控制进程能够访问某些设备。

​net_cls​​ 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(tralinux创建文件ffic control)对数据包进行控制。

​net_prio​​ — 这个子系统用harmonyos 2.0是鸿蒙吗来设计网络流量的优先级

​freezer​​ 子系统,可以挂起或者恢复 cgroups 中的进程。

​ns​​ 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace

​hugetlb​​ — 这个子系统华为p40主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

# foundation/appexecfwk/standard/sa_profile/foundation.cfg
{
"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",
"chmod 0755 /dev/memcg/tasks",
"chmod 0755 /dev/memcg/memory.oom_control",
"chmod 0755 /dev/memcg/cgroup.event_control",
"chmod 0755 /dev/memcg/memory.pressure_level",
"mkdir /dev/cpuset",
"mount cgroup none /dev/cpuset cpuset",
"mkdir /dev/cpuset/background",
"chown system system /dev/cpuset",
"chown system system /dev/cpuset/tasks",
"chown system system /dev/cpuset/background",
"chown system system /dev/cpuset/background/tasks",
"chmod 0755 /dev/cpuset",
"chmod 0755 /dev/cpuset/tasks",
"chmod 0755 /dev/cpuset/background",
"chmod 0755 /dev/cpuset/background/tasks",
"write /dev/cpuset/background/cpuset.cpus 0",
"mkdir /dev/cpuctl",
"mount cgroup none /dev/cpuctl cpu",
"mkdir /dev/cpuctl/background",
"chown system system /dev/cpuctl",
"chown system system /dev/cpuctl/tasks",
"chown system system /dev/cpuctl/background",
"chown system system /dev/cpuctl/background/tasks",
"chmod 0755 /dev/cpuctl",
"chmod 0755 /dev/cpuctl/tasks",
"chmod 0755 /dev/cpuctl/background",
"chmod 0755 /dev/cpuctl/background/tasks",
"write /dev/cpuctl/background/cpu.shares 512",
"mkdir /dev/freezer",
"mount cgroup none /dev/freezer freezer",
"mkdir /dev/freezer/frozen",
"mkdir /dev/freezer/thawed",
"chown system system /dev/freezer",
"chown system system /dev/freezer/frozen",
"chown system system /dev/freezer/frozen/tasks",
"chown system system /dev/freezer/thawed",
"chown system system /dev/freezer/thawed/tasks",
"chmod 0755 /dev/freezer",
"chmod 0755 /dev/freezer/frozen",
"chmod 0755 /dev/freezer/frozen/tasks",
"chmod 0755 /dev/freezer/thawed",
"chmod 0755 /dev/freezer/thawed/tasks",
"write /dev/freezer/frozen/freezer.state FROZEN",
"write /dev/freezer/thawed/freezer.state THAWED"
]
}, {
"name" : "boot",
"cmds" : [
"chown radio system /sys/power/wake_lock",
"chown radio system /sys/power/wake_unlock",
"chmod 0664 /sys/power/wakeup_count",
"start foundation"
]
}
],
"services" : [{
"name" : "foundation",
"path" : ["/system/bin/sa_main", "/system/profile/foundation.xml"],
"importance" : -20,
"uid" : "system",
"gid" : ["system"],
"caps" : ["SYS_PTRACE", "KILL"]
}
]
}

2.2 samgr_L2.cfg 用户程序框架子系统:启动samgr 服务

# foundation/distributedschedule/samgr/services/samgr/native/samgr_L2.cfg
{
"jobs" : [{
"name" : "init",
"cmds" : [
"mkdir /data/sadata_de",
"chmod 755 /data/sadata_de",
"chown system system /data/sadata_de",
"mkdir /data/sadata_de/samgr",
"chmod 755 /data/sadata_de/samgr",
"chown system system /data/sadata_de/samgr",
"start samgr"
]
}
],
"services" : [{
"name" : "samgr",
"path" : ["/system/bin/samgr"],
"uid" : "system",
"gid" : ["system"]
}
]
}

​init​​阶段的任务也不多,linux系统安装主要是挂载调试子系统,启动用户程序框架子系统​​samgr​​,

看起来启动过程中,大头应该在​​post-linux创建文件init​​中,harmonyos怎么读下篇文章我们来看下吧。