Linux 系统初始化脚本的 10 个 insserv 命令示例
insserv 命令用于控制 Linux 系统上服务的启动和停止顺序。
它通过读取初始化脚本的注释头并计算所有脚本之间的依赖关系来启用已安装的系统初始化脚本(启动脚本)。
Insserv 在配置文件 /etc/insserv.conf 和目录 /etc/insserv.conf.d 中扫描系统设施。
1.init.d脚本头格式
/etc/init.d 目录下的所有脚本都应具有如下标题。即使这些行在每个脚本的标题部分被注释掉(如下所示),insserv 仍然应该能够读取所有这些行并相应地启用所有 init 脚本。
在以下示例中,以“#Required-Start: $local_fs boot.localnet”开头的行允许 insserv 在执行 boot.kdump 脚本之前运行/验证 $local_fs 脚本和 boot.localnet 脚本。
同样,“#Required-Stop: $local_fs boot.localnet”行允许 insserv 在执行此脚本之前停止服务。
如果您是初始化脚本的新手,您应该了解如何编写基于 LSB 初始化标准的自定义初始化脚本。
# cat boot.kdump
#!/bin/bash
#
# Copyright 2005 Red Hat, Inc.
# Author: Jeff Moyer <jmoyer@redhat.com>
### BEGIN INIT INFO
# Provides: boot.kdump
# Required-Start: $local_fs boot.localnet
# Should-Start:
# Should-Stop:
# Required-Stop: $local_fs boot.localnet
# Default-Start: B
# Default-Stop:
# Short-Description: kdump boot configuration
# Description: This script loads the kdump kernel on startup.
### END INIT INFO
. /etc/sysconfig/kdump
. /etc/rc.status
2. insserv.conf 文件格式
以下是 /etc/insserv.conf 的示例,它是 insserv 命令使用的配置文件。
# cat /etc/insserv.conf
# All local filesystems are mounted (done during boot phase)
$local_fs boot.localfs +boot.crypto
# Low level networking (ethernet card)
$network network
# Named is operational
$named +named +dnsmasq +lwresd $network
# All remote filesystems are mounted (note in some cases /usr may
# be remote. Most applications that care will probably require
# both $local_fs and $remote_fs)
$remote_fs $local_fs +nfs +smbfs
# System logger is operational
$syslog syslog
# SunRPC portmapper available
$portmap portmap
# The system time has been set correctly
$time boot.clock +xntpd
# Services which need to be interactive
<interactive> apache apache2 boot.clock boot.crypto boot.crypto-early boot.localfs boot.rootfsck kbd kdump ntp
在上面的配置文件中:
- $network 是引用脚本 /etc/init.d/network 的伪名称。
- 同样,您将在 /etc/insserv.conf 中看到每个脚本的伪名称。这些是将在引导脚本标题部分中使用的伪名称。
- 以 $ 开头的每一行和后面的名称都根据 Linux 标准基本规范 (LSB) 定义了一个系统设施
- 这种系统设施后面的所有名称都将声明该设施所需的依赖关系。
- 如果加号后名称的服务可用,则使用该服务。如果它不可用,它会被静默忽略。
- 以 < 开头并以 > 结尾的单词是关键字。
- 目前,<interactive> 是将服务标记为交互式服务的唯一已知关键字,例如,在引导或运行级别更改期间需要输入密码或密码的服务。
3.添加服务
这是一个关于如何使用 insserv 实用程序添加简单服务的示例。
首先,验证可执行文件在 /etc/init.d 目录下。
# ls -l /etc/init.d/joystick
-rwxr-xr-x 1 root root 2296 May 5 2010 /etc/init.d/joystick
接下来,运行 insserv 命令以启用操纵杆服务。
# insserv joystick
在上面的insserv命令之后,执行chkconfig,验证是否添加到启动列表中。
# chkconfig --list | grep joystick
joystick 0:off 1:off 2:on 3:on 4:off 5:on 6:off
请注意,上面是一个非常简单的示例,没有依赖关系。但是,insserv 的强大之处在于它会自动解析并添加所有适当的依赖脚本。
4. 执行试运行
要在不启用任何服务的情况下执行试运行,请使用 -n 标志,如下所示。
# insserv –n
insserv: Loading ypserv
insserv: Loading /etc/insserv/overrides/ypserv
insserv: Loading network
insserv: Loading /etc/insserv/overrides/network
insserv: Loading aaeventd
insserv: Loading /etc/insserv/overrides/aaeventd
insserv: Loading ntp
insserv: Loading hawk
insserv: Loading /etc/insserv/overrides/hawk
insserv: Loading fetchmail
insserv: Loading /etc/insserv/overrides/fetchmail
insserv: Loading boot.cycle
insserv: Loading /etc/insserv/overrides/boot.cycle
insserv: Loading autoyast
5.删除服务
使用选项 -r 如下所示删除服务。
# insserv -r joystick
删除服务后,您将不会在 chkconfig 输出中看到它。
# chkconfig --list | grep joystick
6.使用默认运行级别
要使用脚本中定义的默认运行级别,请使用 -d 选项。如果您编辑了运行级链接方案,这可能会恢复这些更改。
# insserv –d
为了使用脚本中定义的默认运行级别,请使用 -d 选项。在以下示例中,insserv 将使用脚本中定义的运行级别,而不是从系统或用户定义的运行级别执行脚本。
# insserv –d <script name>
# insserv -d /etc/init.d/lighttpd
# chkconfig --list | grep lighttpd
lighttpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
7.强制运行服务
要强制运行忽略所需的服务,请使用 -f 选项,如下所示。
# insserv –f
要强制系统忽略其他必需的服务或相关脚本,请使用 -f 选项。在以下示例中,为了执行 /etc/init.d/openhpid 脚本,需要首先启动其他依赖项,如网络、远程、syslog 服务。
# more /etc/init.d/openhpid
#! /bin/sh
#
### BEGIN INIT INFO
# Provides: openhpid
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Should-Start: $named
# Should-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start OpenHPI daemon at boot time
# Description: Enable OpenHPI service which is provided by openhpid.
### END INIT INFO
您可以使用 insserv 命令强制系统执行 /etc/init.d/openhpid 脚本,忽略网络、远程、syslog 服务的状态,如下所示:
# insserv -f /etc/init.d/openhpid
此外,您可以将 -v 选项与上述任何输出一起使用,以查看有关该命令正在执行的操作的更多详细信息。
#insserv –dv
8.更改脚本目录
正如您从前面的所有示例中看到的那样,该脚本默认位于 /etc/init.d 目录下。如果您希望 insserv 为脚本使用不同的目录,请使用 -p 选项。
例如,以下将使用 /etc/init.d.custom 目录作为脚本位置。
# insserv –p /etc/init.d.cusom
9. Insserv 自定义配置文件
要指定配置文件的路径,请使用 -c 选项。这用于 insserv.conf 文件和 insserv.conf.d 目录。
# insserv –c <config file>
例如,您想为配置文件使用不同的路径而不是 /etc/insserv.conf,那么您可以使用以下示例中所示的命令。
当您想要更改 /etc/insserv.conf 文件并运行试运行 (-n) 程序以进行验证时,这非常有用。备份原始文件,使用您需要的更改进行修改,然后指向新位置。
完成所有测试后,您可以运行相同的命令以恢复到原始配置文件或使用新位置。
# insserv -c /var/tmp/insserv_karthik.conf
10. Insserv Override 和相关文件
要覆盖路径以替换 /etc/insserv/overrides,请使用以下选项。
默认情况下,在默认 /etc/insserv/overrides 目录下找到的 LSB 注释标头将覆盖 /etc/init.d 目录下找到的脚本的 LSB 注释标头。
但是,如果要指定自己的覆盖目录,请使用 -o 选项。下面将 /etc/insserv/my.overrides 定义为覆盖目录。
# insserv –o /etc/insserv/my.overrides
为了用新注释覆盖或替换 LSB 注释标题,您可以在特定路径中创建一个带有新标题的文件,并指示 insserv 查找新文件,而不是查找原始脚本中定义的注释。
在下面的示例中,/etc/init.d/splash 是一个脚本,它具有以下 LSB 注释,这些注释用于确定哪些服务需要先启动或停止。
# more /etc/init.d/splash
#! /bin/bash
# Copyright (c) 1995-2000 SuSE GmbH Nuernberg, Germany.
#
# Author: Michael Schroeder <feedback@suse.de>
#
# /etc/init.d/splash
# /usr/sbin/rcsplash
#
# System startup script for console splash screens
#
### BEGIN INIT INFO
# Provides: splash
# Required-Start: $remote_fs
# Should-Start: fbset
# Required-Stop: $remote_fs
# Should-Stop: fbset
# Default-Start: 1 2 3 5 S
# Default-Stop:
# Description: Splash screen setup
### END INIT INFO
如果您不想使用上面的 LSB 注释并且也不想修改现有脚本,那么您可以将文件复制到 /etc/insserv/overrides 目录并运行以下 insserv 命令来告诉系统使用定义的脚本在覆盖目录中,
insserv -o splash
您无需指定覆盖目录的位置,因为默认路径是 /etc/insserv/overrides。您还可以运行 insserv 试运行 (-n) 来验证脚本是如何执行的。
以下是将由 insserv 命令处理的各种文件:
- /etc/insserv.conf – 定义 LSB 系统设施的 insserv 配置文件。
- /etc/insserv.conf.d/ - 用于声明 LSB 系统设施的进一步配置文件的目录。
- /etc/insserv/overrides/ – 用此路径中找到的注释标头替换现有 LSB 注释标头的路径。
- /etc/init.d/ – Linux 标准基本规范 (LSB) 要求的 SuSE 初始化脚本基本目录的路径
- 点赞
- 收藏
- 关注作者
评论(0)