Oracle Solaris 11 上的服务管理工具 (SMF) 基础知识简介

作者:Glynn Foster

在 Oracle Solaris 11 上利用服务管理工具管理服务的简单示例。


2012 年 8 月发布

服务管理工具 (SMF) 最初是在 Oracle Solaris 10 中引入的,是一个用来管理系统和应用服务的操作系统特性,它取代了 Oracle Solaris 和其他 UNIX 操作系统早期版本中传统的 init 脚本启动机制。SMF 可确保重要系统和应用服务即便在软硬件发生故障时也能继续运行,从而提高了系统的可用性。因此,SMF 是一个应用比较广泛的 Oracle Solaris 预测性自我修复功能组件。

如果要下载软件、加入论坛、阅读类似本文这样的其他技术方法文章,请成为 OTN 成员。无垃圾邮件!

本文简要介绍 SMF,并演示在 Oracle Solaris 11 上管理服务的一些简单示例。另一篇文章中将介绍更高级的管理主题。要了解有关 SMF 的更多信息,请参见 Oracle 技术网的 SMF 技术页面上的各种内容。

SMF 概述

查看命令行示例之前,我们快速了解一些 SMF 特性,以及它在提高典型数据中心环境中应用的弹性方面所带来的好处。SMF 是负责管理系统上服务的软件框架,无论这些服务是对系统工作运行至关重要的关键系统服务,还是应用服务,如数据库或 Web 服务器。

每个服务都有一个明确定义的状态(启用、禁用、脱机和维护),通常与其他需要先在系统上运行的依赖服务有关系。这是一个重要优点,因为服务可以在系统启动期间并行启动,与原来的 init 框架相比,启动速度更快。init 框架只能顺序启动进程,并且必须等待进程完成。每个服务通常由主 SMF 重新启动器后台进程 svc.startd 启动,但这项任务可以委托给替代重新启动器,就像互联网服务委托给 inetd 一样。

每个服务在后台都有一份服务清单,描述有关该服务的一些基本信息、需要哪些服务依赖项、所需的所有服务配置以及 SMF 如何启动和停止该服务。服务一旦启动,即可启动作为服务合同的一部分捆绑在一起的多个不同进程。这意味着管理员只需管理更高级别的服务,而不必担心一系列单独的进程以及这些进程可能需要的启动顺序。如果服务因任何原因(无论是硬件还是软件故障)失败,SMF 都会自动检测故障并重新启动该服务和所有依赖服务。

SMF 还能够运行给定服务的多个实例并在这些实例之间共享通用配置。例如,当您需要运行多个 Apache Web 服务器实例,每个实例可能只是指定端口号和文档根目录不同时,此功能尤为有用。SMF 将服务配置数据存储在配置信息库中,包括系统上每个服务实例的当前状态,以及与该服务和服务实例相关的配置数据。配置信息库由 SMF 配置信息库后台进程 svc.configd 管理。

系统上的每个服务均可使用故障管理资源标识符 (FMRI) 描述,该标识符显示服务名称、服务实例以及关联类别。例如,SSH 服务器的 FMRI 如下所示:

svc:/network/ssh:default

在本例中,服务名称为 ssh,服务实例是 default,类别为 network。所有 SMF 相关 FMRI 均带 svc:/ 模式前缀,“原有服务”除外,它们的前缀是 lrc:/ 模式,如下所示。管理员使用 FMRI 作为操纵 Oracle Solaris 系统上服务的主要方式。在某些情况下,可以使用缩写形式引用同一服务,本文稍后再介绍。

SMF 框架在 Oracle Solaris 11 系统上始终处于活跃状态,它是通过默认的 init 进程启动(和重新启动)的,如图 1 所示。

图 1

图 1.SMF 框架

SMF 命令行

管理员可以从命令行使用几种命令来管理服务和更改系统配置。表 1 概要列出了可用的不同命令行选项。

表 1.SMF 命令概要
命令 说明
svcadm 管理服务实例状态
svcs 提供有关服务的信息,包括服务状态
svcprop 获取有关服务配置属性的信息
svccfg 导入、导出和修改服务配置

为简单起见,本文将使用 root 帐户执行命令。有些 SMF 命令行需要特权,其他命令则不需要。用户可以通过采用 root 角色或获取 solaris.smf.manage 和/或 solaris.smf.modify 授权来获取此权限。

