跳转至内容

init

来自 ArchWiki

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

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

Init 脚本(或 rc)由 init 进程启动,以确保系统启动和关闭时的基本功能。这包括 文件系统 的(卸)载以及 守护进程 的启动。服务管理器 则更进一步,提供对已启动进程的动态控制,或称为 进程监督 (process supervision)。例如,监控崩溃并相应地重启进程。

这些组件共同构成了 init 系统。一些 init 将服务管理器包含在 init 进程中,或者其 init 脚本与服务管理器紧密相关。这些 init 在下文被称为集成式 (integrated),尽管不同类别中的条目之间可能存在显式的依赖关系。

Init(集成式)

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

Init

  • BusyBox — 用于救援和嵌入式系统的工具集。
https://busybox.net/ || busybox
  • sinit — 简单的 init,最初基于 Rich Felker 的极简 init。
https://core.suckless.org/sinit || sinitAUR

Init 脚本

  • 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 组。要创建用于 Polkit 的组规则,请参阅 Polkit#绕过密码提示

Rootless X

本文或本章节的准确性存在争议。

原因: Void Linux 的用户即使没有 logind 也能运行 rootless X,我们应该推广这一点,而不是建议以 root 身份运行 X。(在 Talk:Init#rootless X void workaround 中讨论)

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

电源 management

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

定时任务

Arch 默认使用 timer 文件而不是 cron

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 根文件系统。因此,你至少得做一个绑定挂载 (bind mount),否则某些服务将失败,提示为

"Failed at step NAMESPACE spawning" due to "Invalid operation" 

因为 systemd 会尝试使用 private 选项重新挂载根目录。

要设置一个具有新 PID 命名空间的 chroot,可以使用 jchroot。[6] [7]。确保在 chroot 之前不要在新根目录下挂载 /proc,否则 systemd 将检测到 chroot 环境。你可以在 systemd 运行后将其挂载。

替换 udev

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

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.