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 兼容,但沒有後者的全部特性。