获取有关系统上运行的服务的信息

我们先来看 svcs 命令,它生成系统上正在运行的服务实例列表。如果不带任何其他选项,svcs 将快速显示每个已启用服务实例的状态,一个一行,如清单 1 所示。

# svcs
STATE          STIME    FMRI
legacy_run     Jun_14   lrc:/etc/rcS_d/S99openconnect-clean
legacy_run     Jun_14   lrc:/etc/rc2_d/S47pppd
legacy_run     Jun_14   lrc:/etc/rc2_d/S81dodatadm_udaplt
legacy_run     Jun_14   lrc:/etc/rc2_d/S89PRESERVE
disabled       Jun_14   svc:/platform/i86pc/acpihpd:default
disabled       Jun_14   svc:/network/ipsec/policy:default
disabled       Jun_14   svc:/network/nis/domain:default
online         Jun_14   svc:/system/early-manifest-import:default
online         Jun_14   svc:/system/svc/restarter:default
online         Jun_14   svc:/network/tcp/congestion-control:vegas
online         Jun_14   svc:/network/tcp/congestion-control:highspeed
online         Jun_14   svc:/network/sctp/congestion-control:highspeed
online         Jun_14   svc:/network/sctp/congestion-control:vegas
online         Jun_14   svc:/network/tcp/congestion-control:newreno
online         Jun_14   svc:/network/sctp/congestion-control:cubic
online         Jun_14   svc:/network/tcp/congestion-control:cubic
...
online         Jun_14   svc:/system/zones:default
online         Jun_14   svc:/system/power:default
online         Jun_14   svc:/system/hal:default
online         Jun_14   svc:/application/texinfo-update:default
online         Jun_14   svc:/application/pkg/update:default

清单 1.svcs 输出示例

关于清单 1 所示的输出有几点需要注意。首先,svcs 命令还列出一些通过 rc*.d 脚本启动机制启动的原有服务。而且,该命令还会显示一些在下次系统重新启动之前临时禁用的服务实例。使用 svcs-a 选项,可以得到所有服务实例的列表,包括禁用或不完整的服务,如清单 2 所示。

# svcs -a
STATE          STIME    FMRI
legacy_run     Jun_14   lrc:/etc/rcS_d/S99openconnect-clean
legacy_run     Jun_14   lrc:/etc/rc2_d/S47pppd
legacy_run     Jun_14   lrc:/etc/rc2_d/S81dodatadm_udaplt
legacy_run     Jun_14   lrc:/etc/rc2_d/S89PRESERVE
disabled       Jun_14   svc:/system/device/mpxio-upgrade:default
disabled       Jun_14   svc:/network/install:default
disabled       Jun_14   svc:/network/ipfilter:default
disabled       Jun_14   svc:/network/ipsec/ike:default
disabled       Jun_14   svc:/network/ipsec/manual-key:default
disabled       Jun_14   svc:/system/name-service-cache:default
disabled       Jun_14   svc:/network/ldap/client:default
disabled       Jun_14   svc:/network/nis/client:default
disabled       Jun_14   svc:/network/ibd-post-upgrade:default
disabled       Jun_14   svc:/network/inetd-upgrade:default
disabled       Jun_14   svc:/network/nfs/status:default
disabled       Jun_14   svc:/network/nfs/nlockmgr:default
...
online         Jun_14   svc:/system/zones:default
online         Jun_14   svc:/system/power:default
online         Jun_14   svc:/system/hal:default
online         Jun_14   svc:/application/texinfo-update:default
online         Jun_14   svc:/application/pkg/update:default

清单 2.所有服务列表

正如在清单 2 中看到的,我们得到了上一条命令中未列出的一些新服务实例。为了了解它们之间的差异,我们可以快速数一下输出的行数,数一下禁用的(或不完整)服务的数量。在本例中,该系统上共计有 111 个禁用的服务。

# svcs | wc -l
     147
# svcs -a | wc -l
     258

看了所有服务实例的列表之后,我们来研究其中一个服务实例,了解有关该服务实例的更多信息。在本示例中,我们选择 svc:/system/zones:default 服务实例。我们可以使用 -l 选项和服务名获取更多信息,如清单 3 所示。

