init
Init 是系统启动时启动的第一个进程。它是一个守护进程,会持续运行直到系统关机。Init 是所有其他进程的直接或间接祖先,并自动接管所有孤儿进程。它由内核通过硬编码的文件名启动;如果内核无法启动它,将导致 内核恐慌 (Kernel panic)。Init 通常被分配 进程标识符 (PID) 1。
Init 脚本(或 rc)由 init 进程启动,以确保系统启动和关闭时的基本功能。这包括 文件系统 的(卸)载以及 守护进程 的启动。服务管理器 则更进一步,提供对已启动进程的动态控制,或称为 进程监督 (process supervision)。例如,监控崩溃并相应地重启进程。
这些组件共同构成了 init 系统。一些 init 将服务管理器包含在 init 进程中,或者其 init 脚本与服务管理器紧密相关。这些 init 在下文被称为集成式 (integrated),尽管不同类别中的条目之间可能存在显式的依赖关系。
Init(集成式)
- anopa — 基于 s6 监督套件构建的 Init 系统。
- GNU Shepherd — 使用 Guile 编写的 Init 系统。
- OpenRC — 基于依赖关系的 Init 系统。
- systemd — 基于依赖关系的 Init 系统,具有强力并行化、使用 cgroups 的进程监督,以及能够依赖给定挂载点或 dbus 服务的能力。
Init
- BusyBox — 用于救援和嵌入式系统的工具集。
- sinit — 简单的 init,最初基于 Rich Felker 的极简 init。
Init 脚本
- kisslinux-init — KISS Linux 的 Init 框架。
服务管理器
- Monit — Monit 是一个用于 Unix 和 Linux 的进程监督工具。通过 monit,可以直接从命令行或通过原生的 HTTP(S) Web 服务器查看系统状态。
- perp — 用于 UNIX 的持久进程(服务)监督和管理框架。
- http://b0llix.net/perp/ || perpAUR
- runit — 带有服务监督的 UNIX init 方案,用于替代 SysVinit 和其他 init 方案。
- s6 — 为 UNIX 设计的一套小型程序,旨在提供类似于 daemontools 和 runit 的服务监督。
- Supervisor — 一个允许用户在类 UNIX 操作系统上监控和控制进程的系统。
配置
迁移运行中的服务
要在新的 init 下运行守护进程,请保存一份运行中的守护进程列表
$ systemctl list-units --state=running "*.service" > daemons.list
logind
logind 要求 systemd 必须是 init 进程。[3] 因此,本地会话 和其他功能将无法使用。
设备权限
将用户添加到相应的 用户组 以获取设备访问权限并重启。应首先使用 id user 检查当前的组员身份。
# usermod -a -G video,audio,power,disk,storage,optical,lp,scanner,input user
另请参阅 用户和组#Pre-systemd 组。要创建用于 Polkit 的组规则,请参阅 Polkit#绕过密码提示。
Rootless X
由于 Xorg.wrap 不检查 logind 是否处于活动状态 [4],Xorg 的 root 权限需要手动启用。
电源 management
请参阅 pm-utilsAUR 和 acpid 以替换 使用 systemd 的电源管理。
定时任务
Dbus
dbus-daemon 的用户实例由 systemd/User 启动 [5]。当桌面应用程序之间需要 IPC 时,请还原 30-dbus.sh
/etc/X11/xinit/xinitrc.d/30-dbus.sh
#!/bin/bash
# launches a session dbus instance
if [ -z "${DBUS_SESSION_BUS_ADDRESS-}" ] && type dbus-launch >/dev/null; then
eval $(dbus-launch --sh-syntax --exit-with-session)
fi
技巧与提示
systemd-nspawn
systemd-nspawn 是一个为 systemd 系统设计的工具。不过,自 Linux 2.6.19 起,可以通过使用 PID 命名空间在非 systemd 系统上运行 systemd。为此,内核需要配置 CONFIG_PID_NS 和 CONFIG_NAMESPACES。
PID 命名空间创建了一个从 PID 1 开始的新进程层级。此外,systemd 要求挂载一个 chrooted 根文件系统。因此,你至少得做一个绑定挂载 (bind mount),否则某些服务将失败,提示为
"Failed at step NAMESPACE spawning" due to "Invalid operation"
因为 systemd 会尝试使用 private 选项重新挂载根目录。
要设置一个具有新 PID 命名空间的 chroot,可以使用 jchroot。[6] [7]。确保在 chroot 之前不要在新根目录下挂载 /proc,否则 systemd 将检测到 chroot 环境。你可以在 systemd 运行后将其挂载。
替换 udev
- mdev — 用于嵌入式系统的设备管理器。
- smdev — smdev 是一个管理设备节点的简单程序。它与 mdev 大体兼容,但没有其全部功能。