12.7. 在 FreeBSD 中使用 rc

Contributed by Tom Rhodes.

在 2002 年, FreeBSD 整合了来自 NetBSD 的 rc.d 系统, 并通过它来完成系统的初始化工作。 用户要注意在 /etc/rc.d 目录下的文件。 这里面的许多文件是用来管理基础服务的, 它们可以通过 startstop, 以及 restart 选项来控制。 举例来说, sshd(8) 可以通过下面的命令来重启:

# /etc/rc.d/sshd restart

对其它服务的操作与此类似。 当然, 这些服务通常是在启动时根据 rc.conf(5) 自动启动的。 例如, 要配置使系统启动时启动网络地址转换服务, 可以简单地通过在 /etc/rc.conf 中加入如下设置来完成:

natd_enable="YES"

如果 natd_enable="NO" 行已经存在, 只要简单的把 NO 改成 YES 即可。 rc 脚本在下次重新启动的时候会自动的装载所需要的服务, 像下面所描述的那样。

由于 rc.d 系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的 /etc/rc.conf 变量,标准的 startstoprestart 选项将会执行他们的动作。例如 sshd restart 命令只在 /etc/rc.conf 中的 sshd_enable 设置成 YES 的时候工作。不管是否在 /etc/rc.conf 中设置了,要 startstop 或者 restart 一个服务,命令前可以加上一个one前缀。例如要不顾当前 /etc/rc.conf 的设置重新启动 sshd,执行下面的命令:

# /etc/rc.d/sshd onerestart

用选项 rcvar 可以简单来的检查 /etc/rc.conf 中用适当的 rc.d 脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查 sshd 是否真的在 /etc/rc.conf 中被启动了:

# /etc/rc.d/sshd rcvar
# sshd
$sshd_enable=YES

注意:

第二行 (# sshd) 是从 sshd 命令中输出的,而不是 root 控制台。

为了确定一个服务是否真的在运行,可以用 status 选项。例如验证 sshd 是否真的启动了:

# /etc/rc.d/sshd status
sshd is running as pid 433.

有些时候也可以 reload 服务。 这一操作实际上是向服务发送一个信号, 来强制其重新加载配置。 多数情况下, 发给服务的会是 SIGHUP 信号。 并非所有服务都支持这一功能。

rc.d 系统不仅用于网络服务, 它也为系统初始化中的多数过程提供支持。 比如 bgfsck 文件, 当它被执行时, 将会给出下述信息:

Starting background file system checks in 60 seconds.

这个文件用做后台文件系统检查,系统初始化的时候完成。

很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于 RPC 的服务启动可能在 rpcbind 服务启动之前失败。 要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。 程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。

下面的字句必须被包含在所有的启动脚本文件里, (他们都是 rc.subr(8) 用来 enable 启动脚本必需的):

以下的字句可以被包含在启动文件的顶部。严格来说他们不是必需的, 但作为对于 rcorder(8) 有一定的提示作用:

通过在启动脚本中仔细设定这些关键字, 系统管理员可以很有条理的控制脚本的启动顺序, 进而避免使用像其他 UNIX® 操作系统那样混乱的 runlevels

更多关于 rc.d 系统的信息, 可以在 rc(8)rc.subr(8) 联机手册中找到。 如果您有意撰写自己的 rc.d 脚本, 或对现有的脚本进行一些改进, 也可以参考 这篇文章

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.