# svcs -l svc:/system/zones:default
fmri         svc:/system/zones:default
name         Zones autoboot and graceful shutdown
enabled      true
state        online
next_state   none
state_time   June 14, 2012 08:30:31 PM NZST
logfile      /var/svc/log/system-zones:default.log
restarter    svc:/system/svc/restarter:default
manifest     /etc/svc/profile/generic.xml
manifest     /lib/svc/manifest/system/zones.xml
manifest     /lib/svc/manifest/system/zonestat.xml
dependency   require_all/none svc:/milestone/multi-user-server (online)
dependency   optional_all/none svc:/system/pools:default (disabled)
dependency   optional_all/none svc:/system/pools/dynamic:default (disabled)
dependency   optional_all/none svc:/system/zones-monitoring (online)

清单 3.获取有关服务实例的信息

该命令列出有关 svc:/system/zones:default 服务实例的大量信息,包括描述、状态详细信息、文件系统上记录服务相关消息的位置、负责启动和重新启动它的服务、相关服务清单和依赖项信息。

我们可以从描述中得知,该服务实例负责在系统启动过程中自动启动区域和关闭区域。从清单 3 中,我们可以看到该服务实例有四个依赖项,一个是必需的,另外三个是可选的。查看依赖项信息的另一种方法是使用 svcs-d 选项。这可以提供依赖服务的状态信息,但不能告诉我们是何种依赖关系:

# svcs -d svc:/system/zones:default
gman@rampage:~$ svcs -d zones
STATE          STIME    FMRI
disabled       Jun_14   svc:/system/pools:default
disabled       Jun_14   svc:/system/pools/dynamic:default
online         Jun_14   svc:/system/zones-monitoring:default
online         Jun_14   svc:/milestone/multi-user-server:default

现在我们来看另一个相关服务实例 svc:/system/zones-monitoring:default,并使用 svcs-D 选项查看哪些服务依赖此服务:

# svcs -D svc:/system/zones-monitoring:default
STATE          STIME    FMRI
online	       Jun_14   svc:/system/zone:default

结果 svc:/system/zones:default 并不令人吃惊,因为在前面的示例中我们已经确定了这种关系。SMF 的一个主要特性是管理员管理服务,而不是各进程本身。但如果想要了解给定服务实例启动了哪些进程,该怎么办呢?只需使用 svcs-p 选项,即可轻松查看此信息,使用 ps 可帮助确认:

# svcs -p zones-monitoring
STATE          STIME    FMRI
online         Jun_14   svc:/system/zones-monitoring:default
               Jun_14        216 zonestatd

# ps 216
   PID TT       S  TIME COMMAND
   216 ?        S  0:01 /usr/lib/zones/zonestatd

到目前为止,我们在命令行都是使用完整 FMRI 指定感兴趣的服务。SMF 还支持缩写 FMRI。以下获取有关 svc:/system/system-log:default 服务实例的信息的示例均是等效的,因为它们都唯一标识服务:

# svcs -l svc:/system/system-log:default
# svcs -l system/system-log:default
# svcs -l system-log:default
# svcs -l system-log

启动和停止服务

现在,我们已经了解系统上运行的是哪些服务并检索了有关这些服务的一些基本信息,下面我们看看如何使用 svcadm 命令管理这些服务的状态。在接下来的几个示例中,我们将看看 svc:/application/management/net-snmp:default 服务实例,它负责管理 /usr/sbin/snmpd SNMP 代理,此代理通过一组管理信息库 (MIB) 收集有关系统的信息。我们可以使用 svcs 命令查看此服务的初始状态及其依赖项类型,如清单 4 所示。

# svcs net-snmp
STATE          STIME    FMRI
disabled       Jun_14   svc:/application/management/net-snmp:default
# svcs -d net-snmp
STATE          STIME    FMRI
disabled       Jun_14   svc:/network/rpc/rstat:default
online         Jun_14   svc:/system/cryptosvc:default
online         Jun_14   svc:/milestone/network:default
online         Jun_14   svc:/system/filesystem/local:default
online         Jun_14   svc:/milestone/name-services:default
online         Jun_14   svc:/system/system-log:default
online         Jun_14   svc:/milestone/multi-user:default
# svcs -l net-snmp
fmri         svc:/application/management/net-snmp:default
name         net-snmp SNMP daemon
enabled      false
state        disabled
next_state   none
state_time   June 19, 2012 01:50:37 PM NZST
logfile      /var/svc/log/application-management-net-snmp:default.log
restarter    svc:/system/svc/restarter:default
contract_id
manifest     /etc/svc/profile/generic.xml
manifest     /lib/svc/manifest/application/management/net-snmp.xml
dependency   require_all/none svc:/milestone/multi-user (online)
dependency   require_all/none svc:/system/filesystem/local (online)
dependency   optional_all/none svc:/milestone/name-services (online)
dependency   optional_all/none svc:/system/system-log (online)
dependency   optional_all/none svc:/network/rpc/rstat (disabled)
dependency   require_all/restart svc:/system/cryptosvc (online)
dependency   require_all/restart svc:/milestone/network (online)
dependency   require_all/refresh file://localhost/etc/net-snmp/snmp/snmpd.conf (online)

