Service Management Facility快速入门

在解决前面scstat问题的时候,仔细的研读了一下这个sun的官方帮助,加深了对Solaris的服务的理解。在Solaris中,可以利用svcs 和svcadm 命令进行查看和修改、重启服务。下面就转载一下Service Management Facility这篇快速入门

简介

过去,UNIX 操作系统包含一组服务:这些服务是与任何交互式用户登录都不关联的软件程序,用于侦听和响应请求以执行特定的任务(如传送电子邮件、响应 ftp 请求,或允许执行远程命令)。这些传统服务通常是一些单独的应用程序,它们作为单个进程执行,在系统引导时启动,并在系统启动和运行时持续执行,可处理接收到的任何请求。

如今,管理员必须管理一系列服务,这些服务的作用已经超出了此原始模型的作用范围。Sun 推出了 Service Management Facility(SMF,服务管理工具),以简化这些系统服务的管理。SMF 是 Solaris 操作系统的一项新功能,为每个 Solaris 系统上的服务和服务管理创建支持的、统一的模型。它是 Solaris 10 中预测性自我修复技术的核心部分,为软件和硬件故障以及管理错误提供自动恢复功能。

在本指南中,我们将介绍 SMF 的功能及优势,指出 Solaris 中显著更新的部分,并说明如何使用 SMF 完成典型的管理任务。可以在 Sun 的 BigAdmin Web 站点上找到 SMF 及预测性自我修复功能的详细指南。

功能

Service Management Facility 已经改进了 Solaris 管理模型的几个方面。一些最显著的更新包括:

* 服务由可以进行查看(使用新的 svcs(1) 命令)和管理(使用 svcadm(1M) 和 svccfg(1M))的一级对象表示。
* 无论失败的服务是由管理员错误、软件错误导致,还是受无法更正的硬件错误的影响,这些服务都将按照相关性顺序自动重新启动。
* 可以获取有关配置错误或行为异常的服务的详细信息,包括对服务未运行的原因的说明(使用 “svcs -x”),以及每个服务单独的持久性日志文件。
* 引导过程中出现的问题比较容易调试,因为在启动故障期间可以控制引导详细程度,记录服务启动消息,以及提供更可靠的控制台访问。
* 自动拍摄服务配置快照,从而更容易备份、恢复和撤消对服务所做的更改。
* 可以使用受支持的工具 (svcadm(1M)) 启用和禁用服务,从而允许更改不受升级和修补程序的影响而保留原样。
* 管理员可以更容易地将任务安全地委派给非超级用户,这些任务包括配置、启动、停止或重新启动服务(如 smf_security(5) 手册页中所述)。
* 根据服务的相关性并行启动服务,可以更快地引导大型系统。


尽管进行了上述更改,但最大程度地保留了与现有管理习惯的兼容性。例如,大多数站点本地的 “rc” 脚本和 ISV 提供的 “rc” 脚本仍将有效。

显著的更改

SMF 提供的大多数新功能都在“后台”工作,或通过新命令进行访问;但某些更改仍会很快显示出来。以下显示了其中的一些更改。

在早期版本的 Solaris 中,大量输出将在引导期间打印到系统控制台。尽管这些消息对所发生的情况进行了比较深入的阐述,但在某些方面并不十分有用。少数服务可能会打印消息,表明它们已联机,而许多其他服务则不打印消息。某些故障模式也可能会打印一些消息(如 “WARNING:Timed out waiting for NIS to come up”),这些消息并不能帮助诊断根本问题。错误消息有时直接打印到控制台,但不会在任何日志中显示。

现在,引导过程中显示的消息精简了许多。以下是在 SMF 下引导时计算机所显示内容的示例:

SunOS Release 5.10 Version Generic 64-bit
Copyright 1983-2004 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
Hostname: demobox
NIS domain name is testlab.example.com
checking ufs filesystems

demobox console login:

尽管打印的消息变少了,但 SMF 使得引导过程更加清晰。每个服务在 /var/svc/log 目录(对于在单个用户的重大事件之前启动的服务,则为 /etc/svc/volatile 目录)中都有一个日志文件,指出服务启动的时间和方式、是否成功启动,以及在初始化期间可能打印的所有消息。如果在引导期间发生严重问题,则您可以在维护模式下登录到控制台,并可使用 svcs(1) 命令帮助诊断此问题。即使问题导致引导挂起(如上面提到的 NIS 故障)时也是如此。最后,新的 “-m” 引导选项(请参见 kernel(1M))允许您将引导过程配置得更加详细,可以在每个服务启动时打印一条简单消息。

