update-rc.d 命令 #
update-rc.d
是 Debian 和 Ubuntu 等基于 Debian 的 Linux 发行版中用于管理 System V 初始化脚本的命令行工具。它用于安装和删除系统启动和关闭时运行的脚本链接,控制系统服务在不同运行级别的自动启动行为。
语法 #
update-rc.d [-f] [-n] 服务名 操作 [优先级]
常用选项 #
选项 | 描述 |
---|---|
-f, --force |
强制删除链接,即使脚本仍然存在 |
-n, --dry-run |
不执行任何操作,只显示将要执行的操作 |
-v, --verbose |
详细输出 |
-h, --help |
显示帮助信息 |
常用操作 #
操作 | 描述 |
---|---|
defaults |
使用默认设置安装链接 |
start NN 级别.. |
在指定运行级别以指定优先级启动服务 |
stop NN 级别.. |
在指定运行级别以指定优先级停止服务 |
disable |
禁用服务的所有启动/停止链接 |
enable |
启用之前禁用的服务 |
remove |
删除服务的所有链接 |
常见用法 #
1. 使用默认设置安装服务 #
update-rc.d servicename defaults
这将在运行级别 2、3、4 和 5 中启用服务,并在运行级别 0、1 和 6 中禁用服务。
2. 使用特定优先级安装服务 #
update-rc.d servicename defaults 90 10
这将使用启动优先级 90 和停止优先级 10 安装服务。
3. 删除服务 #
update-rc.d -f servicename remove
4. 禁用服务 #
update-rc.d servicename disable
5. 启用服务 #
update-rc.d servicename enable
6. 使用自定义启动/停止顺序 #
update-rc.d servicename start 20 2 3 4 5 . stop 80 0 1 6 .
这将在运行级别 2、3、4 和 5 中以优先级 20 启动服务,并在运行级别 0、1 和 6 中以优先级 80 停止服务。
7. 仅在特定运行级别启用服务 #
update-rc.d servicename start 20 3 5 . stop 80 0 1 2 6 .
这将仅在运行级别 3 和 5 中启动服务。
8. 模拟操作(不实际执行) #
update-rc.d -n servicename defaults
运行级别 #
在 System V 初始化系统中,运行级别决定了哪些服务应该启动:
运行级别 | 描述 |
---|---|
0 | 关机 |
1 | 单用户模式(救援模式) |
2 | 多用户模式,默认(Debian/Ubuntu) |
3 | 多用户模式,有网络服务(文本界面) |
4 | 未使用/用户自定义 |
5 | 多用户模式,有网络服务和图形界面 |
6 | 重启 |
服务脚本要求 #
要使用update-rc.d
管理服务,服务脚本(位于/etc/init.d/
目录)必须符合 Debian 策略,并包含 LSB(Linux Standard Base)头信息:
#!/bin/sh
### BEGIN INIT INFO
# Provides: servicename
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
链接结构 #
update-rc.d
创建的符号链接遵循以下命名约定:
/etc/rc[运行级别].d/[S|K][优先级][服务名]
其中:
S
表示启动脚本(Start)K
表示停止脚本(Kill)- 优先级是 00-99 之间的数字,数字越小越早执行
例如:
/etc/rc2.d/S20apache2
- 在运行级别 2 中以优先级 20 启动 apache2/etc/rc0.d/K20apache2
- 在运行级别 0 中以优先级 20 停止 apache2
与 systemd 的关系 #
在使用 systemd 的现代 Debian/Ubuntu 系统中,update-rc.d
命令仍然可用,但它通常是一个兼容层,将操作转换为相应的systemctl
命令:
update-rc.d 命令 | systemctl 等效命令 |
---|---|
update-rc.d name defaults |
systemctl enable name.service |
update-rc.d name disable |
systemctl disable name.service |
update-rc.d -f name remove |
systemctl disable name.service |
实用示例 #
1. 配置 Web 服务器 #
# 使用默认设置启用Apache
update-rc.d apache2 defaults
# 禁用Apache自动启动
update-rc.d apache2 disable
# 重新启用Apache自动启动
update-rc.d apache2 enable
2. 配置数据库服务 #
# 使用自定义优先级启用MySQL
update-rc.d mysql defaults 95 05
# 仅在运行级别2和3中启用MySQL
update-rc.d mysql start 20 2 3 . stop 80 0 1 4 5 6 .
3. 创建自定义服务 #
- 创建服务脚本
/etc/init.d/myservice
:
#!/bin/sh
### BEGIN INIT INFO
# Provides: myservice
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: My custom service
# Description: My custom service long description
### END INIT INFO
case "$1" in
start)
echo "Starting myservice..."
# 启动命令
;;
stop)
echo "Stopping myservice..."
# 停止命令
;;
restart)
echo "Restarting myservice..."
$0 stop
$0 start
;;
status)
echo "Status of myservice..."
# 状态检查命令
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0
- 设置权限并添加到启动项:
chmod 755 /etc/init.d/myservice
update-rc.d myservice defaults
4. 检查服务配置 #
# 查看服务的符号链接
ls -l /etc/rc*.d/*servicename*
# 使用insserv检查依赖关系
insserv -d servicename
常见问题排查 #
1. 服务未自动启动 #
可能的原因:
- 服务脚本中的 LSB 头信息不正确
- 服务脚本没有可执行权限
- 服务依赖的其他服务未启动
解决方法:
# 检查服务脚本的LSB头信息
head -n 15 /etc/init.d/servicename
# 检查权限
ls -l /etc/init.d/servicename
# 检查符号链接
ls -l /etc/rc2.d/*servicename*
# 手动启动服务检查错误
service servicename start
2. 无法删除链接 #
update-rc.d: error: cannot remove '/etc/init.d/servicename'
解决方法:使用-f
选项强制删除链接:
update-rc.d -f servicename remove
3. 依赖问题 #
insserv: warning: script 'servicename' missing LSB tags
解决方法:确保服务脚本包含正确的 LSB 头信息。
与其他服务管理工具的比较 #
工具 | 发行版 | 初始化系统 | 特点 |
---|---|---|---|
update-rc.d | Debian/Ubuntu | System V | 详细的控制,符号链接管理 |
chkconfig | Red Hat/CentOS/Fedora | System V | 简单易用,运行级别管理 |
systemctl | 现代 Linux 发行版 | systemd | 统一的服务管理,依赖处理,并行启动 |
rc-update | Gentoo/Alpine | OpenRC | 轻量级,灵活 |
提示 #
- 在现代 Debian/Ubuntu 系统中,推荐使用
systemctl
命令代替update-rc.d
update-rc.d
主要用于管理服务的自动启动配置,不用于启动/停止服务(使用service
命令)- 使用
ls -l /etc/rc*.d/*servicename*
可以查看服务在各运行级别的配置 - 服务启动顺序由符号链接名称中的优先级数字决定
- 在编写服务脚本时,确保包含正确的 LSB 头信息
- 使用
insserv
命令可以检查和修复服务依赖关系 - 在容器化环境中,
update-rc.d
通常不适用,因为容器一般不使用 System V 初始化系统