init (简体中文)
Init 是系统启动时创建的第一个进程。它是一个守护进程,会一直运行到系统关闭。init 是其他所有进程的直接或间接祖先,并自动监护所有孤儿进程。内核按照硬编码的文件名启动它,如果内核不能启动它,将会导致内核崩溃。init 的进程标识符(PID)通常是 1。
在系统启动和关闭时,init 进程会启动 init 脚本(或称 rc)来保障基本功能。这包括挂载和卸载文件系统,以及启动守护进程。进一步,有一个服务管理器提供对已启动进程的主动控制,称为进程监控。例如监测崩溃的进程并适时重启。
这些元素加起来就成了 init 系统。某些 init 将服务管理器包含在 init 进程中,或是有紧密联系的 init 脚本。在下面,这类 init 将被称为整合式的。其他的分类下的条目可能会相互依赖。
整合式 init
- anopa — 围绕 s6 监视套件构建的 init 系统。
- GNU Shepherd — 用 Guile 编写的 init 系统。
- OpenRC (简体中文) — 基于依赖的 init 系统。
- systemd — 基于依赖的 init 系统,具备激进的并行化,使用 cgroups 提供进程监护,及依赖于给定挂载点或 dbus 服务的能力。
init
- BusyBox — 用于救援和嵌入式系统的工具。
- sinit — 基于 Rich Felker 所作最简 init 的简单init。
- SysVinit — 传统的 system V init。
init 脚本
- initscripts-fork — 另行维护的 Arch Linux 的 SysVinit 脚本分支。
- minirc — 为 BusyBox 设计的最简 init 脚本。
- kisslinux-init — KISS Linux 的 init 框架。
服务管理器
- monit (简体中文) — monit是 Unix 和 Linux 系统的进程管理工具。monit 支持直接从命令行或是原生的 HTTP(S) 网络服务器查看系统状态。
- 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 要求 init 进程是 systemd。因此,本地会话和其他功能不可用。
- 设备权限
将用户添加到相应的用户组以允许设备访问和重启。应当先用 id user
检查当前所属的用户组。
以下命令允许用户访问大多数设备:
# usermod -a -G video,audio,power,disk,storage,optical,lp,scanner,input user
另可参见 systemd 之前的群组。
- 没有 root 权限的 X
因为 Xorg.wrap
不检查 logind 是否活跃,Xorg 的根权限需要手动启用:
/etc/X11/Xwrapper.config
needs_root_rights = yes
- 电源管理
参见 pm-utilsAUR 和 acpid 以替换用 systemd 进行的电源管理。
定时任务
Arch 默认使用 timer 而非 cron。可在 archlinux-cronjobs 参看基本的 cron 任务。
D-Bus
dbus-daemon 的用户实例由 systemd 用户启动。[4]在需要桌面应用间通讯时,恢复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 起,可以在非 systemd 系统上用 PID 名称空间运行 systemd。这需要内核配置了 CONFIG_PID_NS
和CONFIG_NAMESPACES
。
PID 名称空间创建一个新的进程架构,从 PID 1 开始。另外,systemd 需要一个已经 chroot 的文件系统才能挂载。因此,你必须至少做一个绑定挂载,否则某些服务可能会报这样的错:
"Failed at step NAMESPACE spawning" due to "Invalid operation"
这是因为 systemd 尝试以 private
选项重新挂载根目录。
可以用 jchroot 设置一个有新 PID 名称空间的 chroot。
确保不要在 chroot 前挂载新根目录的 /proc
,否则 systemd 会检测到 chroot 环境。在 systemd 运行以后可以挂载。
替换 udev
- eudev — eudev 是 Gentoo 项目开发的 udev 分支项目。需要与 OpenRC 配合设计和测试。
- Gentoo:eudev || eudevAUR
- mdev — 用于嵌入式系统的设备管理器。
- smdev — smdev 是一个简单的管理设备节点的程序。其基本与 mdev 兼容,但没有后者的全部特性。