您可能还会注意到,中止进程后进程会“拒绝中止”。例如:

# ps -fp `pgrep -d, sendmail`
UID PID PPID C STIME TTY TIME CMD
root 330 1 0 14:21:05 ? 0:00 /usr/lib/sendmail -bd -q15m
smmsp 331 1 0 14:21:05 ? 0:00 /usr/lib/sendmail -Ac -q15m
# pkill -9 sendmail
# ps -fp `pgrep -d, sendmail`
UID PID PPID C STIME TTY TIME CMD
root 530 1 0 14:51:02 ? 0:00 /usr/lib/sendmail -bd -q15m
smmsp 531 1 0 14:51:02 ? 0:00 /usr/lib/sendmail -Ac -q15m

初看起来,尽管使用了 kill -9,却似乎没有发生任何情况。但是请注意,PID 是不同的,并且进程的启动时间已经更改;事实上,旧的 sendmail 进程确实已经中止。

通过 SMF,Solaris 内核可以考虑服务、此服务的进程和其他服务(负责重新启动此服务)之间的关系。此重新启动关系与 Sun 的新技术紧密集成,用于在 Solaris 上进行故障管理,从而允许 SMF 重新启动程序了解服务进程失败的原因是管理员错误、相关服务故障、软件错误还是根本的硬件故障。只要在任何服务故障之后捕获到此信息,SMF 就会通知相应的重新启动程序,该程序将确定是通过将此服务置于维护模式来禁用服务(因为它看起来存在问题),还是自动重新启动该服务。缺省的 SMF 重新启动程序 svc.startd 负责启动和重新启动 Solaris 系统上的大多数服务。在以上示例中,svc.startd 注意到 sendmail 已中止,针对此情况记录了一条消息,并自动重新启动 sendmail。

如果您要停止某个服务但不重新启动其进程,请使用 svcadm(1M) 命令(请参见以下“常规任务”部分)。另外请注意,并非所有的系统服务都已转为使用 SMF;属于这些传统服务的任何进程在中止后都不会重新启动。

最后您可能会注意到,与以前的 Solaris 发行版相比,/etc/init.d 和 /etc/rc*.d 目录以及 /etc/inittab 文件中的内容现在要少得多。SMF 管理的服务不再使用 rc 脚本或 inittab 条目进行启动和关闭,因此与这些服务对应的脚本已被删除。在将来的 Solaris 发行版中,SMF 将管理更多的服务,并且这些目录中的内容将会越来越少。用于管理 ISV 提供或本地开发的服务的 rc 脚本和 inittab 条目将继续在引导时运行。与推出 SMF 之前的情况不同,这些服务可能不会在引导过程中的同一时刻运行,但一定不会在引导过程之前运行,因此其非明确依赖的任何服务仍将可用。

服务名称

Solaris 使用称为 FMRI(Fault Managed Resource Identifier,故障管理资源标识符)的 URI 字符串来标识为其提供了高级故障和资源管理功能的系统对象。SMF 所管理的服务被分配了前缀为方案名称 “svc” 的 FMRI 字符串,如以下的 Solaris 服务 syslogd(1M) 示例所示:

* svc://localhost/system/system-log:default
* svc:/system/system-log:default
* system/system-log:default

请注意,SMF 所使用的这些服务 FMRI 有以下三种表示方法:第一种是包含位置路径(如 “localhost”)的绝对路径;第二种是相对于本地计算机的路径;第三种仅仅是省略了字符串前缀的服务标识符。本文档其余部分所介绍的 SMF 管理员工具通常使用第三种形式来描述服务(因为假定这些服务作用于本地服务)。可在多种资源上或跨计算机操作的其他管理工具可能使用其他形式来描述服务。当前 Solaris 发行版中的 SMF 工具只能管理本地主机上的服务。

由于 FMRI 字符串非常长,因此 SMF 工具允许使用缩写形式的 FMRI。缩写必须具有唯一性,必须与服务名称的结尾部分相匹配(但 “:default” 可以省略),并且必须以 “/” 开头。因此上述 FMRI 可以使用以下缩写:

* system-log:default
* system-log

使用这些缩写时应非常谨慎,因为可能会在包含相同子串的某一点添加新服务(如 “svc:/mysite/system-log:default”)。如果使用非唯一的缩写,SMF 工具将打印警告消息。

Solaris 系统服务的 FMRI 包含一般功能类别,如“应用程序”、“重大事件”、“网络”、“平台”和“系统”,以及与服务的守护进程或旧的 rc 脚本名称相似的描述性名称。svcs(1) 命令将列出计算机上可用的所有活动服务:

