使用 OpenRC
OpenRC 是 alpine 中使用的 init 系统。init 系统管理服务的启动和关闭以及计算机的启动和关机。
在本节中,使用了实用程序的规范名称。例如, |
正常用法
操作服务
运行时服务操作
您可以使用 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/runlevels
中的一个目录,而启用的服务是指向 init.d
文件的符号链接。例如,将 sshd
服务添加到 default
运行级别是在 /etc/runlevels/default
中创建指向 /etc/init.d/sshd
的符号链接。因此,创建新的运行级别涉及在 /etc/runlevels
下创建新目录。
多服务
在某些情况下,您可能希望同一段代码在不同的情况下执行不同的操作。例如,通常,各种 agetty
实例之间的区别仅在于它们运行的 tty。在这些情况下,您可以使用符号链接来管理动态配置差异。
考虑 agetty
- 它通过计算 ${RC_SVCNAME#*.}
来确定要运行的端口 (tty)。这意味着如果您的服务名称是 agetty.foo
,则端口变量的值将为“foo”。使用此方法的预期方式是将“基本”服务 (agetty
) 符号链接到所需的目标 (agetty.foo
)。
此机制还允许您为该服务指定自定义配置,有关更多详细信息,请参阅 扩展的 conf.d
名称。
自定义服务命令
除了 start
、stop
和 status
之外的命令也可能可用。一个常见的例子是 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
。