OpenRC
OpenRC是一个由Gentoo开发者维护的服务管理器。OpenRC是基于依赖关系的,通常使用系统提供的init程序SysVinit。
安装[编辑 | 编辑源代码]
关于init组件的细节,请查阅Init。
安装openrcAUR包。在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
[2]配置。
编辑/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的行为(请查阅[3]如果您想在启动时启用配置文件链接,需要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配置。[4]这包括从Arch中删除的/etc/sysctl.conf
。[5]
要放置丢失文件的错误,请创建文件:
# 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的包。