Java Solaris 加入Sun中国技术社区 我的社区 注册说明

BigAdmin 系统管理门户网站
Feature Article
BigAdmin 专题文章:Solaris 10 操作系统功能亮点:预测性自我修复

Solaris 10 操作系统功能亮点:预测性自我修复

Amy Rich,2004 年 11 月

目录:

按照传统,在 Solaris 系统上出现硬件或软件故障时,通常将一条消息记录到 /etc/syslog.conf 中指定的相应设备,而诊断和修复的其余工作留给管理员完成。Solaris 10 操作系统中引入了预测性自我修复技术,它可以通过 Software Express for Solaris 程序进行预览。预测性自我修复是一种新设计的内聚性体系结构和方法,用于自动诊断、报告和处理软件和硬件故障情况。这项新技术减少了调试硬件或软件问题所需的时间,并为管理员和 Sun 技术支持人员提供有关每个故障的详细数据。该体系结构由事件管理协议、故障管理器以及软件故障处理软件(Solaris 服务管理器)组成。


Solaris 故障管理器

出现硬件故障时,预测性自我修复会发出二进制遥测事件(稍后由基础软件进行关联),这对传统的 syslog 消息是一个补充。然后基础软件将自动诊断故障并通知管理员,如有可能,还会采取纠正措施。Sun 的故障管理器还提供了故障代码,并且如果 http://www.sun.com/msg/ 上具有相应的知识库文章,还会将管理员引向这些文章。最初实现的 Sun 故障管理器包含各种 SPARC CPU、内存和 I/O 总线互连组件。计划在以后的发行版中提供适用于 x86 平台上 Solaris 操作系统的模块。

系统管理员与 Sun 故障管理器的主要交互是通过故障管理器守护进程 fmd(1M) 进行的。fmd(1M) 在引导时启动并切换到后台运行(有关完整详细信息,请参见 fmd(1M) 手册页),然后继续监视正在运行的系统。在某个组件发生错误时,故障管理系统会处理该错误,然后使该错误报告数据与以前的错误报告和其他相关信息相关联,以便诊断潜在故障并对其作出响应。进行诊断后,故障管理器为问题分配一个通用唯一标识符 (Universal Unique Identifier, UUID),该标识符用于区分任何系统集上的问题。如有可能,fmd(1M) 将启动自我修复故障组件的步骤。fmd(1M) 程序还将故障记录到 syslogd 并/或在适当情况下通知管理员。

故障管理资源标识符

故障管理资源标识符 (Fault Managed Resource Identifier, FMRI) 标识故障管理器中的资源,以用于传播故障和错误事件。故障管理器命名方案(其中 FMRI 是 URI 子类)基于 RFC 2396 中定义的 URI 语法。FMRI 语法具有任意数目的不同方案,每个方案命名一个相关资源树。FMRI 可以表示为 URI 字符串或组件名-值对。例如,在 Sun Fire 15K 服务器上域 A 的系统板 3 上,内存模块 2 的内存区 1 中 DIMM 0 的 FMRI 可以表示为以下 URI 字符串。(注:在实际使用中不应该换行。)

hc://chasis-id=138A2036,product-id=SunFire15000,domain-id=A/system-board=3/cpu-
module=2/memory-bank=1/dimm=0

或表示为组件名称对:

组件名称对
名称 类型
名称 类型
方案 hc 字符串
授权 chassis-id: 138A2036
product-id: SunFire15000
domain-id: A
授权
系统板 3 uint32_t
cpu 模块 2 uint32_t
内存区 1 uint32_t
dimm 0 uint32_t
 

故障管理器将以下一种状态与每个 FMRI 关联:

  • ok:资源存在且正在使用中,没有已知问题。
  • unknown:资源不存在或者无法使用,但没有已知问题。这可能表示资源已被管理员禁用或取消配置。
  • degraded:资源存在且可用,但是诊断出一个或多个问题。
  • faulted:资源存在但无法使用,因为已诊断出一个或多个不可修复的问题。资源已被禁用,以防止进一步损坏系统,需要进行人工干预。

故障管理器命令行工具

故障管理器在 Solaris 上的实现包括用于观察和修改 fmd(1M) 及其模块行为的几种命令行工具。管理员将使用的最常见工具是 fmadm(1M)fmdump(1M)fmstat(1M) 工具。