清单 4.查看服务的初始状态和依赖项

net-snmp 服务实例最初是禁用的,但其需要的所有依赖项都在线(只有一个可选的依赖项 svc:/network/rpc/rstat 是禁用的)。接下来使用 svcadm enable 命令启用它:

# svcadm enable net-snmp
# svcs -p net-snmp
STATE          STIME    FMRI
online          9:33:40 svc:/application/management/net-snmp:default
                9:33:40     6062 snmpd

可以看到,/usr/sbin/snmpd 后台进程代理现已启动,我们可以使用 snmpwalk 命令验证 SNMP 代理是否工作,如清单 5 所示。

# snmpwalk -v 1 -c public localhost
SNMPv2-MIB::sysDescr.0 = STRING: SunOS rampage 5.11 11.1 i86pc
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.3
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (186832) 0:31:08.32
SNMPv2-MIB::sysContact.0 = STRING: "System administrator"
SNMPv2-MIB::sysName.0 = STRING: rampage
SNMPv2-MIB::sysLocation.0 = STRING: "System administrators office"
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (31) 0:00:00.31
SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORDescr.1 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
...
NOTIFICATION-LOG-MIB::nlmConfigGlobalEntryLimit.0 = Gauge32: 1000
NOTIFICATION-LOG-MIB::nlmConfigGlobalAgeOut.0 = Gauge32: 1440 minutes
NOTIFICATION-LOG-MIB::nlmStatsGlobalNotificationsLogged.0 = Counter32: 0 notifications
NOTIFICATION-LOG-MIB::nlmStatsGlobalNotificationsBumped.0 = Counter32: 0 notifications

清单 5.验证 SNMP 代理是否正常工作

继续下一步之前,我们快速了解一下 SMF 在出现硬件或软件故障时重新启动任何进程的功能。可以看到,/usr/sbin/snmpd 代理后台进程正在运行,进程 ID 为 6062。我们来终止该进程,看看会发生什么:

# kill -9 6062
# svcs -p net-snmp
STATE          STIME    FMRI
online          9:38:12 svc:/application/management/net-snmp:default
                9:38:12     6065 snmpd

可以看到,/usr/sbin/snmpd 进程已重新启动,新进程 ID 为 6065,服务仍然在线!永久禁用服务也很简单,只需使用 svcadm disable 命令,如下所示:

# svcadm disable net-snmp
# svcs net-snmp
STATE          STIME    FMRI
disabled        9:44:40 svc:/application/management/net-snmp:default
# snmpwalk -v 1 -c public localhost
Timeout: No response from localhost

也可以选择使用 -t 选项,在计算机下次重启之前临时禁用服务。SMF 中的每个服务总是处于表 2 所示的几种状态之一。

表 2.SMF 服务状态
状态 说明
uninitialized 这是所有服务的初始状态,除非重新启动器(通常是 svc.startd)将服务转到其他状态。
offline 实例已启用,但尚未运行或无法运行。
online 实例已启用,且正在运行。
maintenance 实例已启用,但因某种原因无法运行,需要采取管理操作。
disabled 实例已禁用。
legacy-run 服务并非由 SMF 直接管理,但在某个时刻已经启动。

如果我们出于某种原因希望重新启动服务,可以使用 svcadm restart 命令。

SMF 里程碑

SMF 里程碑是一种服务,它聚合了多个服务依赖项,并且描述其他服务可以依赖的系统就绪情况的特定状态。管理员可以使用 svcs 命令查看定义的里程碑列表,如清单 6 所示。

