OpenRC是一個由Gentoo開發者維護的服務管理器。OpenRC是基於依賴關係的,通常使用系統提供的init程序SysVinit。
安裝
OpenRC和隨附的軟體包在AUR中提供。關於init組件的細節,請查閱Init。
安裝openrcAUR或openrc-gitAUR包。在0.25版本之後,OpenRC在/usr/bin/openrc-init
提供它自己的init。
可選地,您可以使用其他init,例如busybox包。請注意,當使用openrc-init
時,它必須和openrc-shutdown
成對使用。並且不要使用來自其他包的shutdown
和reboot
命令,否則您將會遇到錯誤。
一組基本的服務文件可以從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 | 系統日誌 |
如果有需要,通過創建到/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=你也可以通過啟用相應的服務來使用NetworkManager、dhcpcd或netcfgAUR。netcfg模仿netctl的行為(請查閱[2]如果您想在啟動時啟用配置文件連結,需要wpa_actiond
)。請查閱netcfg功能。
啟動日誌
要啟用啟動日誌記錄,將/etc/openrc/rc.conf
中rc_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
。
使用
您可以忽略.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"
禁用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。)