使用 fmadm(1M) 实用程序可以查看、装入和卸载模块以及查看和更新资源高速缓存。它为系统管理员提供了一种显示 fmd(1M) 认为有故障的每个资源的方法。最常见的 fmadm(1M) 子命令(有关完整的详细信息,请参见 fmadm(1M) 手册页)如下:

  • config:显示配置,包括每个组件模块的模块名称、版本和描述。
  • faulty [-ai]:显示当前认为有故障的资源的列表。为每个资源列出 FMRI、资源状态和诊断的 UUID。缺省情况下,fmadm faulty 命令仅列出当前存在且有故障的资源的输出。如果指定了 -a 选项,则列出故障管理器缓存的所有资源信息,包括系统中不再存在的组件的信息。如果指定了 -i 选项,则显示故障管理器中每个资源的持久性高速缓存标识符,而不是最新状态和 UUID。
  • load path:装入指定的模块。指定的路径必须是绝对路径,且指向存在于某个已定义的模块目录中的模块。
  • unload module:卸载指定的模块。模块名称是在 fmadm config 输出中指定的名称。故障管理器通常基于系统配置自动装入和卸载模块,因此应很少使用此命令。
  • rotate errlog | fltlog:计划轮转指定的故障管理器日志文件。日志文件由使用此子命令的 logadm(1M) 配置文件中的条目自动轮转。

使用 fmdump(1M) 程序,系统管理员可以查看与 fmd(1M) 关联的任何日志文件和检索任何诊断的特定详细信息。缺省情况下,fmdump(1M) 命令显示故障日志,但是如果指定了 -e 命令行开关,将显示错误日志。fmdump(1M) 命令还可以采用命令行选项以便仅选择某些事件(有关完整的详细信息,请参见 fmdump(1M) 手册页):

  • -c class:选择与指定类匹配的事件。
  • -t time:选择在指定时间或指定时间之后发生的事件。
  • -T time:选择在指定时间或指定时间之前发生的事件。
  • -U UUID:选择与指定的 UUID 匹配的事件。

通过指定 -v-V,可以获取任何命令的更为详细的输出。

fmstat(1M) 程序旨在报告故障管理系统的统计信息。如果指定了 -m module 参数,则 fmstat(1M) 将报告由指定的 module 所保存的统计信息。如果未指定 -m,则 fmstat(1M) 将报告每个模块的以下统计信息(有关完整的详细信息,请参见 fmstat(1M) 手册页):

  • modulefmadm config 报告的模块的名称
  • ev_recv:模块收到的事件数
  • ev_acpt:模块接受的与诊断相关的事件数
  • wait:等待模块检查的事件平均数
  • svc_t:模块收到的事件的平均服务时间(以毫秒为单位)
  • %w:存在等待处理的事件的时间百分比
  • %b:模块忙于处理事件的时间百分比
  • open:模块拥有的活动案例数
  • solve:模块自装入以来所解决的案例数
  • memsz:当前由模块分配的动态内存量
  • bufsz:当前由模块分配的持久性缓冲区空间量

预测性自我修复故障管理器示例

出现 CPU 故障时,管理员可能会在控制台上看到以下消息,而且它将被记录到系统日志中:

SUNW-MSG-ID: SUN4U-8000-6H, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Sun Oct 17 14:15:50 PDT 2004
PLATFORM: SUNW,Sun-Blade-1000, CSN: -, HOSTNAME: myhost
EVENT-ID: 64fe6c23-12b7-ccd1-f0a7-b531941738f8
DESC: The number of errors associated with this CPU has exceeded acceptable levels. 
Refer to http://sun.com/msg/SUN4U-8000-6H for more information.
AUTO-RESPONSE: An attempt will be made to remove the affected CPU from service.
IMPACT: Performance of this system may be affected.
REC-ACTION: Schedule a repair procedure to replace the affected CPU.Use fmdump 
-v -u <EVENT_ID> to identify the CPU.

CPU 状态从 ok 更改为 faulted,使用该 CPU 的进程已终止,并且 CPU 处于脱机状态。可以使用 psrinfo(1M) 命令查看 CPU 的状态:

psrinfo

0	on-line   since 09/27/2004 16:57:30
1	faulted   since 10/17/2004 14:15:50

运行故障消息中列出的 fmdump(1M) 命令,使用 EVENT-ID 获取有关故障的详细信息。输出显示 CPU 1 有问题,需要更换 Slot 1 中的组件。可以在主板上找到丝网印制的文本 Slot 1(指示有问题的部件的位置)。

fmdump -v -u 64fe6c23-12b7-ccd1-f0a7-b531941738f8

TIME                 UUID                                 SUNW-MSG-ID
Oct 17 14:15:50.1630 64fe6c23-12b7-ccd1-f0a7-b531941738f8 SUN4U-8000-6H
  100%  fault.cpu.ultraSPARC-III.l2cachedata
         FRU: hc:///component=Slot 1
        rsrc: cpu:///cpuid=1/serial=1107C270C8A