% svcs
STATE STIME FMRI

online 11:19:35 svc:/network/nfs/status:default
offline 18:20:30 svc:/application/print/rfc1179:default
maintenance 18:20:26 svc:/network/ntp:default

由于服务现在是一级对象,因此 SMF 甚至可以通过使用 svcs(1) 命令的 “-a” 选项提供有关未启用的服务的信息。

常规任务

SMF 是 Solaris 中一项特别显著的更改,因为它影响了管理模型。因此,尽管我们鼓励您阅读有关 SMF 功能的详细信息(请参见以下“详细信息”部分),但您可能还是希望从学习如何执行一些常规系统管理任务开始。

*

启用和禁用服务

在 Solaris 10 之前的版本中,没有一个很好的方法来永久禁用 Solaris 中的服务。常用方法是将相应的 rc 脚本重命名为不再执行的名称,但在下一次系统升级后此更改将会失效。此外,基于 inetd 的服务是通过一种完全不同的方法(即编辑配置文件)启用和禁用的。在 SMF 下,可以使用 svcadm(1M) 命令配置这两种类型的服务,并且在计算机升级后这些更改将持续有效。以下是对启用和禁用某些服务的方式的比较:
旧方法

SMF 方法
mv /etc/rc2.d/S75cron /etc/rc2.d/x.S75cron

svcadm disable system/cron:default
编辑 /etc/inet/inetd.conf,将 finger 行取消注释

svcadm enable network/finger:default

在上述示例中,svcadm 的最后一个参数是服务的 FMRI。

请注意,svcadm 仅用于 SMF 服务,由 rc 脚本控制的传统服务与在早期发行版中的工作方式相同。
*

停止、启动和重新启动服务

过去,服务已由引导时运行的 rc 脚本启动,并通过 start 参数运行。一些 rc 脚本提供了 stop 选项,少数 rc 脚本还允许使用 restart。在 SMF 中,这些任务都是通过 svcadm(1M) 命令完成的:
旧方法

SMF 方法
/etc/init.d/sshd stop

svcadm disable -t network/ssh:default
/etc/init.d/sshd start

svcadm enable -t network/ssh:default
/etc/init.d/sshd stop; /etc/init.d/sshd start

svcadm restart network/ssh:default
kill -HUP `cat /var/run/sshd.pid`

svcadm refresh network/ssh:default

svcadm enable 和 svcadm disable 的 “-t” 选项表示所请求的操作应该是临时的 (temporary),它不会影响此服务是否会在系统下一次引导时启动。这与上述“启用和禁用服务”示例形成了对比。

与启用和禁用服务一样,不应该使用 svcadm 控制由 rc 脚本控制的服务;这些服务将始终按早期发行版中的方式工作。
*

观察引导过程

如“显著的更改”部分所述,在缺省情况下,引导过程与早期的 Solaris 发行版相比要精简得多。这样就减少了不能提供有价值信息的“无用消息”,这些“无用消息”可能会导致引导期间发生的任何实际问题不容易被发现。

已添加一些新的引导选项,以控制引导的详细程度。您可能会发现一个特别有用的选项 “-m verbose”,该选项在每个服务尝试启动时打印一行信息。这与基于 Unix 和与 Unix 相似的某些其他操作系统的缺省引导模式相似。详细的引导过程如下所示:

{1} ok boot -m verbose

Rebooting with command: boot -m verbose
Boot device: /pci@1c,600000/scsi@2/disk@0,0:a File and args: -m verbose
SunOS Release 5.10 Version Generic 64-bit
Copyright 1983-2004 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
[ network/pfil:default starting (pfil) ]
[ network/loopback:default starting (Loopback network interface) ]
[ system/filesystem/root:default starting (Root filesystem mount) ]
Oct 18 13:53:02/13: system start time was Mon Oct 18 13:52:57 2004
[ network/physical:default starting (Physical network interfaces) ]
[ system/filesystem/usr:default starting (/usr and / mounted read/write) ]
( more service messages elided )
[ system/filesystem/local:default starting (Local filesystem mounts) ]
[ network/ntp:default starting (network time protocol (NTP)) ]
[ system/utmp:default starting (utmpx monitoring) ]
[ system/filesystem/local:default starting (Local filesystem mounts) ]
[ system/console-login:default starting (Console login) ]

demobox console login: checking ufs filesystems
/dev/rdsk/c0t0d0s7: is logging.
Oct 18 13:53:14/50: system/system-log:default starting
Oct 18 13:53:14/51: network/inetd:default starting
Oct 18 13:53:14/52: system/cron:default starting
( more service messages elided )

