首页

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)手册页中查看完整列表。以下是特别值得关注的几个选项:

  1. -c | –ifcrashed 当服务崩溃时运行指定的命令。

  2. -N | –ifnotstarted 当该服务当前未启动时运行指定的命令。

  3. -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