smf - 服务管理工具
Oracle Solaris 服务管理工具定义了一种编程模型,用以提供持久运行的应用程序,这些应用程序称为服务。此工具还提供运行服务的基础结构。服务可以表示运行的应用程序、设备软件状态或一组其他服务。服务在框架中由服务实例对象表示,这些对象是服务对象的子项。实例对象可以继承或覆盖父服务对象的配置,这使多个服务实例可以共享配置信息。所有服务和实例对象都包含在一个范围内,该范围表示配置信息的集合。本地 Oracle Solaris 实例的配置称为 “localhost” 范围,这是当前唯一支持的范围。
每个服务实例都使用故障管理资源标识符 (fault management resource identifier, FMRI) 来命名(模式为 svc:)。例如,在系统启动时启动的 syslogd(8) 守护进程是具有以下名称的缺省服务实例:
svc://localhost/system/system-log:default svc:/system/system-log:default system/system-log:default
许多命令也允许使用 FMRI 缩写。有关此类示例,请参见 svcs(1) 手册页。
在上面的示例中,default 是实例名称,system/system-log 是服务名称。服务名称可包含多个用斜杠 (/) 分隔的组成部分。所有组成部分(最后一个组成部分除外)构成了服务的类别。站点特定的服务应当用以 site 开头的类别来命名。
服务实例可以启用,也可以禁用。所有服务都可以使用 svcadm(8) 命令启用或禁用。
可通过 svcs(1) 命令来显示系统上管理服务实例的列表。
当管理员删除由标准位置中的清单或配置文件支持的条目时,该条目会被屏蔽,且通过向 SMF 发送普通查询无法看到该条目。使用 svccfg listcust 可以浏览已屏蔽的条目,将 delcust 子命令与 svccfg 结合使用可将其删除。有关更多信息,请参见 svccfg(8) 手册页。
实例名称必须以字母数字字符开头,可以包含字母数字字符、下划线 (_)、连字符 (-) 和句点 (.)。名称的第一个字符与最后一个字符之间允许使用一个逗号 (,)。例如:
ORCL, rcapd com.oracle, rcapd
服务名称允许多个级别的标识符,每个级别受到的限制与实例名称相同,由斜杠 (/) 分隔。例如,system/svc/restarter。
只允许使用 ASCII 字符。
服务实例可以与一组实体具有依赖关系,这些实体可包含服务、实例和文件。依赖性控制着启动和自动停止服务的时间。当未满足已启用服务的依赖性时,服务就保持脱机状态。当满足其依赖性时,就会启动服务。如果启动成功,服务将转换为联机状态。不同于服务和实例,不会在创建或删除文件时动态地评估文件依赖性。只对它们评估一次。
依赖性是否满足将由其分组确定:
当所有引用的服务正在运行(联机或降级)或者所有指示的文件都存在时满足。
当引用的任一服务正在运行(联机或降级)或者至少有一个指示的文件存在时满足。
当引用的服务正在运行(联机或降级)或因没有管理操作而未运行(禁用、维护、不存在或脱机等待必须有管理操作才能启动的依赖项)时满足。不完整的服务也满足可选的依赖性。
如果引用的服务存在,则定义启动顺序。通常,引用的服务存在、处于启用状态但尚未运行时不满足。引用的服务处于联机、降级、禁用、维护、缺失或未完成状态时满足。此外,引用的服务由于缺少依赖性或者不满足依赖性(处于禁用或维护状态)而脱机时,也满足。建议不要对文件依赖项使用此依赖性类型,但如果使用,其行为将与 require_all 依赖性相同。
当所有引用的服务都已禁用、处于维护状态或者引用的服务或文件不存在时满足。
在运行(联机或降级)期间,如果由 require_all 、require_any 或 optional_all 依赖性引用的服务停止或刷新,SMF(Service Management Facility,服务管理工具)将考虑服务停止的原因以及依赖性的 restart_on 属性以确定是否停止该服务。
| restart_on value event | none error restart refresh -------------------+------------------------------ stop due to error | no yes yes yes non-error stop | no no yes yes refresh | no no no yes
如果服务出现硬件错误或软件错误(如核心转储),则认为该服务已经因出错而停止。对于 exclude_all 依赖性,如果引用的服务已启动,但 restart_on 属性不是 none,也将停止该服务。
服务的依赖项可通过 svcs(1) 或 svccfg(8) 列出,也可通过 svccfg(8) 进行修改。
每个服务都由一个重启程序来管理。主重启程序 svc.startd(8) 用于管理整组服务实例及其依赖项的状态。主重启程序代表其服务操作,其操作对象是委托重启程序,委托重启程序可以为特定的应用程序类提供特定的执行环境。例如,inetd(8) 是一个委托重启程序,它为其服务实例提供一个由网络连接构成的初始环境作为输入和输出文件描述符。委托给 inetd(8) 的每个实例都处于联机状态。虽然特定实例的守护进程可能未运行,但该实例已经可运行。
由于当实例转为联机状态时将满足依赖性,因此 svc.startd(8) 将调用其他实例的启动方法或指示委托重启程序执行此类操作。这些操作可能会重叠。
可使用 svcs(1) 检查当前的服务集及关联的重启程序。所有重启程序使用的公共配置的说明在 smf_restarter(7) 中指定。
每个服务或服务实例都必须定义一组启动、停止和(可选)刷新该服务的方法。有关 svc.startd(8) 以及类似 fork(2)-exec(2) 重启程序的方法约定的更完整说明,请参见 smf_method(7)。
管理方法(如将传统配置信息捕获到系统信息库的方法)将在 svccfg(8) 手册页中讨论。
服务的方法可使用 svccfg(8) 命令列出和修改。
每个服务实例始终处于某一明确定义的状态,具体取决于其依赖性、其方法的执行结果以及其潜在合同事件。系统定义了以下状态:
This state is the initial state for all service instances, including newly created instances (through executing svccfg add, importing a manifest, or applying a profile).When an instance is cleared from the maintenance state (svcadm clear), it is placed in the uninitialized state so that its restarter can re-evaluate its configuration.Instances are moved to maintenance, offline, or disabled state after evaluation by the appropriate restarter.Note that evaluation of an instance can only occur if its restarter service is online.
The instance is not completely installed on the system and has not been evaluated by its restarter.The instance is mentioned solely in a profile (and not explicitly marked complete in the profile), or is mentioned only as a dependent of another service.
实例已启用,但尚未运行或无法运行。如果重启程序成功执行服务启动方法或等效方法,实例将转为联机状态。如果执行失败,则会导致实例处于降级或维护状态。管理操作会导致实例处于初始化状态。
实例已启用且正在运行或可以运行。联机状态的具体特性是应用程序/模型特定的,由负责服务实例的重启程序进行定义。当满足所有依赖性时,联机是正确配置的服务的预期运行状态。实例失败会导致其处于降级或维护状态。如果实例所依赖的服务失败,则会导致其处于脱机或降级状态。
相对于正常运行而言,实例是以有限的功能运行的。实例失败会导致其处于维护状态。如果实例所依赖的服务失败,则会导致其处于脱机或降级状态。实例方法的失败也会导致其处于降级状态。功能恢复后,应会将实例转为联机状态。
实例无法启动、停止或继续运行。在采取纠正措施之后,通过 svcadm clear 执行需要执行管理操作才能使实例脱离维护状态。清除实例时,SMF 会将实例转换到其配置的状态。如果禁用实例,SMF 会将其转到已禁用状态。如果启用实例,SMF 会尝试使实例联机。
实例已禁用。使服务转换为脱机状态,最终只有满足所有依赖性时才会恢复联机状态。
此状态表示不通过服务管理工具进行管理的传统实例。处于此状态的实例已在某一时间点启动,可能正在运行,也可能未在运行。只能使用该工具观察实例,不能将实例转换为其他状态。
状态也会发生转换,但会导致返回到最初的状态。
SMF 允许使用 SNMP(Simple Network Management Protocol,简单网络管理协议)或 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)通知状态转换。该工具会发布状态转换的信息事件,以供通知守护进程(如 snmp-notify(8) 和 smtp-notify(8))使用。已禁用服务的 SMF 状态转换不会生成通知,除非转换的最终状态为禁用且该转换存在通知参数。对于初始和最终状态相同的转换,也不会为其生成通知。
FMA(Fault Management Architecture,故障管理体系结构)事件的通知参数存储在 svc:/system/fm/notify-params:default 中,但 SMF 状态转换所生成的信息事件除外。这些事件存储在服务中或存储在转换服务的实例中。在 svc:/system/svc/global:default 中,可在系统范围设置 SMF 状态转换所生成事件的通知参数。当在转换实例中找不到组合查找(如 scf_instance_get_pg_composed(3SCF) 中所述)时,将使用系统范围通知参数。可使用 svccfg(8) 处理通知参数。可使用 DTD(document type definition,文档类型定义)中描述的 notification_parameters 元素在服务清单或配置文件中配置通知参数。下面列举了一个示例:
<notification_parameters> <event value='from-online' /> <type name='smtp' active="false"> <parameter name='to'> <value_node value='root@local' /> <value_node value='admin-alias@eng' /> </parameter> </type> <type name='snmp' /> </notification_parameters>
events 是一个用逗号分隔的 SMF 状态转换集列表或一个用逗号分隔的 FMA 事件类列表。events 不能混合包含 SMF 状态转换集和 FMA 事件类。
为了方便起见,标记 problem- {diagnosed,updated,repaired,resolved} 描述了 FMA 子系统诊断出的问题的生命周期:包括初始诊断、中期更新和最终问题解决。这些标记是基础 FMA 协议事件类 (全部位于 list.* 分层结构中) 的别名,但在配置通知首选项时不能使用后者。
FMA 子系统诊断出了新问题。诊断包含由一个或多个可疑项组成的列表,系统可能(根据需要)已将这些可疑项自动隔离以防止进一步发生错误。问题在事件有效载荷中由 UUID 进行标识,描述此问题解决生命周期的其他事件会引用匹配的 UUID。
问题诊断中的一个或多个可疑资源已修复、替换或被视为没有故障(或再次出现了故障),但列表中至少保留了一个故障资源。修复可能是 fmadm 命令行(fmadm repaired、fmadm acquit、fmadm replaced)的结果,也可能是自动检测到的(如通过检测部件序列号更改)。
问题诊断中的所有可疑资源均已修复、解决或被视为无故障。在此阶段,部分或全部资源可能仍处于隔离状态。
问题诊断中的所有可疑资源均已修复、解决或被视为无故障并且不再处于隔离状态(例如,曾经是可疑项并处于脱机状态的 CPU 现在又重新恢复联机状态;这种取消隔离操作通常自动执行)。
状态转换集的定义如下:
最终转换状态为 <state> 的所有转换的集合。
初始转换状态为 <state> 的所有转换的集合。
初始转换状态为 <state> 的所有转换的集合。
所有转换的集合。
状态的有效值包括:维护、脱机、禁用、联机和降级。转换集定义的示例如下:maintenance、from-online、to-degraded。
上述依赖性、方法、委托重启程序和实例状态以服务或服务实例的属性或属性组形式表示。服务或服务实例有任意数量的属性组,可在其中存储应用程序数据,这些属性组可嵌套在其他属性组元素中,这样便于表示复杂的分层应用程序配置数据。以这种方式使用特性组时,可以使应用程序的配置派生可供系统信息库提供给该工具中的所有数据的属性。应用程序也可以在框架中使用适当的 service_bundle (5) DTD 子集表示其配置数据。
属性查找是组合查找。如果在服务实例中未找到属性组/属性组合,大部分命令以及 libscf(3LIB) 的高级接口将在包含该实例的服务中搜索相同的属性组/属性组合。这样可以在服务实例之间共享公共配置。组合可视为服务实例与其父服务之间的继承关系。
属性将受到保护,以防被未经授权的进程修改。请参见 smf_security(7)。
通用属性组适用于所有服务实例。该属性组包含以下属性:
指定是否启用实例。如果实例上不存在此属性,SMF 将无法告知实例的重启程序有关实例的存在情况。
此服务的重启程序。有关更多信息,请参见“重启程序”一节。如果未设置此属性,将使用缺省的系统重启程序。
该服务是完整的,还是不应启动的部分定义。此属性会在清单导入时自动设置。或者,如果不具有此属性的实例根据模板定义成功进行了验证(请参见 scf_tmpl_validate_fmri(3SCF)),则启用时 svcadm(8) 会为其创建此属性。
设置为 true 时,激活目标服务的行为。有关更多信息,请参见“目标服务”部分以了解详细信息。
系统信息库由标准位置中文件的管理定制、当前状态和缺省值的组合集合而成。由 SMF 管理的文件系统位置中的清单定义的服务、实例、属性组和属性始终在系统信息库中准确表示。运行时由管理员或其他程序执行的定制被捕获并存储在系统信息库中。
属性在系统信息库中可以具有不同的值,用于反映清单、配置文件和管理定制的不同设置。缺省情况下向用户和服务提供哪一个值由名为 layers 的简单优先级机制仲裁。
SMF 跟踪 7 个层。按优先级降序,它们是:
由交互使用 SMF 命令或库进行的任何更改。此层具有最高优先级。
/etc/svc/profile/sysconfig 目录下的文件中的任何值。此目录仅供 Oracle Solaris 安装程序和 sysconfig 使用。某些 sysconfig(8) 操作可能会删除该目录中的所有配置文件。
/etc/svc/profile/node 目录下的文件或传统 /etc/svc/profile/site.xml 文件中的任何值。这些文件设计用于表示特定 Oracle Solaris 实例独有的配置。
/etc/svc/profile/site 目录下的文件中的任何值。这些文件设计用于表示位于通用位置的许多系统共有的配置。
/etc/svc/profile/enterprise 目录下的文件中的任何值。这些文件设计用于表示分布式 Oracle Solaris 实例群体中大部分系统共有的配置。
/etc/svc/profile/system 目录以及 /etc/svc/profile/generic.xml 和 /etc/svc/profile/platform.xml 文件中的任何值
系统清单位置 /lib/svc/manifest 和 /var/svc/manifest 中的任何值。
任何单独的层中不能有属性冲突。admin 层中的冲突属性只是覆盖之前的属性。如果任何其他层中的多个文件提供该同一属性,并且该属性未在更高的层中设置,则整个实例标记为冲突,并且不会由 svc.startd(8) 启动,直到冲突定义被去除,或在更高的层设置该属性。请求单个值(包括 svccfg 和 svcprop)的其他 libscf 使用者看到所有适当的值中的随机属性设置。我们不保证返回哪个冲突值。
借助 enterprise-profile、site-profile 和 node-profile 层,用户可以在大量系统中应用通用设置,还可以轻松覆盖一组或单个系统。例如,某家公司可能有一组通常由所有服务器使用的 DNS 服务,但该公司需要对某些站点或单台计算机使用专用设置。可以使用 zoneadm(8) install 选择性地向各个层提供配置文件。有关更多信息,请参见 solaris(7) 和 solaris-kz(7) 手册页。
有关系统信息库中每个实例的历史数据由服务管理工具进行维护。此数据以只读快照形式提供,用于管理检查和回滚。可能会提供以下快照类型集:
由管理员创建的或安装软件包期间生成的实例的初始配置。
执行管理撤消操作时捕获的当前配置。
正在运行的实例配置。
成功转换为联机状态期间所捕获的配置。
可使用 svccfg(8) 命令与快照进行交互。
某些属性组将标记为 non-persistent。这些组不会在快照中进行备份,其内容在系统引导期间会被清除。此类组通常存放活动程序状态,此状态无需在系统重新启动后存在。
每个服务实例的当前状态以及与服务和服务实例关联的属性都存储在由 svc.configd(8) 管理的系统信息库中。
服务管理工具数据的系统信息库由 svc.configd(8) 管理。
与服务或服务实例关联的信息存储在配置系统信息库中,可作为 XML 文件导出。此类 XML 文件称作服务束,是可移植的,很适合用于备份。服务束分为以下几种类型:
包含与特定服务或服务实例集关联的完整属性集的文件。
包含每个实例的 enabled 属性(在通用属性组中为布尔型)的一组服务实例和值的文件。
配置文件也可以包含服务和实例中属性的配置值。模板元素不能在配置文件中定义。
配置文件可以使用来自 DTD 的一组宽松元素,如 service_bundle(5) 中所述。要使用这些元素,应向 DOCTYPE 条目添加以下定义:
<!ENTITY % profile "INCLUDE"> <!ENTITY % manifest "IGNORE">
可使用 svccfg(8) 命令在系统信息库中导入或导出服务束。有关服务束文件格式的说明以及有关制作服务束的准则,请参见 service_bundle(5)。
smf 里程碑是一种服务,它聚合了多个服务依赖性。通常,里程碑本身并不执行任何有用的操作,但它声明一种其他服务可以依赖的特定系统就绪状态。一个示例就是名称/服务里程碑,它仅依赖当前启用的名称服务。
Oracle Solaris 的现有里程碑包括:none、config、devices、unconfig、network、single-user、name-services、self-assembly-complete、multi-user 和 multi-user-server。
当系统已启动且正常运行时,为了实现预期目的,系统管理员可以使用目标服务定义要求的服务集。
要满足其所有依赖性,应使用目标服务。如果需要管理干预才能满足依赖性,则目标服务将置于维护状态。一旦满足其依赖性,处于维护状态的目标服务均会自动脱离该状态。
通常,goal service 设置不应当用于执行实际工作的服务。
不建议使目标服务依赖于动态启用的服务。动态启用的服务会导致 goal service 进入维护状态,直到由其他服务启用。管理员可以使用 svcadm(8) 子命令目标来设置目标服务的依赖项。
里程碑/目标milestone/goals 是一项目标服务,旨在提供一个清楚明了且定义明确的时刻点,在此时刻点,系统可被视为启动并正常运行。milestone/goals 的依赖项必须配置为表示系统的任务关键型服务。milestone/goals 的缺省依赖项为:
svc:/milestone/multi-user-server:default
/etc/rc?.d 目录中的启动程序作为相应运行级别的里程碑的一部分执行:
milestone/single-user:default
milestone/multi-user:default
milestone/multi-user-server:default
每个程序的执行都表示为程序路径所指定的功能简化的服务实例。这些实例保持特殊的 legacy-run 状态。
这些实例没有已启用属性(在通用属性组中为 boolean 类型),通常无法使用 svcadm(8) 命令进行处理。系统不会对这些程序执行错误诊断或重新启动。
svcs(1)、exec(2)、fork(2)、strftime(3C)、libscf(3LIB)、scf_tmpl_validate_fmri(3SCF)、contract(5)、service_bundle(5)、smf_bootstrap(7)、smf_method(7)、smf_restarter(7)、smf_security(7)、inetd(8)、smtp-notify(8)、snmp-notify(8)、svc.configd(8)、svc.startd(8)、svcadm(8)、svccfg(8)、solaris(7)、solaris-kz(7)、zoneadm(8)