「update-rc.d」

内容:介绍 update-rc.d 命令。

创建或移除System-V风格的init脚本的链接。
update-rc.d用于更新/etc/rcrunlevel.d/下名字格式为NNname的软链接,这些链接指向/etc/init.d/name脚本。当runlevel发生改变的时候,这些链接有由init运行;这些脚本一般用于启动和停止系统服务,如守护进程。runlevel是init支持的运行级别之一,即0123456789S,NNnameNN是一个两位的数字,决定了脚本的执行顺序。

这命令并不是所有的Linux发行版里都有,至少Debian里有,也许Debian的衍生版里也有。但是有一点:file-rc包含了update-rc.d、sysv-rc包含了update-rc.d、init-system-helpers也包含了update-rc.d,也许还有其他的软件包也包含了update-rc.d,这些update-rc.d用法有不同的地方,具体的使用请查看man手册。本文指的update-rc.d是sysv-rc包中的。

命令行语法及选项

update-rc.d [-n] [-f] name remove

update-rc.d [-n] name defaults

update-rc.d [-n] name disable|enable [ S|2|3|4|5 ]

创建INIT脚本链接

进入/etc/init.d/,这下面有很多的脚本,而/etc/rcrunlevel.d/下的链接都是指向该目录下的脚本。

update-rc.d创建链接时,需要提供“依赖关系”和“运行级别“信息,而这些信息位于/etc/init.d下的脚本中的“LSB注释头”(头部的注释中),你可以看一下,这些脚本的头部信息的内容。

man 8 insserv提供了“LSB头格式”的详细信息。关于更多insserv的内容,查看《insserv命令使用》

所以在使用update-rc.d前,确保/etc/init.d/name脚本存在以及”LSB头格式“是正确的。

当使用defaults选项时,update-rc.d创建名为/etc/rcrunlevel.d/[SK]NNname的链接指向/etc/init.d/name脚本,从“LSB注释头”中获取运行级别和依赖性信息。

update-rc.d只创建不存在的链接。如果/etc/rcrunlevel.d/[SK]??name文件已经存在,update-rc.d什么也不做。这么所就是为了不改变现有的配置,因为有写配置可能是由系统管理员定制的。

旧版本的update-rc.d支持start和stop选项,新版本不再支持而相当于defaults选项。

在系统管理中,删除链接是常见的错误做法,一些人会认为这将“禁用”该服务(防止服务启动)。但是,如果所有链接都已被删除,那么下次软件包升级时,软件包的postinst脚本将再次运行update-rc.d,这将重新安装在出厂默认的链接。所以,禁用服务的正确方法是将服务配置为在默认启动服务的所有运行级别中停止服务(如上所述,如果/etc/rcrunlevel.d/[SK]??name文件已经存在,update-rc.d什么也不做)。在System V init系统中,实质上是将服务的符号链接从S重命名为K。

删除脚本链接

当使用remove选项时,update-rc.d会将/etc/rcrunlevel.d中连接到/etc/init.d/name脚本的链接删除。默认情况下,/etc/init.d/name脚本必须已被删除,才能删除对应的链接。如果脚本仍然存在,则update-rc.d会中止并产生错误。可以使用-f选项强制删除。

当你删除软件包时使用了purge参数(比如,apt-get purge openssh-server)的时候,软件包安装的/etc/init.d/name脚本才会被删除,但是使用update-rc.d创建的链接会依旧保留。

禁用INIT脚本启动链接

当使用disable [ S|2|3|4|5 ]选项时,只是将符号链接从S重命名为K,同时将NN设置为100减去原NN的值。

当使用enable [ S|2|3|4|5 ]选项时,只是将符号链接从K重命名为S,同时将NN设置为100减去原NN的值。

这两个选项只能用于runlevel为S, 2, 3, 4, 5的链接。如果没有指定runlevel,脚本将尝试修改所有启动运行等级。

选项

-n

并不实际的运行,只是显示update-rc.d会做哪些操作。

-f

强制删除连接,即使/etc/init.d/name脚本存在。

默认情况下,/etc/init.d/name脚本必须已被删除,才能删除对应的链接。如果脚本仍然存在,则update-rc.d会中止并产生错误。

使用示例

使用defaults创建链接:

update-rc.d foobar defaults

“等效依赖头”将具有对$remote_fs和$syslog的启动和停止依赖关系,以runlevel2-5启动,在runlevel0,1,6中停止。

移除一个脚本的所有链接 (假定/etc/init.d/foobar已经删除,否则要使用-f选项):

update-rc.d foobar remove

禁用服务:

update-rc.d foobar disable

安装启动和关机脚本:

update-rc.d foobar defaults

相关的文件及目录

/etc/init.d/

该文件夹存放了真正的init脚本。

/etc/rc?.d/

该文件夹存放update-rc.d和init使用的链接。

/etc/init.d/skeleton

init脚本的模板。关于skeleton的介绍查看:《skeleton》

BUGS

See http://bugs.debian.org/sysv-rc

参考文献

  • man 8 update-rc.d
  • man 8 init