得到替换 CPU 后,就可以替换 Slot 1 中有问题的 CPU 并重新启用它。


Solaris 服务管理器

为了更好地处理软件故障,Sun 重新设计了启动和监视服务的方法。Solaris 10 操作系统中的许多程序已转为使用 Solaris 服务管理器的服务管理框架 (service management framework, smf) 来启动、停止、修改和监视程序,而不使用传统的 /etc/init.d 启动脚本。服务管理器还用于标识软件相关性和确保按正确顺序启动服务。如果某个服务(如 sendmail)突然停止,服务管理器将自动验证 sendmail 服务所需的程序是否正在运行,并重新启动必要的程序。出现硬件故障且硬件脱机时,服务管理器可以重新启动服务管理器控制的任何程序(需要停止这些程序以便从服务中删除硬件)。

服务管理器所控制的每个服务由 XML 配置文件(称为清单)控制,该文件定义服务名称、类型、所有相关性和其他重要信息。这些清单存储在系统信息库中,可以由系统信息库守护进程 svc.configd(1M) 查看和修改。系统信息库由主重新启动程序守护进程 svc.startd(1M)(评估相关性并根据需要启动服务)读取。传统的 inetd 服务现在也是服务管理器的一部分。通过与任何其他服务管理器启用的程序相同的机制,可以启用、禁用或重新启动任何 inetd 服务。

服务管理器命令行工具

服务管理器由许多程序组成,其中一些程序用于供管理员查看和管理服务及服务属性。这些命令包括:svcadm(1M)svcprop(1)svcs(1)svccfg(1M)。此外还有命令 inetconv(1M)inetadm(1M),它们用于帮助转换传统的 inetd 服务,并在服务管理器框架中管理这些服务。

svcadm(1M) 命令允许对服务配置系统信息库中的服务实例进行激活、取消激活和状态处理。修改这些属性使负责的委托重新启动程序执行相应操作,将服务实例置于合适的状态。如果未委托服务,则主重新启动程序将执行这些功能。-v 开关用于将详细信息输出到标准输出。svcadm(1M) 的有效子命令如下:

  • disable [-t] [FMRI | pattern]:禁用操作数指定的服务实例。如果指定了 -t 选项,则在重新引导时实例将回复到以前启用的设置(可能已被禁用)。
  • enable [-rt] [FMRI | pattern]:启用操作数指定的服务实例。如果指定了 -r 选项,则启用实例并以递归方式启用其相关性。如果指定了 -t 选项,则在重新引导时实例将回复到以前启用的设置(可能已被启用)。
  • refresh [FMRI| pattern]:刷新操作数指定的服务实例。实例应该重新读取其配置。
  • restart [FMRI| pattern]:重新启动操作数指定的服务实例。
  • delegate restarter_FMRI [FMRI | pattern]:将分配给指定实例的重新启动程序更改为由 restarter_FMRI 属性指定的重新启动程序。如果将实例重新委托给 svc.startd(1M),则这是等效的。必须执行重新启动操作才能使重新委托生效。并非所有的重新启动程序都支持相同的基础应用程序模型。因此,并非所有潜在的委托都能使服务实例正常工作。
  • mark [-It] instance_state [FMRI| pattern]:将操作数指定的服务实例置于指定的 instance_state(降级或维护)。服务必须处于联机状态才能在降级状态下隐藏。如果指定了 -I 选项,则服务实例将被立即置于指定的状态。如果指定了 -t 选项,则隐藏是临时的。它仅在当前系统实例的生存期内存在。临时隐藏选项不可用于降级状态。
  • milestone [-d] milestone_FMRI:将系统移动到指定的里程碑。暂时禁用给定里程碑不依赖(直接或间接)的所有服务。如果指定了 -d 选项,则给定里程碑将成为缺省的最终里程碑,并在重新引导后继续存在。
  • clear [FMRI| pattern]:对于处于维护状态的服务,将每个操作数指定的服务实例置于未初始化状态,以便可以将其重新联机。对于由 mark 子命令置于降级状态的服务,使该服务重新返回到联机状态。

svcprop(1) 程序输出服务配置系统信息库中各属性的值。属性由 -p 选项和 FMRI 操作数进行选择。缺省情况下选择单个属性时,属性值在一行输出,各个值之间用空格分隔。支持以下选项:

  • -c:检索当前属性值,而不进行组合。
  • -f:按属性的 FMRI 指定属性。隐含选项 -t
  • -p [name/]name:输出由操作数指定的每个属性组、实例或服务的命名属性或属性组的值。
  • -q:静默。不生成输出。
  • -s snapshot:使用命名快照检索指定的属性或属性组。如果在快照中不存在给定的属性组,则检查当前属性值。
  • -t:使用多属性输出格式。
  • -v:详细。对于不存在的属性输出错误消息,即使同时使用了选项 -q 时也是如此。
  • -w:在输出任何内容之前等待选定的属性组或属性发生更改。

