出自 Arch Linux 中文维基
警告: Arch Linux只為systemd提供官方支持。請在幫助請求中提及使用OpenRC。

OpenRC是一個由Gentoo開發者維護的服務管理器。OpenRC是基於依賴關係的,通常使用系統提供的init程序SysVinit

安裝

OpenRC和隨附的軟體包在AUR中提供。關於init組件的細節,請查閱Init

安裝openrcAURopenrc-gitAUR包。在0.25版本之後,OpenRC在/usr/bin/openrc-init提供它自己的init。

可選地,您可以使用其他init,例如busybox。請注意,當使用openrc-init時,它必須和openrc-shutdown成對使用。並且不要使用來自其他包的shutdownreboot命令,否則您將會遇到錯誤。

一組基本的服務文件可以從openrc-arch-services-gitAUR包獲得。其他包可能有在此包之外提供的服務文件,建議在AUR上搜索。

為了保持和initscripts-forkAUR的兼容性,配置文件已經在/etc/openrc/中安裝。

啟動

kernel parameters中設置init選項來使用OpenRC啟動。


要使用OpenRC內建的init,設置init=/usr/bin/openrc-init

請注意,當使用openrc-init時,/etc/inittab文件將不會被使用。

配置

/etc/openrc/conf.d目錄和/etc/openrc/rc.d文件被用於配置。

關於配置OpenRC的一般信息,請查看:

關於從systemd遷移的說明,請查看Init#Configuration

服務

通過root身份運行rc-update add service_name runlevel來啟動OpenRC服務。建議啟動以下服務:

服務名 Runlevel 描述
udev sysinit 設備熱插拔
alsa default ALSA state
acpid default ACPI事件
dbus default 消息總線
dcron default 定時任務
syslog-ng default 系統日誌
警告: 如果在您的kernel parameters中使用init=/usr/bin/openrc-init,您將需要手動啟用getty服務,否則您將無法使用如該文檔中所述的交互式TTY

如果有需要,通過創建到/etc/openrc/init.d/getty的符號連結來為每個getty創建服務。例如為/dev/tty1

# ln -s /etc/openrc/init.d/agetty{,.tty1}
# rc-update add agetty.tty1 default

為了防止PAM在登錄後嘗試向systemd註冊(這可能會引發問題, 可以安全地刪除或注釋/etc/pam.d/system-auth中提到systemd的行。

另請參閱Gentoo:Systemd#Native services

網絡

網絡通過newnet [1]配置。

編輯/etc/openrc/conf.d/network;ip、(iproute2)和ifconfig、(net-tools)命令都被支持。下面是一個使用ip的例子:

ip_eth0="192.168.1.2/24"
defaultiproute="via 192.168.1.1"
ifup_eth0="ip link set \$int mtu 1500"

網絡服務被默認添加到引導運行級別(boot runlevel),所以不需要採取進一步操作。關於一般網絡信息,請參閱Network configuration

{{Note|1=你也可以通過啟用相應的服務來使用NetworkManagerdhcpcdnetcfgAURnetcfg模仿netctl的行為(請查閱[2]如果您想在啟動時啟用配置文件連結,需要wpa_actiond)。請查閱netcfg功能

啟動日誌

要啟用啟動日誌記錄,將/etc/openrc/rc.confrc_logger="YES"一行去注釋。在啟用時,啟動日誌存儲在/var/log/rc.log

主機名

OpenRC通過/etc/openrc/conf.d/hostname來修改主機名。它看起來像這樣:

#設置這台電腦的主機名
hostname="myhostname"

內核模塊

OpenRC使用/etc/openrc/conf.d/modules而不是/etc/modules-load.d。例如:

/etc/openrc/conf.d/modules
#您應該查閱內核文檔和配置獲取模塊及其選項的列表

modules="vboxdrv acpi_cpufreq"

本地化

鍵盤布局可以通過/etc/openrc/conf.d/keymaps/etc/openrc/conf.d/consolefont來配置。您也可以通過/etc/locale.conf文件,其來源於/etc/profile.d/locale.sh

使用

本節對systemd以及其他init進行比較。

您可以忽略.service.target擴展,尤其是在編輯kernel parameters時。

systemd SysVinit OpenRC 描述
systemctl list-units rc.d list rc-status 列出所有正在運行的服務的狀態
systemctl --failed rc-status --crashed 檢查所有失敗的服務
systemctl --all rc-update -v show 顯示所有可用服務
systemctl (start, stop, restart, status) daemon.service rc.d (start, stop, restart) daemon rc-service daemon (start, stop, restart, status) 改變服務狀態
systemctl (enable, disable) daemon.service chkconfig daemon (on, off) rc-update (add, del) daemon 啟用或停用服務
systemctl daemon-reload chkconfig daemon --add 創建或修改配置

提示和技巧

靜默啟動

要隱藏OpenRC的啟動信息,您可以編輯/etc/inittab,將--quiet添加到每個OpenRC命令。有關更多信息,請查看$ openrc -h

故障排除

卸載/tmp時出錯

當關機時,您可能會得到這樣的信息:

* Unmounting /tmp ... 
* in use but fuser finds nothing [ !! ]

可以通過向/etc/openrc/conf.d/localmount添加如下內容解決:

no_umounts="/tmp"
注意: 只有將/tmp安裝為tmpfs時才會出現此問題。

禁用IPv6無效

一種選擇是向/etc/openrc/sysctl.d下一個以.conf結尾的文件添加:

# 禁用IPv6
net.ipv6.conf.all.disable_ipv6 = 1

在關機期間以只讀模式重新掛載根目錄失敗

如果發生上述情況,請編輯/etc/openrc/init.d/mount-ro,找到下面一行:

# Flush all pending disk writes now
sync; sync

在其之後放入:

telinit u

找不到/etc/sysctl.conf

默認情況下,調用sysctl --system來加載sysctl配置。[3]這包括從Arch中刪除的/etc/sysctl.conf[4]

要放置丟失文件的錯誤,請創建文件:

# touch /etc/sysctl.conf

opentmpfiles-setup無法啟動

在啟動OpenRC時,您可能會看到如下行:

* Setting up tmpfiles.d entries ...
chattr: Operation not supported while setting flags on /var/log/journal
chattr: No such file or directory while trying to stat /var/log/journal/%m
chattr: Operation not supported while setting flags on /var/log/journal/remote
[ !! ]
ERROR: opentmpfiles-setup failed to start

這是由於/usr/lib/tmpfiles.d/journal-nocow.conf使用的選項,只有當journal位於btrfs上時才有效。

請查閱https://github.com/OpenRC/opentmpfiles/issues/2來獲取詳細信息。

一種解決方法是創建一個空的/etc/tmpfiles.d/journal-nocow.conf來覆蓋這些設置。

恢復到systemd

在大多數情況下,恢復到systemd應該很簡單。它本質上是遷移到OpenRC的逆向,注意以下幾點:

  • 刪除或以其他方式編輯內核命令行上的init=參數。
  • 用等價的包替換OpenRC定製的或no-systemd的包。(例如使用dbus替換dbus-nosystemdAUR。)

另請參閱