服务启动消息的顺序在每次引导时可能会有所不同,因为 SMF 将按照服务的相关性关系并行启动这些服务。

如果服务无法成功启动,则除了打印启动消息之外,还会打印警告消息。以下是 NTP 服务无法启动的一个示例:

[ system/filesystem/local:default starting (Local filesystem mounts) ]
[ network/ntp:default starting (network time protocol (NTP)) ]
Oct 25 13:58:42/49 ERROR: svc:/network/ntp:default:
Method “/lib/svc/method/xntp” failed with exit status 96.
Oct 25 13:58:42 svc.startd[4]: svc:/network/ntp:default:
Method “/lib/svc/method/xntp” failed with exit status 96.
[ network/ntp:default misconfigured (see ‘svcs -x’ for details) ]
[ system/utmp:default starting (utmpx monitoring) ]
( more service messages elided )

前两条错误消息在正常引导和详细引导期间都会显示;最后一条错误消息 (“network/ntp:default misconfigured …”) 仅在详细引导期间显示。
*

发现故障

Solaris 尚未提供一个全面的用于查找系统服务问题的方法。目前存在一些可帮助捕获并诊断这些问题的解决方案,包括使用 coreadm(1M) 命令记录到特定于站点的监视脚本,以及 Sun Cluster 等综合性产品。新的 svcs(1) 命令包含一个“解释”选项 (“svcs -x”),可打印出有关未运行服务的详细消息(由解决方案驱动)。svcs -x 将显示服务失败的时间和原因,提供获取此问题详细信息的方式,并列出受此问题影响的其他服务。

继续来看一下无法启动的 NTP 服务的示例:

# svcs -x
svc:/network/ntp:default (Network Time Protocol (NTP).)
State: maintenance since Mon Oct 18 13:58:42 2004
Reason: Start method exited with $SMF_EXIT_ERR_CONFIG.
See: http://sun.com/msg/SMF-8000-KS
See: ntpq(1M)
See: ntpdate(1M)
See: xntpd(1M)
Impact: 0 services are not running.

NTP 服务已被置于维护模式,因为启动脚本指示该服务的配置存在问题。有关服务故障的详细信息,请参见 /var/svc/log 目录(或 /etc/svc/volatile 目录)中该服务的日志文件。日志文件名基于简短形式的 FMRI,将 “/” 替换为 “-“。因此,svc:/network/ntp:default 服务的日志文件为 /var/svc/log/network-ntp:default.log。通过此日志文件可以快速得出结论,即 NTP 守护进程的配置文件 /etc/inet/ntp.conf 已被删除。

以下是另一个示例,显示了 SMF 可以跟踪相关性,并指出与禁用的服务相关的问题。在此示例中,我们使用 “-v” 选项来查看受影响的服务的列表。

# svcs -x -v
svc:/application/print/server:default (LP Print Service)
State: disabled since Mon Oct 18 16:17:27 2004
Reason: Disabled by an administrator.
See: http://sun.com/msg/SMF-8000-05
See: man -M /usr/share/man -s 1M lpsched
Impact: 1 service is not running:
svc:/application/print/rfc1179:default

在以上示例中,已明确禁用了 application/print/server:default 服务,但未禁用依赖于该服务的另一个服务 (application/print/rfc1179:default)。因此,禁用第一个服务已使得第二个服务无法运行。
*

观察服务

在早期版本的 Solaris 中,查看可用服务的唯一方法是使用 ps(1) 命令,并列出系统上所有的活动进程,然后查看与服务应用程序的名称相匹配的进程名称。遗憾的是,由于大多数系统都有许多进程,并且每次发行新版本的 Solaris 以及添加其他软件包时都会引入新服务,因此使用此方法进行跟踪非常困难。如今的许多服务已不再作为单个进程执行,这使得情况更加复杂。某些服务作为一系列进程或多线程进程执行,或者同时以这两种方式执行。

使用新的 svcs(1) 命令,可以更容易地观察系统服务的状态。”-p” 选项可显示与服务关联的所有进程:

% svcs -p network/smtp:sendmail
STATE STIME FMRI
online 18:20:30 svc:/network/smtp:sendmail
18:20:30 655 sendmail
18:20:30 657 sendmail

% ps -fp 655,657
UID PID PPID C STIME TTY TIME CMD
root 655 1 0 18:20:30 ? 0:01 /usr/lib/sendmail -bd -q15m
smmsp 657 1 0 18:20:30 ? 0:00 /usr/lib/sendmail -Ac -q15m

