init

出自 ArchWiki

警告: Arch Linux 仅官方支持 systemd[1] 当使用不同的 init 系统时,请在支持请求中提及。

Init 是系统启动期间启动的第一个进程。它是一个守护进程,持续运行直到系统关闭。Init 是所有其他进程的直接或间接祖先,并自动接管所有孤立进程。它由内核使用硬编码的文件名启动;如果内核无法启动它,将导致 panic。Init 通常被分配 进程标识符 1。

init脚本(或 rc)由 init 进程启动,以保证系统启动和关闭时的基本功能。这包括(卸载)文件系统 和启动 守护进程服务管理器 通过提供对启动进程或 进程监管 的主动控制,使之更进一步。一个例子是监控崩溃并相应地重启进程。

这些组件结合起来构成 init系统。一些 inits 将服务管理器包含在 init 进程中,或者使 init 脚本与它们密切相关。这些 inits 在下面被称为集成的,尽管不同类别中的条目可能明确地相互依赖。

Inits(集成)

  • anopa — 围绕 s6 监管套件构建的 Init 系统。
https://jjacky.com/anopa/ || anopaAUR
  • GNU Shepherd — 用 Guile 编写的 Init 系统。
https://gnu.ac.cn/software/shepherd/ || shepherdAUR
  • OpenRC — 基于依赖的 init 系统。
https://gentoolinux.cn/proj/en/base/openrc/ || openrcAUR openrc-arch-services-gitAUR
  • systemd — 基于依赖的 init 系统,具有积极的并行化、使用 cgroups 的进程监管以及依赖于给定挂载点或 dbus 服务的能力。
https://systemd.io/ || systemd

Inits

  • BusyBox — 用于救援和嵌入式系统的实用工具。
https://busybox.net/ || busybox
  • sinit — 最初基于 Rich Felker 的最小 init 的简单 init。
https://core.suckless.org/sinit || sinitAUR
https://savannah.nongnu.org/projects/sysvinit || sysvinitAUR

Init 脚本

  • initscripts-fork — Arch Linux 中 SysVinit 脚本的维护分支。
https://bitbucket.org/TZ86/initscripts-fork/overview || initscripts-forkAUR
  • kisslinux-init — KISS Linux 的 Init 框架。
https://github.com/kisslinux/init || kisslinux-initAUR

服务管理器

  • Monit — Monit 是用于 Unix 和 Linux 的进程监管工具。使用 Monit,可以直接从命令行或通过原生 HTTP(S) Web 服务器查看系统状态。
https://mmonit.com/monit/ || monit
  • perp — 用于 UNIX 的持久进程(服务)监管器和管理框架。
http://b0llix.net/perp/ || perpAUR
  • runit — UNIX init 方案,具有服务监管,是 SysVinit 和其他 init 方案的替代品。
https://smarden.org/runit/ || busybox
  • s6 — 用于 UNIX 的小型程序套件,旨在允许 daemontools 和 runit 风格的服务监管。
https://skarnet.org/software/s6/ || s6AUR
  • Supervisor — 一种允许用户监控和控制类 UNIX 操作系统上的进程的系统。
https://supervisord.org/ || supervisor

配置

迁移运行中的服务

要在新的 init 下运行守护进程,请保存正在运行的守护进程列表

$ systemctl list-units --state=running "*.service" > daemons.list

并相应地配置 #Init 脚本。另请参阅 [2]

注意: systemd-tmpfiles(8)内核模块sysctl 也可能需要配置。

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

此文章或章节的事实准确性存在争议。

原因: Void Linux 上的人们即使没有 logind 也可以让 X 无根运行,我们应该推广这一点,而不是建议以 root 身份运行 X。(在 Talk:Init 中讨论)

由于 Xorg.wrap 不检查 logind 是否处于活动状态 [4],因此需要手动启用 Xorg 的 root 权限。

电源管理

请参阅 pm-utilsAURacpid 以替换 使用 systemd 进行电源管理

计划任务

Arch 默认使用 timer 文件而不是 cron。 有关基本的 cron 作业,请参阅 archlinux-cronjobs

Dbus

此文章或章节需要扩充。

原因: 解释性章节已通过 458617 删除(在 Talk:Init 中讨论)

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_NSCONFIG_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

警告: 不需要替换 udev,因为 systemd-udev 在没有 systemd 作为 PID 1 的情况下也能正常工作。某些替换项也可能无法与 systemd 共存——安装它们之前,请确保启动了替代的 init。
  • mdev — 用于嵌入式系统的设备管理器。
https://git.busybox.net/busybox/plain/docs/mdev.txt || busybox
  • smdev — smdev 是一个用于管理设备节点的简单程序。它主要与 mdev 兼容,但不具备其所有功能。
https://git.suckless.org/smdev/ || smdevAUR

参见