# svcs milestone*
STATE          STIME    FMRI
online         Jun_30   svc:/milestone/unconfig:default
online         Jun_30   svc:/milestone/config:default
online         Jun_30   svc:/milestone/devices:default
online         Jun_30   svc:/milestone/network:default
online         Jun_30   svc:/milestone/single-user:default
online         Jun_30   svc:/milestone/name-services:default
online         Jun_30   svc:/milestone/self-assembly-complete:default
online         Jun_30   svc:/milestone/multi-user:default
online         Jun_30   svc:/milestone/multi-user-server:default

清单 6.里程碑列表

上述的一些里程碑对应于传统系统运行级别 S (svc:/milestone/single-user)、2 (svc:/milestone/multi-user) 和 3 (svc:/milestone/multi-user-server)。其他则对应于系统配置框架 sysconfig 的内部实现。虽然也可以使用 svcadm 更改里程碑,但还是建议管理员继续使用 init 命令。

对服务进行一些基本的配置更改

有时可能需要修改服务实例后面的一些配置。Oracle Solaris 11 中的一个显著变化是将一些原来位于 /etc 中的系统配置移到 SMF 配置信息库。这一变化的一个主要动因是为了更加无缝地管理系统升级和保留配置,同时还可以轻松集成厂商自带的配置以提供没有在本地修改过的原生配置选项。SMF 配置信息库由 svc.configd 后台进程管理,已经过修改,将其配置作为一系列通过站点配置文件、系统配置文件和清单提供的管理性自定义项和配置存储在一系列层中。我们将在另一篇文章中进行详细介绍。

配置信息库的核心是属性组和属性。属性组恰如其名,是一组已被组织成逻辑分组的属性。在每个属性组中,可以有任意数量的属性,其中存储各种不同配置类型 — 简单字符串、整数、布尔值和网络地址等。属性和属性组可以针对给定服务实例,也可全局针对特定服务的所有实例。父服务和服务实例上设置的属性值可能不同,此时服务实例的值优先。

详细讨论如何修改 SMF 信息库中的更改之前,我们快速了解一下 svcprop 命令,看看如何用它列出给定服务或服务实例的属性组和属性。清单 7 显示将其用于 svc:/network/dns/client:default 实例。

# svcprop dns/client:default
general/complete astring
general/enabled boolean true
general/action_authorization astring solaris.smf.manage.name-service.dns.client
general/entity_stability astring Unstable
general/single_instance boolean true
general/value_authorization astring solaris.smf.manage.name-service.dns.client
config/value_authorization astring solaris.smf.value.name-service.dns.client
config/nameserver net_address 192.168.0.1
sysconfig/group astring naming_services
milestoneconfig_network_dns_client/entities fmri svc:/milestone/config
milestoneconfig_network_dns_client/external boolean true
milestoneconfig_network_dns_client/grouping astring optional_all
milestoneconfig_network_dns_client/restart_on astring none
milestoneconfig_network_dns_client/type astring service
location_dns-client/entities fmri svc:/network/location:default
...
restarter/state_timestamp time 1339662573.051463000
restarter_actions/auxiliary_tty boolean false
restarter_actions/auxiliary_fmri astring svc:/network/location:default
general_ovr/enabled boolean true

清单 7.列出属性组和属性

在清单 7 中,我们使用 svcprop 时未带任何其他选项,默认情况下看到的是一个组合视图,同时包括父服务和服务实例的属性。如果只是想查看实例属性,可以使用 -C 选项,如清单 8 所示。

# svcprop -C dns/client:default
general/complete astring
general/enabled boolean true
restarter/logfile astring /var/svc/log/network-dns-client:default.log
restarter/start_pid count 572
restarter/start_method_timestamp time 1339662573.041262000
restarter/start_method_waitstatus integer 0
restarter/transient_contract count
restarter/auxiliary_state astring dependencies_satisfied
restarter/next_state astring none
restarter/state astring online
restarter/state_timestamp time 1339662573.051463000
restarter_actions/auxiliary_tty boolean false
restarter_actions/auxiliary_fmri astring svc:/network/location:default
general_ovr/enabled boolean true

清单 8.仅列出实例属性

如果只想关注特定属性,可以使用 -p 选项指定属性组和属性。在这种情况下,我们要找服务而不是服务实例的 config/nameserver 属性。该属性用于取代 Oracle Solaris 早期版本中原来的 /etc/resolv.conf 文件,不过,为了与可能会分析该文件的应用兼容,已将该属性的值镜像到该文件。

