使用 OpenRC

OpenRC 是 alpine 中使用的 init 系统。init 系统管理服务的启动和关闭以及计算机的启动和关机。

在本节中,使用了实用程序的规范名称。例如,rc-service 而不是 service。对于许多这些,传统的名称(例如 service)也可用,但并非所有都是这种情况。如有疑问,请使用规范名称,如本文档所示。

正常用法

操作服务

运行时服务操作

您可以使用 rc-service 命令在运行的系统上操作服务。这允许您启动、停止和检查给定服务的状态,以及其他操作。请参阅以下基本示例

rc-service networking stop (1)
rc-service sshd start (2)
rc-service chronyd status (3)
1 停止网络服务。
2 启动 sshd 服务。
3 查看 chronyd 服务的状态。

rc-service 还支持一些标志,这些标志主要用于脚本编写。您可以在 rc-service(8) 手册页中查看完整列表。特别感兴趣的是以下内容

-c | --ifcrashed

仅当服务崩溃时才运行指定的命令。

-N | --ifnotstarted

仅当服务当前未启动时才运行指定的命令。

-s | --ifstarted

仅当服务当前已启动时才运行指定的命令。

服务可以定义您可以使用的其他命令。有关更多信息,请参阅 自定义服务命令

启动时服务操作

OpenRC 在名为“运行级别”的系统下运行。有关更多信息,请参阅 切换运行级别自定义运行级别。启用服务意味着将其放入运行级别,通常是自动加载的运行级别(但不一定!)。禁用服务涉及将其从一个或多个运行级别中移除。这一切都使用 rc-update 实用程序完成,该实用程序更新各种运行级别。它可以这样使用

rc-update show -v (1)
rc-update add sshd default (2)
rc-update add sshd (3)
rc-update delete sshd (4)
rc-update delete chronyd -a (5)
1 查看任何运行级别中的当前服务。-v 标志还将显示未在任何运行级别中的各种服务。
2 将 sshd 服务添加到默认运行级别。
3 如果您未指定运行级别,则将使用您当前的运行级别。这相当于正常操作下的第二个示例。
4 从当前运行级别中移除 sshd 服务,与添加操作相同。
5 从所有运行级别中移除 chronyd 服务。

配置服务

各种服务可能需要额外的配置。大多数服务在 /etc 中都有专用的配置文件 - 您可以查看特定服务的文档以获取更多详细信息。但是,某些服务需要在启动过程中应用配置 - 例如在首次启动时向二进制文件传递标志。这可以在 /etc/conf.d 目录中完成,以相关服务的名称命名。例如,对于名为“base”的服务,配置文件将是 /etc/conf.d/base

系统状态

rc-status 实用程序是查看系统服务当前状态的快速方法。默认情况下,它将列出当前运行级别中的所有服务。您可以通过指定不同的运行级别来选择它,例如,rc-status boot 将列出 boot 运行级别中的所有服务。它还接受各种标志来更改其功能。与往常一样,完整列表可在 rc-status(8) 手册页中找到。以下是更令人感兴趣的标志

-c | --crashed

显示所有崩溃服务的列表。

-l | --list

列出所有可用的运行级别。

-s | --servicelist

显示所有服务的列表。

高级用法

自定义运行级别

创建

大多数用户只需默认运行级别即可满足。其他用户可能需要更多。运行级别只是 /etc/runlevels 中的一个目录,而启用的服务是指向 init.d 文件的符号链接。例如,将 sshd 服务添加到 default 运行级别是在 /etc/runlevels/default 中创建指向 /etc/init.d/sshd 的符号链接。因此,创建新的运行级别涉及在 /etc/runlevels 下创建新目录。

运行级别堆叠

大多数情况下,如果您要切换到 office 运行级别,您不希望关闭所有 default 服务。运行级别“继承”是通过运行级别堆叠实现的。如果您将 -s 标志传递给 rc-update,您实际上可以将运行级别添加到运行级别。例如,如果您想要一个与 default 相同的 office 运行级别,但启动了 myvpn 服务,您将执行以下操作进行设置

mkdir /etc/runlevels/office
rc-update -s add default office
rc-update add myvpn office

切换运行级别

一旦您有了要切换到的自定义运行级别,您可以使用 openrc 命令进行切换。按照上面的示例,您可以使用 openrc office 切换到新的运行级别,并使用 openrc default 切换回默认运行级别。

系统配置

OpenRC 的系统范围配置在 /etc/rc.conf 中进行。

多服务

在某些情况下,您可能希望同一段代码在不同的情况下执行不同的操作。例如,通常,各种 agetty 实例之间的区别仅在于它们运行的 tty。在这些情况下,您可以使用符号链接来管理动态配置差异。

考虑 agetty - 它通过计算 ${RC_SVCNAME#*.} 来确定要运行的端口 (tty)。这意味着如果您的服务名称是 agetty.foo,则端口变量的值将为“foo”。使用此方法的预期方式是将“基本”服务 (agetty) 符号链接到所需的目标 (agetty.foo)。

此机制还允许您为该服务指定自定义配置,有关更多详细信息,请参阅 扩展的 conf.d 名称

自定义服务命令

除了 startstopstatus 之外的命令也可能可用。一个常见的例子是 save,由 iptables 使用。它们的用法与内置命令相同。您可以查看 init.d 脚本中的各种 extra*commands 变量,这些变量提供了可用命令的列表。

extra_started_commands 是仅在服务启动时才有效的额外命令。类似的逻辑适用于其余命令。

扩展的 conf.d 名称

总共有 4 个文件可能在服务的配置中发挥作用。假设 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