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 脚本 |
描述文件 |
并行启动服务 |
否 |
否 |
是 |
设置服务资源限制 |
否 |
否 |
是 |
支持服务隔离 |
否 |
否 |
是 |
集成日志 |
否 |
否 |
是 |