红联Linux门户
Linux帮助

探究Ubuntu下的update-rc.d命令

发布时间:2015-08-19 10:00:11来源:oscwu.com作者:Osc Wu

全面使用 Ubuntu 后不久,我就遇上了麻烦:Linux 下有许多命令根本不知道是什么意思,而且想做一些设置却不知道在命令行输入什么。你要问我是哪些命令?我指的当然不是学校里面教的诸如 pwd、ls 的东西,而是真正的用于 Linux 系统管理的那些命令。总之,刚刚搭建好 Apache + MySQL 开发环境后不久,我希望通过禁止它们对应的启动项来加快开机速度,却又不知道从何下手,后来终于在寻求 搜索帮助之后找到了其中一种解决方案 —— update-rc.d 这条命令。于是我花了点时间找资料看文档,大致学习了这条命令的使用和 Linux 管理启动项的原理。


update-rc.d 概览和系统启动

计算机在启动的时候会自动执行一些脚本,用于启动一些应用程序服务,update-rc.d 是管理这些脚本的常用命令之一。

首先这是 LinuxQuestions 中对 update-rc.d 的定义:

update-rc.d is the Debian utility to install and remove System-V style init script links. Other distributions (such as Red Hat) use chkconfig. With update-rc.d, you can schedule tasks to be started when you boot your computer, for example the ssh service.

从上文可知:

update-rc.d 是一个 Ubuntu 和 Debian 下的工具程序,用来添加和移除 System-V 类型的启动脚本。
这些脚本都叫做「System-V init script」,且以实际文件而不是链接文件的方式存储在 /etc/init.d 目录下。(之所以强调实际文件后文会解释原因)
其他的 Linux 发行版(例如红帽)使用 chkconfig 这个命令。
update-rc.d 就是通过管理 /etc/init.d 目录下的脚本文件来管理系统启动时的计划任务的,例如 ssh 服务、Apache 服务、MySQL 服务等。

因此 /etc/init.d 目录就是系统的启动脚本所在的目录,其中的每一个文件都是一个启动脚本,都代表了某一类应用程序服务。除非我们要手动编写启动脚本,否则我们不需要修改这个目录下的文件,在安装一些需要开机启动的应用程序的时候对应的脚本会自动被添加进去。

而系统还有另外一类目录叫 /etc/rcX.d,X 代表了 Linux 系统的运行级别。总共有 7 种运行级别,因此就有 7 个 /etc/rcX.d 目录(例如 /etc/rc5.d、/etc/rc0.d)。

/etc/rcX.d 目录下都是一些符号链接文件,这些链接文件都指向 /etc/init.d 目录下的脚本文件,命名规则为 K+NN+服务名或 S+NN+服务名,其中 NN 为两位数字。系统会根据指定的运行级别进入对应的 /etc/rcX.d 目录,并按照文件名顺序检索目录下的链接文件。
– 对于以 K 开头的文件,系统将终止对应的服务
– 对于以 S 开头的文件,系统将启动对应的服务

所以,到这而 Linux 启动项的内部实现就大致明晰了:如果在某一运行级别下,对应的 /etc/rcX.d 下的链接文件决定了启动时系统对于这些脚本所采取的行动。换句话说,修改 /etc/rcX.d 下的文件可完成系统启动项的配置。但是这样的方法过于繁琐,所以才有了 update-rc.d 命令,它通过直接检索脚本名称和相应的参数来快速管理这些启动脚本。


总结起来就是:
1. /etc/init.d 目录下存放系统启动时执行的脚本
2. /etc/rcX.d 目录下存放脚本在不同运行级别下的链接文件
3. 通过修改 /etc/rcX.d 目录可完成 Linux 下启动脚本的配置
4. 通过 update-rc.d 命令快速实现上一条描述的情况


update-rc.d 命令的脚本管理

使用 update-rc.d 命令需要指定脚本名称和一些参数,它的格式看起来是这样的(需要在 root 权限下):

update-rc.d [-n] [-f] <basename> remove
update-rc.d [-n] <basename> defaults
update-rc.d [-n] <basename> disable|enable [S|2|3|4|5]
update-rc.d <basename> start|stop <NN> <runlevels>
-n: not really
-f: force

其中:

disable|enable 代表脚本还在 /etc/init.d 中,并设置当前状态是手动启动还是自动启动。
start|stop 代表脚本还在 /etc/init.d 中,开机,并设置当前状态是开始运行还是停止运行。(启用后可配置开始运行与否)
NN 是一个决定启动顺序的两位数字值。(例如 90 大于 80,因此 80 对应的脚本先启动或先停止)
runlevels 则指定了运行级别。

例如,添加一个新的启动脚本 sample_init_script,并且指定为默认启动顺序、默认运行级别(还记得前面说的吗,首先要有实际的文件存在于 /etc/init.d,即若文件 /etc/init.d/sample_init_script 不存在,则该命令不会执行):

$ update-rc.d sample_init_script defaults

上一条命令等效于(中间是一个英文句点符号):

$ update-rc.d sample_init_script start 20 2 3 4 5 . stop 20 0 1 6

安装一个启动脚本 sample_init_script,指定默认运行级别,但启动顺序为 50:

$ update-rc.d sample_init_script defaults 50

安装两个启动脚本 A、B,让 A 先于 B 启动,后于 B 停止:

$ update-rc.d A 10 40
$ update-rc.d B 20 30

删除一个启动脚本 sample_init_script,如果脚本不存在则直接跳过:

$ update-rc.d -f sample_init_script remove

这一条命令实际上做的就是一一删除所有位于 /etc/rcX.d 目录下指向 /etc/init.d 中 sample_init_script 的链接(可能存在多个链接文件),update-rc.d 只不过简化了这一步骤。


常见启动脚本管理

禁止 Apache/MySQL 相关组件开机自启:

$ update-rc.d -f apache2 remove
$ update-rc.d -f mysql remove


Update-rc.d && rc.local管理Ubuntu的开机启动:http://www.linuxdiyf.com/linux/1057.html

通过update-rc.d来管理Ubuntu系统的自动启动程序:http://www.linuxdiyf.com/linux/1056.html

Ubuntu系统Update-rc.d命令:http://www.linuxdiyf.com/linux/906.html