系统管理指南:基本管理

第 18 章 管理服务(概述)

本章提供有关服务管理工具 (Service Management Facility, SMF) 的概述,此外,还提供了与运行级别相关的信息。

以下列出本章所介绍的信息:

有关与 SMF 相关的过程的信息,请参见管理服务(任务图)。有关与运行级别相关的过程的信息,请参见使用运行控制脚本(任务图)。

SMF 简介

SMF 提供了在传统 UNIX 启动脚本、init 运行级别和配置文件的基础上进行扩充的基础结构。SMF 提供了下列功能:

依赖性声明定义服务之间的关系。使用这些关系,可以只重新启动那些在缺省情况下直接受到影响的服务(而不是重新启动所有的服务),从而提供精确的故障隔离。相关性语句的另一个优点是,允许针对可伸缩和可再现的初始化进程使用相关性语句。另外,通过定义所有的相关性,可以利用新式高度并行的机器,因为所有的相关性服务都可以并行启动。

SMF 定义了一组可以由管理员针对服务调用的操作。这些操作包括启用、禁用、刷新、重新启动和维护。每个服务都由执行管理操作的服务重新启动器来管理。通常,重新启动器通过执行服务的方法来执行操作。每个服务的方法都在服务配置系统信息库中定义。这些方法允许重新启动器更改服务的状态。

在每个服务成功启动时,服务配置系统信息库将按服务提供快照,这使回退成为可能。另外,系统信息库提供一致而持久的方法来启用或禁用服务,并提供一致的服务状态视图。此功能有助于调试服务配置问题。

使用 SMF 时的行为更改

由 SMF 提供的多数功能都发生在后台,因此不为用户所知。其他功能可由新命令访问。以下列出了最明显的行为更改。

SMF 概念

本节提供 SMF 框架中的术语及其定义。这些术语应用于整个文档。要理解 SMF 概念,必须先了解这些术语。

SMF 服务

SMF 框架中的基本管理单元是服务实例。每个 SMF 服务都有可能配置了多个版本。而且,同一版本的多个实例也可以在一个 Oracle Solaris 系统上运行。实例是指服务的特定配置。Web 服务器就是一种服务。配置为在端口 80 侦听的特定 Web 服务器守护进程就是一个实例。Web 服务器服务的每个实例都可以有不同的配置要求。服务具有系统范围的配置要求,但是,每个实例都可以根据需要覆盖特定的要求。单个服务的多个实例可作为服务对象的子对象进行管理。

服务不只表示长期运行的标准系统服务(如 in.dhcpd 或 nfsd),还表示包括 ISV 应用程序(如 Oracle 软件)的各种系统实体。此外,服务还可能包括如下所示的较不传统的实体:

通常,服务是一个向应用程序和其他服务(本地和远程)提供一系列功能的实体。服务依赖于隐式声明的本地服务列表。

里程碑是特殊类型的服务。里程碑服务表示系统的高级属性。例如,构成运行级别 S、2 和 3 的服务均由里程碑服务表示。

服务标识符

使用故障管理资源标识符 (Fault Management Resource Identifier, FMRI) 对每个服务实例进行命名。FMRI 包括服务名称和实例名称。例如,rlogin 服务的 FMRI 是 svc:/network/login:rlogin,其中 network/login 标识服务,rlogin 标识服务实例。

FMRI 的等效格式如下所示:

另外,一些 SMF 命令可以使用下面的 FMRI 格式: svc:/system/system-log。一些命令将推断要使用哪个实例,以及何时没有多义性。有关选择适当的 FMRI 格式的说明,请参见 SMF 命令手册页,如 svcadm(1M) 或 svcs(1)。

服务名称中通常包括一个常规的功能类别。这些类别包括:

传统的 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。每个服务的状态都为下列状态之一:

SMF 清单

SMF 清单是一个 XML 文件,其中包含与服务或服务实例相关联的一整套属性。这些文件存储在 /var/svc/manifest 中。不应当使用清单来修改服务的属性。服务配置系统信息库是配置信息的授权来源。要将清单中的信息引入到系统信息库中,必须运行 svccfg import 或者允许服务在系统引导过程中导入信息。

有关 SMF 清单内容的完整说明,请参见 service_bundle(4) 手册页。如果需要更改服务属性,请参见 svccfg(1M) 或 inetadm(1M) 手册页。

SMF 配置文件

SMF 配置文件是一个 XML 文件,其中列出了一组服务实例以及每个服务是应当处于启用状态还是禁用状态。下面是随 Oracle Solaris 发行版提供的一些配置文件:

在全新安装或升级到 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 系统信息库备份

SMF 自动对系统信息库执行下列备份操作:

系统将为上述两种类型各维护四个备份。系统会在必要时删除最旧的备份。备份存储为 /etc/svc/repository -type-YYYYMMDD_HHMMSWS,其中 YYYYMMDD(年、月和日)和 HHMMSS(小时、分钟和秒)是执行备份的日期和时间。请注意,小时格式基于 24 小时制。

在发生错误时,可以从这些备份中恢复系统信息库。为此,可使用 /lib/svc/bin/restore_repository 命令。有关更多信息,请参见如何修复已损坏的系统信息库。

SMF 快照

服务配置系统信息库中的数据包括快照以及可编辑的配置。每个服务实例的相关数据都存储在快照中。标准快照如下所示:

始终使用 running 快照执行 SMF 服务。如果此快照不存在,系统将自动创建。

svcadm refresh 命令(有时后跟 svcadm restart 命令)能够激活快照。svccfg 命令用于查看或恢复到以前快照中的实例配置。有关更多信息,请参见如何恢复到另一个 SMF 快照。

SMF 管理接口和编程接口

本节介绍在使用 SMF 时可用的接口。

