31 选择初始化管理器

Poky 发行版默认使用 SysVinit 作为 初始化管理器。此外还支持更简单的 BusyBox init,以及 systemd。systemd 可以完全替代 init,支持并行启动服务、 减少 Shell 开销、增强安全性、限制服务资源等,许多发行版都使用它。

SysVinit 和 BusyBox init 将系统组件视为服务,以保存在 /etc/init.d/ 目录中的 Shell 脚本维护这些服务。

SysVinit 比 BusyBox init 更复杂,将服务组织到不同运行级别。在 /etc/rcN.d/ 目录中建立服务链接来维护这种组织方式,其中 N/ 可以是 "S"、"0"、"1"、"2"、"3"、"4"、"5" 或 "6"。

备注

每个运行级别依赖前一个运行级别,这种依赖关系使服务能够正常工作。

SysVinit 和 BusyBox init 都通过 /etc/inittab 文件配置,语法非常相似, 不过 BusyBox init 的功能更加有限。

相比之下,systemd 将组件视为单元(unit)。单元比服务的概念更广,包含多种 实体类型,Service 只是其中之一。SysVinit 中的运行级别对应 systemd 的 target,而 target 也是受支持的单元类型。

使用 SysVinit 或 BusyBox init 时,初始化过程中按顺序逐个加载服务,不支持 并行执行。systemd 则并行启动服务,这可能影响某个服务的启动性能。不过, systemd 默认提供的服务也更多,因此会增加系统整体启动时间。由于具有多个 组件并引入额外依赖,systemd 还会明显增加系统体积。

BusyBox init 则是最简单、最轻量的方案,并带有 BusyBox mdev 设备管理器。 mdev 比 SysVinit 和 systemd 所用的 udev 更轻量。

设备管理器的更多信息见 “选择设备管理器” 一章。

31 使用 SysVinit 和 udev

SysVinit 与 udev 设备管理器的组合是 Poky 的默认设置,对应配置为:

INIT_MANAGER = "sysvinit"

31 使用 BusyBox init 和 BusyBox mdev

对于小型根文件系统,BusyBox init 与 BusyBox mdev 是最简单、最轻量的方案, 只需要大多数系统本来就有的 BusyBox:

INIT_MANAGER = "mdev-busybox"

31 使用 systemd

最后一种选择是将 systemd 与 udev 设备管理器配合使用。这是功能最强、用途 最广的方案,尤其适合较复杂的系统:

INIT_MANAGER = "systemd"

这会启用 systemd,并从镜像中移除 sysvinit 组件。具体行为见 meta/conf/distro/include/init-manager-systemd.inc。

31 从目标命令行控制 systemd

以下是在目标设备命令行中控制 systemd 的快速参考。大多数交互通过 systemctl 和 journalctl 完成,无需打开或修改文件:

  • systemctl status:显示所有服务的状态

  • systemctl status <service>:显示单个服务的状态

  • systemctl [start|stop] <service>:启动或停止服务

  • systemctl [enable|disable] <service>:启用或禁用服务开机启动

  • systemctl list-units:列出所有可用单元

  • journalctl -a:显示所有服务的全部日志

  • journalctl -f:显示最新日志条目,并持续输出新增日志

  • journalctl -u:仅显示指定服务的日志

31 使用 systemd-journald 而不使用传统 syslog 守护进程

可能与直觉不同,systemd-journald 并不是 syslog 运行时或提供者。要仅用 systemd-journald 记录日志,正确做法是在发行版配置文件中设置以下变量, 彻底禁用 syslog:

VIRTUAL-RUNTIME_syslog = ""
VIRTUAL-RUNTIME_base-utils-syslog = ""

这样可避免默认引入 rsyslog 或 busybox-syslog,只保留 systemd-journald。

31 概括

Yocto Project 支持三种初始化管理器,其复杂度和功能依次增加:

BusyBox init

SysVinit

systemd

体积

小

小

大 [1]

复杂度

低

中

高

支持启动配置

否

是("runlevels")

是("targets")

服务定义方式

Shell 脚本

Shell 脚本

描述文件

并行启动服务

否

否

是

设置服务资源限制

否

否

是

支持服务隔离

否

否

是

集成日志

否

否

是