OpenRC #
OpenRC是一个基于依赖关系的初始化系统,它与系统提供的初始化程序协同工作,通常该程序位为/sbin/init
。
OpenRC负责管理计算机的各项服务的启动和关闭操作。
OpenRC常规用法 #
OpenRC服务操作 #
运行态服务操作 #
你可以使用 rc-service
命令在正在运行的系统上对服务进行操作。你可以够启动、停止并检查给定服务的状态,以及执行其他相关操作。请查看以下基本示例:
# 停止networking服务
rc-service networking stop
# 启动sshd服务
rc-service sshd start
# 查看chronyd服务状态
rc-service chronyd status
rc - service
还支持一些特定选项,这些选项主要用于脚本编写。你可以在rc - service(8)
手册页中查看完整列表。以下是特别值得关注的几个选项:
-
-c | –ifcrashed 当服务崩溃时运行指定的命令。
-
-N | –ifnotstarted 当该服务当前未启动时运行指定的命令。
-
-s | –ifstarted 当服务当前处于已启动状态时,运行指定的命令。
注 服务可能会定义一些可以使用的额外命令。关于这方面的更多内容,请查看 OpenRC自定义服务命令部分。
开机时的服务操作 #
OpenRC 在一个名为“运行级别(runlevels)”的系统下运行。关于这方面的更多内容,请查看
切换运行级别和
OpenRC自定义运行级别部分。启用一项服务意味着将其置于某个运行级别中,通常是会自动加载的运行级别(但不一定非得如此!)。禁用一项服务则需要将它从一个或多个运行级别中移除。这些操作全部通过rc-update
程序来完成,该程序会更新各种运行级别。rc-update
使用方式如下:
# 查看当前服务的运行级别,同时会显示无运行级别的服务
rc-update show -v
# 将sshd服务添加到默认运行级别
rc-update add sshd default
# 若不指定运行级别,将使用当前运行级别添加服务
rc-update add sshd
# 从当前运行级别中移除sshd服务
rc-update delete sshd
# 从所有运行级别中移除chronyd服务
rc-update delete chronyd -a
OpenRC服务配置 #
各种服务可能需要额外的配置。大多数服务在 /etc
目录下会有专门的配置文件——你可以查看特定服务的文档以获取更多详细信息。然而,有些服务在启动过程中需要进行配置,例如在首次启动时向二进制文件传递一个参数。这可以在 /etc/conf.d
目录中,以相关服务的名称创建文件来实现。例如,对于一个名为base
的服务,其配置文件将是 /etc/conf.d/base
。
OpenRC系统状态 #
rc-status
工具可以种快速查看系统服务当前状态。默认情况下,它会列出当前运行级别的所有服务。你可以通过指定运行级别来选择不同的运行级别,例如,rc-status boot
将列出boot
运行级别中的所有服务。它还接受各种选项来改变其功能。完整的选项列表可在 rc-status(8)
手册页中找到。以下是一些比较常用的选项:
-
-c
或--crashed
: 显示所有崩溃服务的列表。 -
-l
或--list
: 列出所有可用的运行级别。 -
-s
或--servicelist
: 显示所有服务的列表。
OpenRC高级用法 #
OpenRC自定义运行级别 #
创建运行级别 #
大多数用户仅使用默认运行级别就已足够。而其他一些用户则会有更多需求。一个运行级别实际上就是/etc/runlevels
目录下的一个目录,并且一个已启用的服务是指向init.d
文件的符号链接。
例如,将sshd
服务添加到默认运行级别,就是在/etc/runlevels/default
目录中创建一个指向/etc/init.d/sshd
的符号链接。因此,创建一个新的运行级别需要在 /etc/runlevels
目录下创建一个新的目录。
运行级别堆叠 #
大多数情况下,当你切换到office
运行级别时,并不希望关闭所有的default
下的服务。运行级别的 继承 是通过运行级别堆叠来实现的。如果你在rc-update
命令中使用-s
选项,实际上可以将一个运行级别添加到另一个运行级别中。
例如,如果你想要创建一个office
运行级别,它与default
运行级别相同,并将myvpn
服务添加至office
,你可以按以下步骤进行设置:
# 创建新的运行级别目录
mkdir /etc/runlevels/office
# 将default运行级别堆叠到office运行级别
rc-update -s add default office
# 将myvpn服务添加到office运行级别
rc-update add myvpn office
切换运行级别 #
一旦你创建了想要切换到的自定义运行级别,就可以使用openrc
命令进行切换。按照上述示例,你可以使用openrc office
切换到新的运行级别,使用openrc default
切换回默认运行级别。
OpenRC系统配置 #
OpenRC的系统范围配置在/etc/rc.conf
中。
OpenRC多服务 #
在某些情况下,你可能希望同一段代码在不同的情境下执行不同的操作。例如,通常情况下,不同实例的 agetty
之间的区别仅仅在于它们所运行的终端(tty)不同。在这些情形中,你可以使用符号链接来管理动态的配置差异。
以 agetty
为例,它通过计算 ${RC_SVCNAME#*.}
来确定要在哪个端口(终端)上运行。这意味着如果你的服务名称是 agetty.foo
,那么端口变量的值就会是 “foo”。使用这种方式的预期做法是将 “基础” 服务(agetty
)符号链接到所需的目标(agetty.foo
)。
这种机制还允许你为该服务指定自定义配置,想要了解更多详细信息,请参阅 扩展的conf.d文件名部分。
OpenRC自定义服务命令 #
除了“启动(start)”、“停止(stop)”和“查看状态(status)”之外,可能还存在其他可用的命令。一个常见的例子是 iptables
使用的“保存(save)”命令。这些自定义命令的使用方式与内置命令的使用方式相同。你可以查看 init.d
脚本中各种以 extra*commands
命名的变量,这些变量会列出可用的自定义命令。
extra_started_commands
是一些额外的命令,这些命令只有在服务已启动的状态下才有效。类似的逻辑也适用于其他相关的(额外命令变量所定义的命令)情况。
扩展的conf.d文件名 #
总共有四个文件可能会在服务的配置中发挥作用。假设 base
代表基础服务的名称,ext
是扩展名,runlevel
是它所处的运行级别。在这些条件下,涉及的文件如下:
-
/etc/conf.d/base.runlevel: 当服务的完整名称与基础服务名称不同时,OpenRC 会尝试加载此文件。
-
/etc/conf.d/base: 如果 OpenRC 尝试加载
/etc/conf.d/base.runlevel
失败,它将尝试加载此文件。 -
/etc/conf.d/base.ext.runlevel: OpenRC 总是会尝试加载此文件,但只会在上述两个文件的加载过程之后进行。
-
/etc/conf.d/base.ext: 如果加载
/etc/conf.d/base.ext.runlevel
失败,OpenRC 将尝试加载此文件。
大多数情况下,OpenRC 会首先加载 /etc/conf.d/base
,然后将 /etc/conf.d/base.ext
的配置覆盖在其之上。
https://github.com/OpenRC/openrc
https://docs.alpinelinux.org/user-handbook/0.1a/Working/openrc.html