init - Arch Linux 中文维基

跳至內容

# init

出自 Arch Linux 中文维基

翻譯狀態：

- 本文（或部分內容）譯自 init，最近一次同步於 2022-03-25，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Arch boot process
- ConsoleKit

警告：Arch Linux 只提供對 systemd 的官方支持。[1]如使用其他 init 系統，在請求支持時請註明。

Init 是系統啟動時創建的第一個進程。它是一個守護進程，會一直運行到系統關閉。init 是其他所有進程的直接或間接祖先，並自動監護所有孤兒進程。內核按照硬編碼的文件名啟動它，如果內核不能啟動它，將會導致內核崩潰。init 的進程標識符（PID）通常是 1。

在系統啟動和關閉時，init 進程會啟動 init 腳本（或稱 rc）來保障基本功能。這包括掛載和卸載文件系統，以及啟動守護進程。進一步，有一個服務管理器提供對已啟動進程的主動控制，稱為進程監控。例如監測崩潰的進程並適時重啟。

這些元素加起來就成了 init 系統。某些 init 將服務管理器包含在 init 進程中，或是有緊密聯繫的 init 腳本。在下面，這類 init 將被稱為整合式的。其他的分類下的條目可能會相互依賴。

## 整合式 init

- anopa — 圍繞 s6 監視套件構建的 init 系統。

  https://jjacky.com/anopa/ || anopaAUR

- GNU Shepherd — 用 Guile 編寫的 init 系統。

  https://www.gnu.org/software/shepherd/ || shepherdAUR

- OpenRC — 基於依賴的 init 系統。

  https://www.gentoo.org/proj/en/base/openrc/ || openrcAUR openrc-arch-services-gitAUR

- systemd — 基於依賴的 init 系統，具備激進的並行化，使用 cgroups 提供進程監護，及依賴於給定掛載點或 dbus 服務的能力。

  https://freedesktop.org/wiki/Software/systemd/ || systemd包

## init

- BusyBox — 用於救援和嵌入式系統的工具。

  https://busybox.net/ || busybox包

- sinit — 基於 Rich Felker 所作最簡 init 的簡單init。

  https://core.suckless.org/sinit || sinitAUR

- SysVinit — 傳統的 system V init。

  https://savannah.nongnu.org/projects/sysvinit || sysvinitAUR

## init 腳本

- initscripts-fork — 另行維護的 Arch Linux 的 SysVinit 腳本分支。

  https://bitbucket.org/TZ86/initscripts-fork/overview || initscripts-forkAUR

- minirc — 為 BusyBox 設計的最簡 init 腳本。

  https://github.com/hut/minirc/ || minirc-gitAUR

- kisslinux-init — KISS Linux 的 init 框架。

  https://github.com/kisslinux/init || kisslinux-initAUR

## 服務管理器

- monit — monit是 Unix 和 Linux 系統的進程管理工具。monit 支持直接從命令行或是原生的 HTTP(S) 網絡伺服器查看系統狀態。

  https://mmonit.com/monit/ || monit包

- perp — 適用於 UNIX 的持久進程（服務）監管器和管理框架。

  http://b0llix.net/perp/ || perpAUR

- runit — UNIX init 框架，用於替代 SysVinit 和其他 init 框架。

  http://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 要求 init 進程是 systemd。因此，本地會話和其他功能不可用。

提示：有一個單獨版本的 logind。elogind-gitAUR [3]

設備權限

將用戶添加到相應的用戶組以允許設備訪問和重啟。應當先用 `id user` 檢查當前所屬的用戶組。 以下命令允許用戶訪問大多數設備：

    # usermod -a -G video,audio,power,disk,storage,optical,lp,scanner,input user

另可參見 systemd 之前的群組。

要創建 polkit 使用的組規則，參見跳過口令提示。

沒有 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

警告：替換 udev 並非必要，因為即使 systemd 不是 PID 1，systemd-udev 也能工作。某些替換比如 eudev 無法與 systemd包 共存，請確保在安裝之前啟動了另外的 init。

- eudev — eudev 是 Gentoo 項目開發的 udev 分支項目。需要與 OpenRC 配合設計和測試。

  Gentoo:eudev || eudevAUR

- mdev — 用於嵌入式系統的設備管理器。

  https://git.busybox.net/busybox/plain/docs/mdev.txt || busybox包

- smdev — smdev 是一個簡單的管理設備節點的程序。其基本與 mdev 兼容，但沒有後者的全部特性。

  https://git.suckless.org/smdev/ || smdevAUR

## 參見

分類：​

- 初始化

init
新增話題