svcs(1) 命令显示有关服务实例的信息(与服务配置系统信息库中记录的一样)。svcs(1) 命令有以下三种不同形式:

 
svcs [-aHpv?] [-o col[,col]...] [-R instance_FMRI]... 
              [-sS col]... [FMRI | pattern] ...

svcs {-d | -D}  [-Hpv?] [-o col[,co= l]...]  [-sS col]... 
                [FMRI | pattern] ...

svcs -l [FMRI | pattern] ...

第一种形式输出由参数指定的服务实例的单行状态列表。每个实例仅列出一次,且没有参数;列出所有已启用的服务实例(即使暂时被禁用)。该命令的第二种形式输出由参数指定的服务实例的相关性或相关项的单行状态列表。第三种形式输出有关特定服务和实例的详细信息。在上述三个命令说明中出现的选项如下:

  • -?:显示扩展的用法信息,包括列说明符。
  • -a:还选择已禁用的服务实例。
  • -d:列出给定服务实例所依赖的服务或服务实例。
  • -D:列出依赖于给定服务或服务实例的服务实例。
  • -H:忽略列标题。
  • -l:显示有关选定的服务和服务实例的所有可用信息,每行显示一个服务属性。不同实例的信息用空行分隔。
  • -o col[,col]...:输出指定的列。每个 col 应该是一个列名。
  • -p:列出与每个服务实例关联的进程。服务实例可能没有关联的进程。显示每个进程的进程 ID、开始时间和命令名称(ps(1) 中的 PIDSTIMECMD 字段)。
  • -R instance_FMRI:选择具有指定服务实例的服务实例作为其重新启动程序。
  • -s col:按列对输出进行排序。col 应该是一个列名。多个选项的作用是累积的。
  • -S col:以与选项相反的顺序按 col 进行排序。
  • -v:显示详细列:STATENSTATESTIMECTIDFMRI

用于 svcs(1) 命令的列名区分大小写,这些列名如下:

  • CTID:服务实例的主合同 ID(如果存在)。
  • DESC:来自服务模板元素的简短服务描述。服务可能没有可用的描述,在这种情况下,使用连字符表示空值。
  • FMRI:服务实例的 FMRI
  • INST:服务实例的实例名称。
  • NSTA:服务实例的下一个状态(缩写形式),可参见 STA 列描述。连字符表示实例未进行转换,否则它将与 STA 相同。
  • NSTATE:服务的下一个状态。连字符表示实例未进行转换,否则它将与 STATE 相同。
  • SCOPE:服务实例的范围名称。
  • SVC:服务实例的服务名称。
  • STA:服务实例状态的缩写形式。
  • STATE:服务实例的状态。除非还显示 NSTANSTATE 列,否则在转换时对实例附加星号。
  • STIME:如果服务实例在最近 24 小时内进入当前状态,则此列指示它进入此状态的时间。否则,此列指示它进入此状态的日期,输出时用下划线代替空白。

svccfg(1M) 命令用于导入、导出和修改系统信息库中服务的配置。通过指定子命令,或者通过指定包含一系列子命令的命令文件,可以按交互方式调用它。以下是三种调用形式:

/usr/sbin/svccfg [-v]

/usr/sbin/svccfg [-v] subcommand [args...]

/usr/sbin/svccfg [-v] -f command-file

有关所有可用子命令的完整列表,请阅读 svccfg(1M) 手册页。

inetconv(1M) 程序将 inetd.conf 条目转换为 smf(5) 清单,并将其导入系统信息库。在指定输入文件中的服务行和生成的结果配置文件之间存在一对一映射关系。缺省情况下,配置文件是使用以下模板命名的:

<svcname>-<proto>.xml