SMF 命令行管理实用程序

SMF 提供一组与 SMF 交互,并完成标准管理任务的命令行实用程序。下列实用程序可用来管理 SMF。

表 18–1 服务管理工具实用程序

Common Name(公用名称) 

功能 

inetadm

提供观察或配置由 inetd 控制的服务的功能

svcadm

提供执行常见服务管理任务(如启用、禁用或重新启动服务实例)的功能

svccfg

提供显示和处理服务配置系统信息库内容的功能

svcprop

从服务配置系统信息库中检索属性值,并采用适用于 shell 脚本的输出格式

svcs

提供服务配置系统信息库中所有服务实例的服务状态的详细视图

服务管理配置库接口

SMF 提供一组编程接口,这些接口可用于通过 svc.configd 守护进程与服务配置系统信息库进行交互。此守护进程是对本地系统信息库数据库的所有请求的仲裁程序。系统将一组基本接口定义为与服务配置系统信息库中的服务进行最低级别的交互。这些接口提供对所有服务配置系统信息库功能(如事务和快照)的访问。

对于许多开发者来说,只需要一组常见的任务即可与 SMF 交互。这些任务在基本服务的基础上作为易于使用的功能来实现,从而减轻了实现的难度。

SMF 组件

SMF 包括一个主重新启动器守护进程和多个委托的重新启动器。

SMF 主重新启动器守护进程

svc.startd 守护进程是 Solaris OS 的主进程启动器和重新启动器。该守护进程负责管理整个系统的服务相关性。该守护进程接管了 init 以前的职责,即在适当的运行级别启动相应的 /etc/rc*.d 脚本。首先,svc.startd 检索服务配置系统信息库中的信息。接着,该守护进程在服务的相关性得以满足时启动服务。该守护进程还负责重新启动失败的服务,并负责关闭不再满足相关性的服务。该守护进程通过事件(如进程停止),借助于操作系统的可用性视图来跟踪服务状态。

SMF 委托的重新启动器

有些服务在启动时具有一组共同的行为。为了提供这些服务之间的共同性,委托的重新启动器可能会负责这些服务。另外,委托的重新启动器可用来提供更复杂的或特定于应用程序的重新启动行为。委托的重新启动器可以支持一组不同的方法,但是会将相同的服务状态作为主重新启动器导出。重新启动器的名称随服务一同存储。委托的重新启动器的最新示例是 inetd,它能够按需启动 Internet 服务,而不是使服务始终保持运行。

SMF 和引导

SMF 提供用来引导系统的新方法。例如:

SMF 兼容性

尽管现在许多标准的 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 

电源关闭状态 

电源关闭 

关闭操作系统,以便可以安全地关闭系统电源。

s 或 S

单用户状态

单用户 

以单用户身份运行,挂载并且能够访问某些文件系统。  

1 

管理状态 

单用户 

访问所有可用的文件系统。用户登录功能处于禁用状态。

2 

多用户状态 

多用户 

用于正常操作。多个用户可以访问系统和所有的文件系统。除 NFS 服务器守护进程以外的所有守护进程都在运行。

3 

共享 NFS 资源的多用户级别

多用户 

用于共享 NFS 资源情况下的正常操作。这是 Solaris OS 的缺省运行级别。

4 

替换多用户状态 

 

在缺省情况下未配置,但是可供客户使用。 

5 

电源关闭状态 

电源关闭 

关闭操作系统,以便可以安全地关闭系统电源。如有可能,自动关闭支持此功能的系统的电源。 

6 

重新引导状态 

重新引导 

将系统关闭到运行级别 0,然后重新引导到共享 NFS 资源的多用户级别(或者 inittab 文件中的任何缺省级别)。

另外,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 命令可针对任何级别确定系统的当前运行级别。


示例 18–1 确定系统的运行级别

本示例显示系统的当前运行级别以及以前的运行级别的相关信息。


$ who -r
 .    run-level 3  Dec 13 10:10  3  0 S
$

who -r 命令的输出

说明 

run-level 3

标识当前的运行级别 

Dec 13 10:10

标识上次更改运行级别的日期 

3

也标识当前的运行级别 

0

标识自上次重新引导以来系统处于该运行级别的次数 

S

标识以前的运行级别 


/etc/inittab 文件

当您使用 init 或 shutdown 命令引导系统或更改运行级别时,init 守护进程会通过从 /etc/inittab 文件中读取信息来启动进程。此文件为 init 进程定义以下重要的项:

/etc/inittab 文件中的每一项都具有以下字段:

id:rstate :action:process

下表介绍了 inittab 项中的字段。

表 18–4 inittab 文件的字段说明

字段 

说明 

id

项的唯一标识符。 

rstate

列出此项适用的运行级别。 

action

标识如何运行在进程字段中指定的进程。可能的值包括: sysinit、boot、 bootwait、wait 和 respawn。

有关其他操作关键字的说明,请参见 inittab(4)。

process

定义要执行的命令或脚本。 


示例 18–2 缺省的 inittab 文件

以下示例显示了随 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)
  1. 初始化 STREAMS 模块

  2. 配置套接字传输提供器

  3. 初始化 SMF 的主重新启动器

  4. 描述因电源故障而造成的关机


当系统能够在运行级别 3 下工作时出现的情况

  1. init 进程将启动,并读取 /etc/default/init 文件以设置任何环境变量。缺省情况下,仅设置 TIMEZONE 变量。

    1. 然后,init 读取 inittab 文件并执行下列操作:

    2. 执行 action 字段中包含 sysinit 的所有进程项,以便在用户登录之前执行所有特殊的初始化。

    3. 将启动活动传递到 svc.startd。

    有关 init 进程如何使用 inittab 文件的详细说明,请参见 init(1M)。