# svcprop -p config/nameserver dns/client
192.168.0.1

我们已经了解了如何查询属性,现在看看另一个命令 svccfg,我们可以用它设置属性。svccfg 提供了多种不同的属性设置方式:直接在命令行设置、通过基于文本的交互式界面,或通过文件编辑器。让我们继续通过 svc:/network/dns/client 示例看看如何轻松地设置名称服务器配置。

# svccfg -s dns/client setprop config/nameserver = 10.0.0.1
# svccfg -s dns/client listprop config/nameserver
config/nameserver net_address 10.0.0.1

通常,对信息库中现有服务的更改要到服务实例刷新后才会生效。

# svcprop -p config/nameserver dns/client
192.168.0.1
# svcadm refresh dns/client:default
# svcprop -p config/nameserver dns/client
10.0.0.1

同样,我们也可以使用交互式界面进行这些更改。我们将 config/nameserver 的值改回其原始值 192.168.0.1,如清单 9 所示。

# svccfg
svc:> select dns/client
svc:/network/dns/client> listprop config/nameserver
config/nameserver net_address 10.0.0.1
svc:/network/dns/client> describe config/nameserver
config/nameserver net_address 10.0.0.1
    The value used to construct the "nameserver" directive in resolv.conf(4)
svc:/network/dns/client> setprop config/nameserver = 192.168.0.1
svc:/network/dns/client> listprop config/nameserver
config/nameserver net_address 192.168.0.1
svc:/network/dns/client> select default
svc:/network/dns/client:default> refresh
svc:/network/dns/client:default> exit

清单 9.使用交互式界面

svccfg 支持很多其他有用的命令,例如:listpg 列出给定服务的属性组,editprop 打开文本编辑器以便更轻松地同时配置多个属性,extract 允许管理员以 XML 文件形式轻松捕获服务定制,从而将其应用于其他系统。我们将在另一篇文章中进行详细介绍。

监视服务状态

Oracle Solaris 11 中 SMF 的一个新增特性是能够监视服务状态,如果状态更改便会通过电子邮件或 SNMP 陷阱收到通知。例如,可以快速设置通知检查是否有任何 SMF 服务进入 maintenance 模式或者特定服务进入 online 模式。举一个简单的例子,我们将电子邮件通知设置为在 SMF 服务进入 maintenance 模式时即刻发送,如清单 10 所示。

# svccfg setnotify -g maintenance mailto:admin@mycompany.com
# svccfg listnotify -g
    Event: to-maintenance (source: svc:/system/svc/global:default)
        Notification Type: smtp
            Active: true
            to: admin@mycompany.com

    Event: from-maintenance (source: svc:/system/svc/global:default)
        Notification Type: smtp
            Active: true
            to: admin@mycompany.com

清单 10.设置通知示例

默认情况下,SMF 将使用现有的简单电子邮件模板填写任何进入或退出 maintenance 状态的 SMF 服务的值;但可以通过在 mailto: 地址中设置一个参数 msg_template 轻松修改这一设置,如下所示:

# svccfg setnotify -g maintenance "'mailto:admin@mycompany.com?msg_template=/usr/local/share/new-smf-email-template'"

我们还可监视各个服务。在本例中,我们监视 svc:/network/http:apache22 Apache Web 服务器默认实例,看看其当前 online 状态是否有任何更改:

# svcs http:apache22
STATE          STIME    FMRI
online         Jun_14   svc:/network/http:apache22
# svccfg -s http:apache22 setnotify from-online mailto:admin@mycompany.com
# svccfg -s http:apache22 listnotify
    Event: from-online (source: svc:/network/http:apache22)
        Notification Type: smtp
            Active: true
            to: admin@mycompany.com

故障排除

介绍完一些使用 SMF 管理的基本知识之后,我们来快速看看服务的故障排除。要快速了解哪些服务因错误而停止运行,可以使用 svcs-xv 选项,如清单 11 所示。

# svcs -xv
svc:/system/identity:node (system identity (nodename))
 State: disabled since June 22, 2012 08:11:14 PM NZST
Reason: Disabled by an administrator.
   See: http://sun.com/msg/SMF-8000-05
   See: man -M /usr/share/man -s 4 nodename
   See: /var/svc/log/system-identity:node.log