<svcname> 令牌替换为服务的名称,并将 <proto> 令牌替换为服务的协议。对于服务名称或协议的源代码行中存在的任何正斜杠字符,将其替换为下划线。生成的每个清单都将服务行作为注释包括在内。如果在转换过程中发现服务行不规则或者用于内部 inetd 服务,则不生成清单,并跳过输入文件中的该服务行。inetconv(1M) 程序接受以下命令行选项:

  • -?:显示用法信息。
  • -e:启用在输入文件中启用的 smf(5) 服务。
  • -f:如果在目标目录中找到与要生成的服务清单同名的服务清单,则在指定此选项时,inetconv(5) 将覆写该清单。否则,将生成错误消息,且不执行该服务的转换。
  • -i srcfile:允许指定替代输入文件 srcfile。如果未指定此选项,则将 inetd.conf(4) 文件用作输入。
  • -n:关闭在转换过程中生成的清单的自动导入。如果稍后要将生成的清单导入到 smf(5) 系统信息库中,则可以通过使用 svccfg(1M) 实用程序执行此操作。
  • -o destdir:允许为已生成的配置文件指定替代目标目录 destdir。未指定此选项时,如果清单是 RPC 服务的清单,则将这些清单放在 /var/svc/manifest/network/rpc 中,否则放在 /var/svc/manifest/network 中。

inetadm(1M) 程序用于查看和配置 inetd 控制的服务。支持以下选项:

  • -?:显示用法信息。
  • -l FMRI:以 name=value 对的形式列出指定服务实例的所有属性。此外,如果属性值是从 inetd 提供的缺省值继承的,则用令牌标识 name=value 对(缺省)。当属性没有指定的服务实例缺省值时,将发生属性继承。
  • -e FMRI:启用指定的服务实例。
  • -d FMRI:禁用指定的服务。
  • -p:以 name=value 对的形式列出 inetd 提供的所有缺省 inet 服务属性值。如果值是布尔类型的,则它将列为 TRUEFALSE
  • -m FMRI property_name=value [property_name=value...]:更改已标识服务实例的指定属性值。属性以空格分隔的 name=value 对形式指定。要删除特定于实例的值并接受属性的缺省值,只需指定不带值的属性即可。
  • -M property_name=value [property_name=value...]:更改指定的 inetd 缺省属性的值。属性以空格分隔的 name=value 对形式指定。

预测性自我修复服务管理器示例

使用 svcs(1) 查看系统上的服务:

svcs

....
online         Oct_31   svc:/system/filesystem/local:default
online         Oct_31   svc:/network/rpc/bind:default
online         Oct_31   svc:/system/cron:default
online         Oct_31   svc:/system/sac:default
online         Oct_31   svc:/system/system-log:default
online         Oct_31   svc:/network/inetd:default
online         Oct_31   svc:/network/nis/client:default
online         Oct_31   svc:/network/rpc/keyserv:default
online         Oct_31   svc:/network/rpc/gss:ticotsord
online         Oct_31   svc:/network/security/ktkt_warn:ticotsord
online         Oct_31   svc:/milestone/multi-user:default
....

使用 svcs -p 找出服务和进程之间的关系。此示例显示了 NFS 服务器服务:

svcs -p nfs/server 

STATE          STIME    FMRI
online         Oct_12   svc:/network/nfs/server:default
               Oct_31     103729 mountd
               Oct_31     103731 nfsd

如果服务出现问题,请使用服务管理器工具帮助进行诊断,并查看建议的操作过程以更正问题。例如,svcs -x 选项可列出有关未运行的每个服务的信息以及原因:

svcs -x

svc:/application/print/server:default (LP Print Service)
 State: disabled since Tue Oct 05 22:27:55 2004
Reason: Disabled by an administrator.
   See: http://sun.com/msg/SMF-8000-05
   See: lpsched(1M)
Impact: 1 service is not running.

http://www.sun.com/msg/ 提供了有关此类问题的其他信息,并提出了获取其他数据和更正问题的建议步骤。

使用 svccfg(1) 查看 SMTP 服务器的属性并确定其相关性:

svccfg

svc:> select network/smtp
svc:/network/smtp> listprop

system-log                  dependency
system-log/entities         fmri     svc:/system/system-log
system-log/grouping         astring  optional_all
system-log/restart_on       astring  none
system-log/type             astring  service
identity                    dependency
identity/entities           fmri     svc:/system/identity:domain
identity/grouping           astring  require_all
identity/restart_on         astring  refresh
identity/type               astring  service
name-services               dependency
name-services/entities      fmri     svc:/milestone/name-services
name-services/grouping      astring  require_all
name-services/restart_on    astring  refresh
name-services/type          astring  service
network-service             dependency
network-service/entities    fmri     svc:/network/service
network-service/grouping    astring  require_all
network-service/restart_on  astring  none
network-service/type        astring  service
fs-local                    dependency
fs-local/entities           fmri     svc:/system/filesystem/local
fs-local/grouping           astring  require_all
fs-local/restart_on         astring  none
fs-local/type               astring  service
general                     framework
general/entity_stability    astring  Unstable
general/single_instance     boolean  true

资源