我们有基于 BBB 的定制 Linux 板,运行 Linux 3.12。
我们当前使用 SysV init 进行引导。据我所知,启动按以下顺序发生:
- ROM 代码根据引导引脚配置查找引导设备。
- ROM 代码将第一阶段引导加载程序(SPL/X-loader)加载到内部 SRAM 并对其进行控制。
- SPL 会像 DDR 一样进行一些初始化,然后将 U-Boot 加载到 RAM。
- U-Boot 执行其他外设初始化,即 NAND/eMMC/以太网并加载内核+dtb。
- 内核执行初始化,根据 dtb 配置不同的硬件/外设并初始化所有驱动程序。
- 内核运行第一个进程,即 init (
/sbin/init
在我们的例子中,但可以在内核命令行参数中设置)。 - 基于inittab(配置文件)的init应用程序运行inittab文件中指定的启动脚本,例如
::sysinit:/etc/init.d/rcS
- 这
/etc/init.d/rcS
将运行文件夹中放置的所有初始化脚本/etc/init.d/
。
这就是主板通过 SysV init 启动的方式。 (至少这是我的理解,如果有错误的地方请指正。)
现在在某个时刻我们想要评估 systemd 引导是如何发生的。我们必须进行 POC 并查看系统启动和流程维护的任何改进或降级。
我们知道一些基础知识:systemd 在 cgroup 上工作,并且可以并行启动进程,但像 monit 一样处理进程。
然而我们不知道 systemd 的实际启动过程。
当使用 systemd 而不是 System 5 init 时,BeagleBoneBlack Linux 的引导过程是怎样的?它与我上面概述的现有启动过程有何不同?
答案1
它的工作原理完全相同,只是 systemd 的 init 二进制文件不使用 inittab 或 rcS 脚本;相反,它使用不同的逻辑来决定如何启动守护进程。
然而,它的核心部分仍然是相同的。
如果你想要更多,你就必须更具体......