Impact: 5 dependent services are not running:
        svc:/network/rpc/bind:default
        svc:/network/rpc/gss:default
        svc:/system/filesystem/autofs:default
        svc:/network/rpc/smserver:default
        svc:/network/nfs/mapid:default

清单 11.确定哪些服务出错

在本例中,我们遇到一个简单问题:svc:/system/identity:node 被禁用,导致五个依赖于它的服务不能运行。启用它即可修复问题。

另外一种故障原因可能是缺少配置文件,比如本示例中的 svc:/application/management/net-snmp:default

# svcs -xv
svc:/application/management/net-snmp:default (net-snmp SNMP daemon)
 State: offline since June 22, 2012 08:17:28 PM NZST
Reason: Dependency file://localhost/etc/net-snmp/snmp/snmpd.conf is absent.
   See: http://sun.com/msg/SMF-8000-E2
   See: man -M /usr/share/man/ -s 8 snmpd
   See: /var/svc/log/application-management-net-snmp:default.log
Impact: This service is not running.

修复问题之后(确保文件 snmpd.conf 存在),需要重新启动服务。

另外一种故障原因可能是配置文件错误或缺少可执行文件,比如这里的 svc:/network/http:apache22

# svcs -xv
svc:/network/http:apache22 (Apache 2.2 HTTP server)
 State: maintenance since June 22, 2012 08:23:35 PM NZST
Reason: Method failed.
   See: http://sun.com/msg/SMF-8000-8Q
   See: man -M /usr/apache2/2.2/man -s 8 httpd
   See: http://httpd.apache.org
   See: /var/svc/log/network-http:apache22.log
Impact: This service is not running.

在本例中,无法从错误的概要中清楚地知晓故障原因,我们只知道服务现在处于维护状态,需要管理员明确的干预。接下来就应该查看 /var/svc/log/network-http:apache22.log 中的服务日志,如清单 12 所示,日志很快可以显示问题所在。

# tail /var/svc/log/network-http\:apache22.log
[ Jun 22 20:22:34 Method "stop" exited with status 0. ]
[ Jun 22 20:22:34 Executing start method ("/lib/svc/method/http-apache22 start"). ]
Apache version is 2.2
[ Jun 22 20:22:35 Method "start" exited with status 0. ]
[ Jun 22 20:23:35 Stopping because service restarting. ]
[ Jun 22 20:23:35 Executing stop method ("/lib/svc/method/http-apache22 stop"). ]
Apache version is 2.2
/usr/apache2/2.2/bin/apachectl[86]: /usr/apache2/2.2/bin/httpd: not found 
[No such file or directory]
Server failed to start. Check the error log (defaults to 
/var/apache2/2.2/logs/error_log) for more information, if any.
[ Jun 22 20:23:35 Method "stop" exited with status 95. ]

清单 12.查看服务日志

我们可以很容易地看到,系统缺少可执行文件 /usr/apache2/2.2/bin/httpd。只需通过 pkg fix apache-22 命令使用 IPS 软件包管理器还原缺少的文件,即可轻松修复此问题。确定并修复问题之后,我们需要清除 SMF 服务的状态:

# svcadm clear http:apache22
# svcs http:apache22
STATE          STIME    FMRI
online         20:34:04 svc:/network/http:apache22

虽然上面的一些示例依赖于通过 svcs/var/svc/log 中的服务日志查看服务状态的输出,但有时需要查看该服务的 SMF 重新启动器(svc.startd 或委托的重新启动器)的日志。如果是前者,可在 /var/svc/log/svc.startd.log 下找到日志。在另一篇文章中,我们将介绍其他故障排除提示,针对以上方法不起作用的情况。

总结

服务管理工具 (SMF) 为管理 Oracle Solaris 11 系统服务和应用的管理员提供了许多好处,包括服务自动重新启动、统一的服务配置和与故障管理框架整合。与传统的 init 系统不同,管理员使用全方位服务依赖项检查和并行服务启动功能管理服务(而不是进程),这样做的好处是系统状态更一致、可管理性更强。

另请参见

关于作者

Glynn Foster 是 Oracle Solaris 的首席产品经理,负责技术领域,包括映像包管理系统和服务管理工具。Glynn 于 2010 年随着 Oracle 收购 Sun Microsystems 而加入 Oracle。

修订版 1.0,2012 年 8 月 6 日

要了解所有 Oracle 技术中与系统管理员相关的内容,请在 FacebookTwitter 上关注 OTN Systems。