“-d” 选项可显示此服务所依赖的其他服务,而 “-D” 选项可显示依赖于此服务的其他服务:

% svcs -d network/smtp:sendmail
STATE STIME FMRI
online 18:20:14 svc:/system/identity:domain
online 18:20:26 svc:/network/service:default
online 18:20:27 svc:/system/filesystem/local:default
online 18:20:27 svc:/milestone/name-services:default
online 18:20:27 svc:/system/system-log:default
online 18:20:30 svc:/system/filesystem/autofs:default
% svcs -D network/smtp:sendmail
STATE STIME FMRI
online 18:20:32 svc:/milestone/multi-user:default

我们可以看到,sendmail 要求在运行之前先运行网络服务、本地文件系统服务、名称服务、系统日志守护进程以及自动安装守护进程,并且 sendmail 自身必须在到达多用户重大事件之前运行。服务启动时间(STIME 列)表明已遵循这些相关性。
*

更改运行级别

SMF 引入了重大事件 (milestone)的概念,它代替了传统的运行级别概念。运行级别对计算机上运行的一组服务进行了基本描述,这些服务通常分为一个用户登录到计算机控制台所需的服务(运行级别 S),以及多个用户登录到计算机所需的服务(运行级别 2 和 3)。这些系统状态在 SMF 中表示为重大事件,重大事件是代表一组其他服务的稳定服务。”svcs -d” 可用于查看必须在到达重大事件之前运行的服务。

svcadm(1M) 现在是设置系统缺省运行级别的首选方法。此方法是使用 milestone 子命令和有效重大事件的 FMRI 完成的:
旧方法

SMF 方法
编辑 /etc/inittab

svcadm milestone -d milestone/single-user:default

“-d” 选项表示缺省 (default) 重大事件应该设置为指定的 FMRI。如果不使用 “-d”,则 “svcadm milestone” 会立即将系统转换到指定的重大事件。

引导过程已更新为可以识别重大事件。除了传统的 “boot -s”(引导到单用户模式)之外,现在还可以通过 “boot -m milestone=” 引导到指定的重大事件。 可以是 “single-user”、”multi-user” 或 “multi-user-server”,以及特殊的重大事件 “all”(所有已启用的联机服务)和 “none”(无任何服务)。”none” 重大事件对于修复在引导过程初期发生故障的系统可能非常有用。

引导到单用户重大事件(使用 “-m milestone=single-user”)和旧的 “boot -s” 略有不同。如果系统已明确引导到某个重大事件,则退出控制台管理 shell 时不会像 “boot -s” 一样将系统转换到多用户模式。要在运行 “boot -m milestone=single-user” 之后转到多用户模式,请使用命令 “svcadm milestone milestone/multi-user-server:default”。
*

启用、禁用和监视传统服务

一般说来,由传统 rc 脚本启动的服务(也称为传统服务)将继续以原始方式工作。这些服务将在 svcs(1) 的输出中显示,同时还显示 FMRI(基于服务 rc 脚本的路径名),但它们不受 svcadm(1M) 控制。应该通过直接运行 rc 脚本停止或启动这些服务。

如“显著的更改”部分所述,与早期版本的 Solaris 不同,rc 脚本可能不会在引导过程中的同一时刻运行。特别是,必须在 Solaris 提供的某些 rc 脚本之前运行的脚本可能会出现问题。但是,绝大多数脚本都应该可以继续工作,而不会出现任何问题。
*

将新服务添加到 inetd.conf

Internet 服务守护进程 inetd(1M) 已重新编写为 SMF 的一部分。它将所有配置数据都存储在 SMF 数据库(而不是 /etc/inet/inetd.conf)中,从而允许使用 SMF 工具控制和观察基于 inetd 的服务。大多数 Solaris 随附的基于 inetd 的服务在 inetd.conf 中不再有任何条目。为了对尚未转换为 SMF 的服务提供兼容性,仍然可以使用惯用的语法将条目添加到 inetd.conf 中,而新的 inetconv(1M) 命令可将新服务转换为 SMF 服务。inetconv 应该始终在编辑 /etc/inet/inetd.conf 之后运行;运行该命令时可以不使用任何参数。

详细信息

要了解有关 SMF 的详细信息,请参见以下文档:

* SMF 系统管理指南。

This entry was posted in 主机 and tagged . Bookmark the permalink.

One Response to Service Management Facility快速入门

  1. Pingback: Solaris IPMP

Leave a Reply

Your email address will not be published. Required fields are marked *