init
Init 是系统启动期间启动的第一个进程。它是一个守护进程,持续运行直到系统关闭。Init 是所有其他进程的直接或间接祖先,并自动接管所有孤立进程。它由内核使用硬编码的文件名启动;如果内核无法启动它,将导致 panic。Init 通常被分配 进程标识符 1。
init脚本(或 rc)由 init 进程启动,以保证系统启动和关闭时的基本功能。这包括(卸载)文件系统 和启动 守护进程。服务管理器 通过提供对启动进程或 进程监管 的主动控制,使之更进一步。一个例子是监控崩溃并相应地重启进程。
这些组件结合起来构成 init系统。一些 inits 将服务管理器包含在 init 进程中,或者使 init 脚本与它们密切相关。这些 inits 在下面被称为集成的,尽管不同类别中的条目可能明确地相互依赖。
Inits(集成)
- anopa — 围绕 s6 监管套件构建的 Init 系统。
- GNU Shepherd — 用 Guile 编写的 Init 系统。
- OpenRC — 基于依赖的 init 系统。
- systemd — 基于依赖的 init 系统,具有积极的并行化、使用 cgroups 的进程监管以及依赖于给定挂载点或 dbus 服务的能力。
Inits
- BusyBox — 用于救援和嵌入式系统的实用工具。
- sinit — 最初基于 Rich Felker 的最小 init 的简单 init。
- SysVinit — 传统的 System V init。
Init 脚本
- initscripts-fork — Arch Linux 中 SysVinit 脚本的维护分支。
- 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 groups。要创建用于 Polkit 的组规则,请参阅 Polkit#Bypass password prompt。
无根 X
由于 Xorg.wrap
不检查 logind 是否处于活动状态 [4],因此需要手动启用 Xorg 的 root 权限。
电源管理
请参阅 pm-utilsAUR 和 acpid 以替换 使用 systemd 进行电源管理。
计划任务
Arch 默认使用 timer 文件而不是 cron。 有关基本的 cron 作业,请参阅 archlinux-cronjobs。
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 根文件系统。因此,您至少必须进行绑定挂载,否则某些服务将失败,并显示
"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 兼容,但不具备其所有功能。