13.2 init.rc 服务管理

BSD init 系统服务管理框架概述

FreeBSD 使用传统的 BSD init(初始化系统)来管理系统服务。BSD init 是 FreeBSD 原生的初始化系统,与 systemd 等现代初始化系统不同,它采用基于脚本的服务管理方式。

长期在后台运行的服务通常命名为 xxxd,例如 sshdntpd,其中的 d 表示 FreeBSD 的守护进程标志“daemonarrow-up-right 备份arrow-up-right”。在 Windows 系统中,这类程序被称为“服务”,可在任务管理器中查看。

服务管理配置文件与目录结构

/  
├── etc/  # 参见 rc.conf(5)
   ├── defaults/
      ├── rc.conf         # 系统默认 rc 配置
      └── vendor.conf     # 厂商默认配置(默认不存在)
   ├── rc                  # 系统启动主脚本
   ├── rc.conf             # 用户主配置文件
   ├── rc.conf.local       # 本地自定义配置(默认不存在),用于开机时自定义配置
   ├── rc.conf.d/          # 分散的用户自定义配置文件目录(默认为空)
   ├── rc.d/               # 基本系统的服务脚本,参见 rc.d(8)
   ├── rc.firewall         # 防火墙启动脚本
   ├── rc.local            # 本地自定义启动脚本(默认不存在)
   ├── rc.shutdown         # 系统关机执行脚本
   ├── rc.suspend          # 系统挂起前执行的脚本
   └── rc.subr             # rc 脚本公共函数库
├── var/
   └── run/
       └── dmesg.boot      # 启动时 dmesg(8) 输出
└── usr/
    └── local/
        └── etc/
            └── rc.d/       # 第三方应用的服务脚本

在 FreeBSD 源代码中,上述文件主要位于 libexec/rcarrow-up-right 路径下。

默认 rc 配置位于 /etc/defaults/rc.conf此文件仅供参考,请勿直接修改。 如需修改,请编辑 /etc/rc.conf 文件来覆盖默认的设置。/etc/rc.conf 是用户自定义的 rc 配置文件。例如,如果想让系统自动启动 sshd、apache、pf 等服务,就需要修改该文件。

注意

/etc/rc.conf 的优先级高于 /etc/defaults/rc.conf。即 /etc/rc.conf 文件将覆盖 /etc/defaults/rc.conf 中的同名条目的配置。

系统服务管理常用命令集

BSD init 系统提供了 service 命令作为服务管理的统一接口,配合 sysrc 命令实现服务的启动、停止和开机自启配置。以下是常用命令集:

注意

关键字 enabledisabledelete 最早出现在 13.0-RELEASE,参见 Add new rc keywords: enable, disable, deletearrow-up-right 备份arrow-up-right

系统服务安装后默认未启用,以上命令无法直接执行,需要先启用服务。

编辑 /etc/rc.conf 文件,在文件中添加一行:XXX_enable="YES",其中 XXX 表示服务名称(例如 nginxsamba 等),这是固定格式。

提示

上述命令中的 "YES" 的双引号其实可省略,系统会自动添加(FreeBSD 15.0-RELEASE 起如此)。"NO" 亦同理。

服务对应的脚本路径为 /usr/local/etc/rc.d/。也可以直接调用 /etc/rc.d//usr/local/etc/rc.d/ 下的脚本。

默认 rc.conf 配置文件的内容与结构

默认 rc.conf 配置文件的源代码位于 libexec/rc/rc.confarrow-up-right,版本 Set virtual_oss_enable="NO" in /etc/defaults/rc.confarrow-up-right

系统日志等相关配置文件

课后习题

  1. 创建一个自定义服务脚本放入 /usr/local/etc/rc.d/,分析 rc.subr 中依赖关系检查的实现是否有可优化之处。

  2. 修改 rc_debug 为 YES,追踪一次服务启动的完整流程,对比正常启动与调试启动的输出差异。

  3. 禁用 rc_startmsgs 并修改几个关键服务的启动顺序,观察系统行为变化。

最后更新于