本章提供有关服务管理工具 (Service Management Facility, SMF) 的概述,此外,还提供了与运行级别相关的信息。
以下列出本章所介绍的信息:
有关与 SMF 相关的过程的信息,请参见管理服务(任务图)。有关与运行级别相关的过程的信息,请参见使用运行控制脚本(任务图)。
SMF 提供了在传统 UNIX 启动脚本、init 运行级别和配置文件的基础上进行扩充的基础结构。SMF 提供了下列功能:
自动按照相关性顺序重新启动失败的服务,无论服务失败的原因是管理员操作错误、软件错误还是无法纠正的硬件错误。相关性顺序由相关性语句定义。
可以使用新的 svcs 命令创建可查看的服务对象,用 svcadm 和 svccfg 命令创建可管理的服务对象。还可以使用 svcs -p 查看服务和进程之间的关系,这对于 SMF 服务和传统的 init.d 脚本均适用。
通过自动捕获服务配置的快照来简化对服务的备份、恢复及撤消更改操作。
使用 svcs -x 来解释服务没有运行的原因,这便于调试和询问有关服务的问题。此外,由于每个服务都有单独的持久性日志文件,因此该过程进一步得到了简化。
允许使用 svcadm 来启用和禁用服务。这些更改不会因升级或重新启动而失效。如果使用 -t 选项,则所做的更改将是临时更改。
管理员能够安全地将任务委托给非超级用户,这些任务包括在系统中修改属性以及启用、禁用或重新启动服务等任务。
依据服务的相关性并行启动服务,从而提高大型系统的引导速度。关机时过程相反。
可以对引导控制台输出进行自定义,尽可能采用静默方式(缺省设置);或使用 boot -m verbose 将其自定义为详细模式。
尽可能兼容现有的管理习惯。例如,多数客户和 ISV(独立软件开发商)提供的 rc 脚本仍可像往常一样工作。
依赖性声明定义服务之间的关系。使用这些关系,可以只重新启动那些在缺省情况下直接受到影响的服务(而不是重新启动所有的服务),从而提供精确的故障隔离。相关性语句的另一个优点是,允许针对可伸缩和可再现的初始化进程使用相关性语句。另外,通过定义所有的相关性,可以利用新式高度并行的机器,因为所有的相关性服务都可以并行启动。
SMF 定义了一组可以由管理员针对服务调用的操作。这些操作包括启用、禁用、刷新、重新启动和维护。每个服务都由执行管理操作的服务重新启动器来管理。通常,重新启动器通过执行服务的方法来执行操作。每个服务的方法都在服务配置系统信息库中定义。这些方法允许重新启动器更改服务的状态。
在每个服务成功启动时,服务配置系统信息库将按服务提供快照,这使回退成为可能。另外,系统信息库提供一致而持久的方法来启用或禁用服务,并提供一致的服务状态视图。此功能有助于调试服务配置问题。
由 SMF 提供的多数功能都发生在后台,因此不为用户所知。其他功能可由新命令访问。以下列出了最明显的行为更改。
现在引导过程创建的消息要少许多。缺省情况下,在启动服务时并不显示消息。由引导消息提供的所有信息现在可在每个服务的日志文件(位于 /var/svc/log 中)中找到。可以使用 svcs 命令来帮助诊断引导问题。另外,还可以使用 boot 命令的 -v 选项。当在引导过程中启动每个服务时,该命令会生成一条消息。
如果有可能,服务将会自动重新启动,因此似乎进程拒绝中止。如果服务有缺陷,则该服务将被置于维护模式,但通常服务会在进程中止之后重新启动。应当使用 svcadm 命令来停止任何不应运行的 SMF 服务的进程。
/etc/init.d 和 /etc/rc*.d 中的许多脚本已被删除。这些脚本将不再是启用或禁用服务所必需的脚本。/etc/inittab 中的项也已经过删除,以便可以使用 SMF 对服务进行管理。由 ISV 提供或在本地开发的脚本和 inittab 项将能够继续运行。在引导过程中,不同的服务不会恰好同时启动,但是它们不会在 SMF 服务之前启动,因此所有的服务相关性都应当没有问题。
本节提供 SMF 框架中的术语及其定义。这些术语应用于整个文档。要理解 SMF 概念,必须先了解这些术语。
SMF 框架中的基本管理单元是服务实例。每个 SMF 服务都有可能配置了多个版本。而且,同一版本的多个实例也可以在一个 Oracle Solaris 系统上运行。实例是指服务的特定配置。Web 服务器就是一种服务。配置为在端口 80 侦听的特定 Web 服务器守护进程就是一个实例。Web 服务器服务的每个实例都可以有不同的配置要求。服务具有系统范围的配置要求,但是,每个实例都可以根据需要覆盖特定的要求。单个服务的多个实例可作为服务对象的子对象进行管理。
服务不只表示长期运行的标准系统服务(如 in.dhcpd 或 nfsd),还表示包括 ISV 应用程序(如 Oracle 软件)的各种系统实体。此外,服务还可能包括如下所示的较不传统的实体:
物理网络设备
配置的 IP 地址
内核配置信息
与系统 init 状态相对应的里程碑,如多用户运行级别
通常,服务是一个向应用程序和其他服务(本地和远程)提供一系列功能的实体。服务依赖于隐式声明的本地服务列表。
里程碑是特殊类型的服务。里程碑服务表示系统的高级属性。例如,构成运行级别 S、2 和 3 的服务均由里程碑服务表示。
使用故障管理资源标识符 (Fault Management Resource Identifier, FMRI) 对每个服务实例进行命名。FMRI 包括服务名称和实例名称。例如,rlogin 服务的 FMRI 是 svc:/network/login:rlogin,其中 network/login 标识服务,rlogin 标识服务实例。
FMRI 的等效格式如下所示:
svc://localhost/system/system-log:default
svc:/system/system-log:default
system/system-log:default
另外,一些 SMF 命令可以使用下面的 FMRI 格式: svc:/system/system-log。一些命令将推断要使用哪个实例,以及何时没有多义性。有关选择适当的 FMRI 格式的说明,请参见 SMF 命令手册页,如 svcadm(1M) 或 svcs(1)。
服务名称中通常包括一个常规的功能类别。这些类别包括:
application
device
milestone
network
platform
site
system
传统的 init.d 脚本也使用以 lrc(而不是 svc)开头的 FMRI 进行表示,例如: lrc:/etc/rcS_d/S35cacheos_sh。可使用 SMF 对传统服务进行监视。但是,您无法管理这些服务。
首次使用 SMF 引导系统时,列在 /etc/inetd.conf 中的服务会自动转换为 SMF 服务。这些服务的 FMRI 稍有不同。已转换的 inetd 服务的语法如下所示:
network/<service-name>/<protocol> |
另外,使用 RPC(远程过程调用)协议的已转换服务的语法如下所示:
network/rpc-<service-name>/rpc_<protocol> |
其中,<service-name> 是在 /etc/inetd.conf 中定义的名称,<protocol> 是服务的协议。例如,rpc.cmsd 服务的 FMRI 是 network/rpc-100068_2-5/rpc_udp。
svcs 命令显示服务实例的状态、开始时间和 FMRI。每个服务的状态都为下列状态之一:
degraded-服务实例处于启用状态,但是以有限的功能运行。
disabled-服务实例处于禁用状态且尚未运行。
legacy_run-传统服务不由 SMF 进行管理,但是可查看服务。此状态只能由传统服务使用。
maintenance-服务实例遇到错误,必须由管理员解决。
offline-服务实例处于启用状态,但是尚未运行或者无法运行。
online-服务实例处于启用状态,并且已成功启动。
uninitialized-此状态是所有服务在配置经过读取之前的初始状态。
SMF 清单是一个 XML 文件,其中包含与服务或服务实例相关联的一整套属性。这些文件存储在 /var/svc/manifest 中。不应当使用清单来修改服务的属性。服务配置系统信息库是配置信息的授权来源。要将清单中的信息引入到系统信息库中,必须运行 svccfg import 或者允许服务在系统引导过程中导入信息。
有关 SMF 清单内容的完整说明,请参见 service_bundle(4) 手册页。如果需要更改服务属性,请参见 svccfg(1M) 或 inetadm(1M) 手册页。
SMF 配置文件是一个 XML 文件,其中列出了一组服务实例以及每个服务是应当处于启用状态还是禁用状态。下面是随 Oracle Solaris 发行版提供的一些配置文件:
/var/svc/profile/generic_open.xml-此配置文件可启用早期 Solaris 发行版在缺省情况下启动的标准服务。
/var/svc/profile/generic_limited_net.xml-此配置文件可禁用早期 Solaris 发行版在缺省情况下启动的许多 Internet 服务。将启用 network/ssh 服务,以提供网络连通性。
/var/svc/profile/ns_*.xml-这些配置文件可启用与配置为在系统上运行的名称服务相关联的服务。
/var/svc/profile/platform_*.xml-这些配置文件可启用与特定硬件平台相关联的服务。
在全新安装或升级到 Oracle Solaris OS 之后的首次引导过程中,将自动应用某些 Solaris 配置文件。具体来说,会应用 /var/svc/profile/generic.xml 配置文件。此文件通常以符号形式链接到 generic_open.xml 或 generic_limited_net.xml。同样,如果名为 site.xml 的配置文件在系统首次引导期间位于 /var/svc/profile 中,或者是在两次引导之间添加的,则将应用该配置文件的内容。管理员可以使用 site.xml 配置文件来自定义初始启用服务集。
有关使用配置文件的更多信息,请参见如何应用 SMF 配置文件。
服务配置系统信息库存储服务的持久性配置信息以及 SMF 运行时数据。系统信息库在本地内存和本地文件之间分布。SMF 旨在最终可以用网络目录服务表示服务数据。网络目录服务尚不可用。服务配置系统信息库中的数据可实现许多 Solaris 实例之间的配置信息共享和管理简化。服务配置系统信息库只能使用 SMF 界面进行处理和查询。有关处理和访问系统信息库的更多信息,请参见 svccfg(1M) 和 svcprop(1) 手册页。svc.configd(1M) 手册页中对服务配置系统信息库守护进程进行了说明。libscf(3LIB) 手册页中对服务配置库进行了说明。
SMF 自动对系统信息库执行下列备份操作:
在每次系统启动过程中,在即将对系统信息库进行首次更改之前,会执行引导备份。
在 svc:/system/manifest-import:default 完成之后,如果 manifest_import 备份导入了任何新的清单,或者运行了任何升级脚本,则将发生此备份。
系统将为上述两种类型各维护四个备份。系统会在必要时删除最旧的备份。备份存储为 /etc/svc/repository -type-YYYYMMDD_HHMMSWS,其中 YYYYMMDD(年、月和日)和 HHMMSS(小时、分钟和秒)是执行备份的日期和时间。请注意,小时格式基于 24 小时制。
在发生错误时,可以从这些备份中恢复系统信息库。为此,可使用 /lib/svc/bin/restore_repository 命令。有关更多信息,请参见如何修复已损坏的系统信息库。
服务配置系统信息库中的数据包括快照以及可编辑的配置。每个服务实例的相关数据都存储在快照中。标准快照如下所示:
initial-在首次导入清单时提取
running-在执行服务的方法时使用
start-在最后一次成功启动时提取
始终使用 running 快照执行 SMF 服务。如果此快照不存在,系统将自动创建。
svcadm refresh 命令(有时后跟 svcadm restart 命令)能够激活快照。svccfg 命令用于查看或恢复到以前快照中的实例配置。有关更多信息,请参见如何恢复到另一个 SMF 快照。
本节介绍在使用 SMF 时可用的接口。
SMF 提供一组与 SMF 交互,并完成标准管理任务的命令行实用程序。下列实用程序可用来管理 SMF。
表 18–1 服务管理工具实用程序
Common Name(公用名称) |
功能 |
---|---|
inetadm | |
svcadm | |
svccfg | |
svcprop | |
svcs |
SMF 提供一组编程接口,这些接口可用于通过 svc.configd 守护进程与服务配置系统信息库进行交互。此守护进程是对本地系统信息库数据库的所有请求的仲裁程序。系统将一组基本接口定义为与服务配置系统信息库中的服务进行最低级别的交互。这些接口提供对所有服务配置系统信息库功能(如事务和快照)的访问。
对于许多开发者来说,只需要一组常见的任务即可与 SMF 交互。这些任务在基本服务的基础上作为易于使用的功能来实现,从而减轻了实现的难度。
SMF 包括一个主重新启动器守护进程和多个委托的重新启动器。
svc.startd 守护进程是 Solaris OS 的主进程启动器和重新启动器。该守护进程负责管理整个系统的服务相关性。该守护进程接管了 init 以前的职责,即在适当的运行级别启动相应的 /etc/rc*.d 脚本。首先,svc.startd 检索服务配置系统信息库中的信息。接着,该守护进程在服务的相关性得以满足时启动服务。该守护进程还负责重新启动失败的服务,并负责关闭不再满足相关性的服务。该守护进程通过事件(如进程停止),借助于操作系统的可用性视图来跟踪服务状态。
有些服务在启动时具有一组共同的行为。为了提供这些服务之间的共同性,委托的重新启动器可能会负责这些服务。另外,委托的重新启动器可用来提供更复杂的或特定于应用程序的重新启动行为。委托的重新启动器可以支持一组不同的方法,但是会将相同的服务状态作为主重新启动器导出。重新启动器的名称随服务一同存储。委托的重新启动器的最新示例是 inetd,它能够按需启动 Internet 服务,而不是使服务始终保持运行。
SMF 提供用来引导系统的新方法。例如:
有另外一个与 all 里程碑相关联的系统状态。使用 all 里程碑,所有针对 multi-user-server 里程碑定义了相关性的服务以及所有没有定义相关性的服务都将启动。如果您添加了服务(如第三方产品),那么,除非您使用下面的命令,否则它们可能不会自动重新启动:
ok boot -m milestone=all |
在引导系统时,可以选择使用 verbose 选项来查看更多的消息。缺省情况下,系统将不显示这些消息。要在详细模式下引导,请使用以下命令:
ok boot -mverbose |
有一个新的与 none 里程碑相关联的系统状态。如果使用此里程碑引导系统,则将只启动 init、svc.startd 和 svc.configd。此状态对于调试引导问题可能非常有用。特别是更便于调试任何有关 SMF 服务配置的问题,因为将不启动任何服务。有关如何使用 none 里程碑的说明,请参见如何在不启动任何服务的情况下引导。
尽管现在许多标准的 Solaris 服务由 SMF 来管理,位于 /etc/rc*.d 中的脚本仍能继续在运行级别转换中执行。包括在以前的 Solaris 发行版中的多数 /etc/rc*.d 脚本都已经作为 SMF 的一部分删除。其余的脚本能够继续运行,从而在不必将服务转换为使用 SMF 的情况下,添加第三方应用程序。
另外,对于要使用安装后的脚本改正的软件包,/etc/inittab 和 /etc/inetd.conf 必须可用。这些称为传统运行服务。通过运行 inetconv 命令,可以将这些传统运行服务添加到服务配置系统信息库中。您可以查看这些服务的状态,但是 SMF 不支持进行其他更改。使用此功能的应用程序将不会受益于 SMF 所提供的精确的故障隔离。
转换为利用 SMF 的应用程序可能无法再修改 /etc/inittab 和 /etc/inetd.conf 文件。已转换的应用程序将不使用 /etc/rc*.d 脚本。同样,新版本的 inetd 不会在 /etc/inetd.conf 中查找项。
系统的运行级别(也称为 init 状态)定义用户可以使用哪些服务和资源。系统一次只能在一个运行级别下运行。
Solaris OS 具有八个运行级别,下表对其进行了说明。在 /etc/inittab 文件中,缺省的运行级别指定为运行级别 3。
表 18–2 Solaris 运行级别
运行级别 |
Init 状态 |
类型 |
目的 |
---|---|---|---|
0 |
电源关闭状态 |
电源关闭 | |
单用户 |
以单用户身份运行,挂载并且能够访问某些文件系统。 |
||
1 |
管理状态 |
单用户 | |
2 |
多用户状态 |
多用户 | |
3 |
多用户 | ||
4 |
替换多用户状态 |
|
在缺省情况下未配置,但是可供客户使用。 |
5 |
电源关闭状态 |
电源关闭 |
关闭操作系统,以便可以安全地关闭系统电源。如有可能,自动关闭支持此功能的系统的电源。 |
6 |
重新引导状态 |
重新引导 |
另外,svcadm 命令可用于更改系统的运行级别,方法是选择系统要在其下运行的里程碑。下表显示了与每个里程碑相对应的运行级别。
表 18–3 Solaris 运行级别和 SMF 里程碑
运行级别 |
SMF 里程碑 FMRI |
---|---|
S |
milestone/single-user:default |
2 |
milestone/multi-user:default |
3 |
milestone/multi-user-server:default |
大多数情况下,只需要使用带有运行级别的 init 命令来更改系统状态就足够了。使用里程碑更改系统状态可能会导致混乱,而且可能会导致意外行为。另外,init 命令允许关闭系统,因此,init 是更改系统状态的最佳命令。
但是,在调试启动问题时,使用 none 里程碑引导系统可能会非常有用。none 里程碑没有等效的运行级别。有关具体的说明,请参见如何在不启动任何服务的情况下引导。
通过使用 who -r 命令来显示运行级别信息。
$ who -r |
使用 who -r 命令可针对任何级别确定系统的当前运行级别。
本示例显示系统的当前运行级别以及以前的运行级别的相关信息。
$ who -r . run-level 3 Dec 13 10:10 3 0 S $ |
who -r 命令的输出 |
说明 |
---|---|
run-level 3 |
标识当前的运行级别 |
Dec 13 10:10 |
标识上次更改运行级别的日期 |
3 |
也标识当前的运行级别 |
0 |
标识自上次重新引导以来系统处于该运行级别的次数 |
S |
标识以前的运行级别 |
当您使用 init 或 shutdown 命令引导系统或更改运行级别时,init 守护进程会通过从 /etc/inittab 文件中读取信息来启动进程。此文件为 init 进程定义以下重要的项:
init 进程将重新启动的项
在终止时要启动、监视和重新启动的进程
在系统进入新运行级别时执行的操作
/etc/inittab 文件中的每一项都具有以下字段:
id:rstate :action:process
表 18–4 inittab 文件的字段说明
字段 |
说明 |
---|---|
id |
项的唯一标识符。 |
rstate |
列出此项适用的运行级别。 |
action |
标识如何运行在进程字段中指定的进程。可能的值包括: sysinit、boot、 bootwait、wait 和 respawn。 有关其他操作关键字的说明,请参见 inittab(4)。 |
process |
定义要执行的命令或脚本。 |
以下示例显示了随 Solaris 发行版一同安装的缺省 inittab 文件。后面是该示例中每个输出行的说明。
ap::sysinit:/sbin/autopush -f /etc/iu.ap (1) sp::sysinit:/sbin/soconfig -f /etc/sock2path (2) smf::sysinit:/lib/svc/bin/svc.startd >/dev/msglog 2<>/dev/msglog (3) p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/msglog 2<>/dev/...(4) |
初始化 STREAMS 模块
配置套接字传输提供器
初始化 SMF 的主重新启动器
描述因电源故障而造成的关机
init 进程将启动,并读取 /etc/default/init 文件以设置任何环境变量。缺省情况下,仅设置 TIMEZONE 变量。
然后,init 读取 inittab 文件并执行下列操作:
执行 action 字段中包含 sysinit 的所有进程项,以便在用户登录之前执行所有特殊的初始化。
将启动活动传递到 svc.startd。
有关 init 进程如何使用 inittab 文件的详细说明,请参见 init(1M)。