SMF(service management facility)后台服务管理机制:
确定基本的运行级别、比较运行级别和SMF里程碑,以及确定启动进程的阶段。使用SMF管理命令控制启动程序、执行系统关闭。
SMF为管理系统服务和服务与服务之间的交互提供一个中心配置结构。SMF包括以下内容:
⑴依靠服务之间的关系形成建立和形式化的机制。
⑵启动,停止和重新启动服务。
⑶为启动信息和服务状态形成一个中心存储器。
⑷为系统服务的故障管理建立机制。
⑸关于服务配置的详细信息比如解释服务为什么不能运行。
⑹为每个服务建立一个log文件。
SMF服务概述:
一个服务能够被描述为一个能够在本地和远端提供资源或者是包含应用能力和其他服务的实体。一个服务并不一定是一个运行的进程比如web server。一个服务也可以是一个设备的软件配置状态,比如:网络设备的配置或者mount 的文件系统。一个系统中可以有一个或者多个服务同时运行。比如:一个系统可以配置多个网络接口,可以mount多个文件系统。
SMF服务标识:
在SMF中为任何一个服务实例提供一个参考名,被称为:服务标识。这种服务标示的格式是FMRI(fault management resource identifier、故障管理资源标识)格式。服务类型包括:
⑴Application 应用
⑵Device 设备
⑶Legacy 软件或硬件
⑷Milestone 里程碑
⑸Network 网络
⑹Platform 平台
⑺Site 位置
⑻System 系统
下面是一个FMRI为服务实例的一个例子:
跟小段一起学Solaris(8)---服务管理_Solaris
说明一下:
svc (Service、服务) 指示这个服务是由SMF来管理的。
服务类型是system
服务本身是filesystem
服务实例是root文件系统
Default是第一个标示,在这个例子中,只有一个服务实例。
另一个FMRI的例子:
lrc:/etc/rc3.d/S90samba
lrc(legacy run control、计算机运行管理)指示这个服务当前并不是通过SMF来管理的。
/etc/rc3.d是参考目录/etc/rc3.d是使用管理服务的脚本所在。
脚本的名字是S90samba。
显示服务信息
使用svcs(Services)命令来显示服务信息的情况。
跟小段一起学Solaris(8)---服务管理_管理_02
服务状态
svcs命令可以列出服务标示和服务状态情况。服务状态包括以下类型:
Online:服务实例是enable并且成功启动的。
Offline:服务实例是enable的但没有启动。
Disable:服务实例是enable并且运行的。
Legacy_run:这个服务并是通过SMF来管理的,但是可以通过svc来查看。
Uninitialized:在它们的配置文件可读之前,要初始化所有的服务。
Maintenance:这个服务发生了错误,必须等待管理员解决。
Degraded:这个服务是enable但是受限制运行。
里程碑
里程碑是指定类型的服务它可以构建和定义设置其他服务。
里程碑可以被看做是服务到达的一种状态。这种系统状态要求定义设置运行的服务。这些服务依靠于其他服务的运行才可用。因此这是一个层次依靠的关系。它是通过SMF进行核心管理的。当前有七种里程碑。
Single-user 单用户模式
Multi-user 多用户模式
Multi-user-server 多用户多服务器模式
Network 网络模式
Name-services 名服务模式
Sysconfig 系统配置模式
Devices 设备模式
决定当前的里程碑。
svcs |grep milestone
跟小段一起学Solaris(8)---服务管理_Solaris_03
svc.startd 进程
svc.startd进程它的主要责任就是维持系统服务。Svc.startd进程确保系统启动为合适的里程碑方式。如果启动的时候没有指定里程碑,Svc.startd会启动建立包括所有系统服务的里程碑(all)。
当前系统启动时包括的里程碑为:
None 无用户模式
Single-user 单用户模式
Multi-user 多用户模式
Multi-user-server 多用户服务器模式
All 所有允许的模式
在启动系统的时候指定里程碑用-m参数。
Ok> boot –m milestone=single-user
************
Solaris 10引入全新的后台服务管理机制,该机制被称为SMF,它包含了新的概念、管理工具和服务定义方式。比如用里程碑(milestone)代替了运行级别的概念;用服务配置库代替分散在/etc/rcx.d目录的服务启动脚本。
SMF相对于传统的Unix后台服务管理机制具备以下突出的功能:
⑴ 恢复由软件故障、硬件故障、管理错误终止的服务
⑵ 服务之间可以定义依赖关系
⑶ 服务可以有多个实例
⑷ 提供了比较全面基于命令行管理工具
⑸ 根据依赖关系可以并发启动服务,加快系统启动的速度
⑹ 引入服务配置库,提供服务配置库快照、备份、恢复功能
这些功能方便了服务的管理,服务的可用性。SMF提供了一定程度的服务自愈性,它也是Solaris 10系统可预测自愈功能(Predictive Self-Healing)的一部分。
SMF组成要素
SMF包含两个进程、服务定义的manifest和profile、服务配置库和命令行管理工具等内容:
1. svc.startd, svc.configd
2. manifest, profile
3. repository(sqlite db)
4. CLI mgmt tool (svccfg, svcadm, svcprop, svcs, inetadm, inetconv, repoistory_restore)
svc.startd是SMF的主要进程,它根据系统管理员指令或者系统故障或应用故障来启动、停止、重启服务。
svc.configd是负责管理服务配置库的进程。SMF命令行工具svccfg, svcprop, svcs, svcadm通过该进程访问服务配置库。
服务和服务的实例可以用xml文件定义,manifest定义服务,profile定义服务实例,这些xml文件通常存放在/var/svc目录下。
服务配置库存放在/etc/svc/repository.db文件中。服务配置库实际上是一个sqlite的关系数据库,它存放了服务的定义、配置等信息。
跟小段一起学Solaris(8)---服务管理_服务_04
/var/svc目录下的manifest和profile文件和/etc/svc/repository.db文件都包含了服务的定义、配置等信息,后者的信息是权威的。
跟小段一起学Solaris(8)---服务管理_服务_05
使用svccfg import命令可将SMF服务的manifest xml文件导入到repository中;
使用svccfg export命令可将repository中SMF服务的manifest信息导出到xml文件;
使用svccfg apply命令可将SMF服务的profile xml文件导入到repository中;
使用svccfg etract命令可将repository中SMF服务的profile信息导出到xml文件。
SMF中的服务:服务和服务实例。SMF中的服务可以有多个实例,服务实例继承服务的属性。
SMF中的服务命名:
SMF中的服务命名方式和传统的Unix中的后台进程的命名方式有很大的差别,SMF服务名称是用FMRI(Fault Managed Resouce Identifier)表示的,FMRI是基于URI规范资源命名方式在Solaris系统的一个应用。对于SMF服务,其格式是:
scheme:/category1/category2.../categoryn/service[:instance]
scheme有svc和lrc,lrc没有实例名。
svc模式的FMRI表示SMF服务,而lrc模式的FMRI表示旧的基于rc脚本的服务。
用svcs -a可以列出当前所有的服务:
跟小段一起学Solaris(8)---服务管理_休闲_06
第三列FMRI就是服务名称。上图中显示了在Solaris 10中捆绑的AppServ、Apache服务名称,由于它们仍然沿用了rc脚本的启动方式,所以它们的名称是以lrc开头的,这类服务无法用svcadm来管理。比如试图运行命令svcadm enable lrc:/etc/rc3_d/S50apache,系统会报错。
跟小段一起学Solaris(8)---服务管理_休闲_07
我们能够查询ssh服务的服务名为:
跟小段一起学Solaris(8)---服务管理_服务_08
用FMRI表示的服务名称可以唯一地标识一个服务,但是名称通常都比较冗长,不便记忆。所以SMF允许服务名称的缩写,只要可以唯一标识服务,scheme,instance,category都可以省。所以ssh服务的名称可以简写成ssh。简写的服务名在SMF的命令行工具中都可以使用。
使用FMRI方法命名服务后使得原先的服务名称发生了变化,但通过以下方法可以找SMF服务的名称:
1. 猜测法,根据该服务的关键词得一个可能的服务名(guess_service_name),如Apache web服务可以用apache,NFS文件服务可以用nfs。然后用svcs -a |grep guess_service_name。
2. 查看该服务所属应用的文档。
以下是常见服务的名称
服务      最简缩写     FMRI
sshd      ssh          svc:/network/ssh:default
cron      cron         svc:/system/cron:default
automount autofs       svc:/system/filesystem/autofs:default
Apache2   apache2      svc:/system/filesystem/autofs:default
sendmail  sendmail     svc:/network/smtp:sendmail
nfs       nfs/server   svc:/network/nfs/server:default
管理SMF服务
管理SMF服务包括配置、查看、启用/禁用、启动/停止服务等任务。这些任务分别可以用svccfg, svcs, svcadm命令完成。
svccfg(service configurations)命令
svccfg命令用来管理SMF repository。运行不带参数的svccfg命令进入一个交互式的shell,在该shell里可以对服务、服务实例进行配置、导入、导出、备份、恢复操作。最常用的操作是新增一个SMF服务时导入该服务的manifest文件,可以使用svccfg import <manifest_file>的方法。使用svccfg import时要注意在目前版本的Solaris中(版本小于等于Solaris 10 1/06 ),如果manifest xml文件语法有错,该命令不会报告xml文件出错的具体位置,只会报一个笼统的错误信息。例如,postfix.xml文件的service元素没有闭合,运行以下命令:
-bash-3.00# svccfg -v import postfix.xml
svccfg: couldn't parse document
会报无法解析文档的错误。因此,编写完manifest xml文件应当验证一下文件的有效性。
svcs(service status)命令
svcs用于查看服务的状态,
svcs -a用于查看所有状态的服务
svcs -x用于查看未正常启动的服务
svcs -l <fmri> 用于查看单个服务的详细信息
svcadm(manipulate service instances)命令
svcadm用来启用/禁用、启动/停止SMF服务。
svcadm enable fmri -- 启用一个SMF服务,同时运行该服务
svcadm disable fmri -- 禁用一个SMF服务,同时停止该服务
svcadm restart fmri -- 重启一个SMF服务
svcadm refresh fmri -- 刷新一个SMF服务,相当于让服务重新载入配置文件
svcadm mark fmri -- 将SMF服务标记为维护状态
svcadm clear fmri -- 清除SMF服务的维护状态
svcadm milestone milestone -- 进入指定的服务里程碑,相当于进入相应的运行级别
如果不指定参数,svcadm将输出该命令的使用方法。如:
-bash-3.00# svcadm
Usage: svcadm [-v] [cmd [args ... ]]
        svcadm enable [-rst] <service> ...      - enable and online service(s)
        svcadm disable [-st] <service> ...      - disable and offline service(s)
        svcadm restart <service> ...            - restart specified service(s)
        svcadm refresh <service> ...            - re-read service configuration
        svcadm mark [-It] <state> <service> ... - set maintenance state
        svcadm clear <service> ...              - clear maintenance state
        svcadm milestone [-d] <milestone>       - advance to a service milestone
        Services can be specified using an FMRI, abbreviation, or fnmatch(5)
        pattern, as shown in these examples for svc:/network/smtp:sendmail
        svcadm <cmd> svc:/network/smtp:sendmail
        svcadm <cmd> network/smtp:sendmail
        svcadm <cmd> network/*mail
        svcadm <cmd> network/smtp
        svcadm <cmd> smtp:sendmail
        svcadm <cmd> smtp
        svcadm <cmd> sendmail
SMF服务排错
使用svcs -xv可以查找未正常启动的服务。SMF对每个服务实例都在/var/svc/log目录创建了一个和服务FMRI对应的日志文件,比如apache2服务的FMRI为svc:/network/http:apache2,那么apache2服务状态变化的日志存放在名为network-http:apache2.log的文件中,
如运行以下命令
-bash-3.00# ls -l /var/svc/log  |grep network
-rw-r--r--   1 root     root         534 Feb  9 00:08 milestone-network:default.log
-rw-r--r--   1 root     root          77 Jan 30 15:25 network-dns-client:default.log
-rw-r--r--   1 root     root         169 Jan 30 15:27 network-dns-server:default.log
-rw-r--r--   1 root     root         803 Feb 13 01:17 network-http:apache2.log
-rw-r--r--   1 root     root        2843 Jan 30 15:30 network-inetd-upgrade:default.log
-rw-r--r--   1 root     root        2929 Feb 12 01:58 network-inetd:default.log
-rw-r--r--   1 root     root        2835 Feb 12 01:58 network-initial:default.log
-rw-r--r--   1 root     root          77 Jan 30 15:25 network-ipfilter:default.log
-rw-r--r--   1 root     root          77 Jan 30 15:25 network-iscsi_initiator:default.log
输出的第四行列出了apache2服务的日志文件名。通过查看这些文件可以获得服务未正常启动的线索。
SMF中的inetd服务
SMF包含了对inetd服务管理,除了标准的svccfg, svcadm, svcs命令外,SMF还提供了inetadm和inetconv专门管理inetd服务。inetadm命令用来查看、启用/禁用、修改inetd服务,inetconv则是用来将旧的inetd服务配置转化成SMF规范的服务。常用的inetadm选项如下
inetadm -e fmri 启用指定的inetd服务
inetadm -d fmri 禁用指定的inetd服务
inetadm -l fmri 列出指定inetd服务的属性
inetadm -p      列出默认inetd服务的属性
如果不指定参数inetadm将列出当前系统所有的inetd服务。如:
-bash-3.00# inetadm
ENABLED   STATE          FMRI
enabled   online         svc:/application/x11/xfs:default
enabled   online         svc:/application/font/stfsloader:default
enabled   offline        svc:/application/print/rfc1179:default
enabled   online         svc:/network/rpc/mdcomm:default
enabled   online         svc:/network/rpc/meta:default
enabled   online         svc:/network/rpc/metamed:default
enabled   online         svc:/network/rpc/metamh:default
enabled   online         svc:/network/rpc/gss:default
disabled  disabled       svc:/network/rpc/ocfserv:default
enabled   online         svc:/network/rpc/smserver:default
disabled  disabled       svc:/network/rpc/rex:default
enabled   online         svc:/network/rpc/rstat:default
enabled   online         svc:/network/rpc/rusers:default
disabled  disabled       svc:/network/rpc/spray:default
...
查看telnet服务的状态:
-bash-3.00# inetadm |grep telnet
enabled   online         svc:/network/telnet:default
禁用telnet服务
-bash-3.00# inetadm -d telnet
查看telnet服务的状态:
-bash-3.00# inetadm |grep telnet
disabled  disabled       svc:/network/telnet:default
SMF兼容旧的rc机制,solaris 10 2006 update 1版本中有些服务仍然使用了旧的rc机制,以运行级别三的服务为例,尚有以下服务未使用SMF:
-bash-3.00# ls -l /etc/rc3.d
total 30
-rw-r--r--   1 root     sys         1285 Jan 22  2005 README
-rwxr--r--   6 root     sys          474 Jan 22  2005 S16boot.server
-rwxr--r--   6 root     sys         1649 Jan  8  2005 S50apache
-rwxr-xr-x   1 root     sys          491 Jan  8  2005 S75seaport
-rwxr--r--   6 root     sys          685 Jan 22  2005 S76snmpdx
-rwxr--r--   6 root     sys         1125 Jan 22  2005 S77dmi
-rwxr--r--   6 root     sys          512 Jan 22  2005 S81volmgt
-rwxr-xr-x   5 root     sys         2225 Jan  8  2005 S82initsma
-rwxr--r--   5 root     sys          824 May 27  2004 S84appserv
-rwxr--r--   6 root     sys          324 Apr 20  2005 S90samb
其中S90samba,S50apache,S84appserv的存在表明Samba, Apache, Sun Application Server服务已启用。
总结
  SMF提供了一个健壮的、可管理的后台服务管理机制,它使系统管理更为方便。在下一篇里作者将结合实例讨论将创建SMF服务的方法和步骤。 
相关的手册
smf(5), svcadm(1M), svccfg(1M), inetadm(1M), svcs(1), svcprop(1), inetconv(1M) 
相关的文件和目录
/etc/svc          -- 存放SMF服务配置库
/var/svc/manifest -- 存放SMF服务manifest xml文件
/var/svc/profile  -- 存放SMF服务profile xml文件
/var/svc/log      -- 存放SMF服务状态变化日志
/lib/svc/method   -- 存放SMF服务启动脚本
/lib/svc/seed     -- 存放SMF服务配置库的出厂设置
新增SMF服务
在Solaris 10中创建SMF服务的步骤
1. 编写启动脚本
2. 编写manifest, profile
3. 导入到服务库中, svcadm import your_manifest.xml
服务定义:profile+manifest
SMF服务用XML文件定义。一种方式是先定义服务名称、启动/停止方法、依赖关系、属性等成为mainfest的信息,然后定义服务的实例profile。这种方式主要为了支持多实例的服务。另外一种是只定义manifest,这方便了那些单实例服务的定义。manifest和profile的文件的DTD相同,该DTD在Solaris系统的/usr/share/lib/xml/dtd/service_bundle.dtd.1文件中描述。
定义manifest
定义SMF服务manifest需要编写一个xml文件,大致结构是
<service_bundle type='manifest' name='xxx'>
  <service
        name='xxx'
        type='service'
        version='1'>
        <dependency> 
        </dependency>
        <exec_method
                type='method'
                name='start'
                exec='/lib/svc/method/sshd start'
                timeout_seconds='60'/>
        <property_group >
        </property_group>
        <stability value='Unstable' />
        <template>
        </template>
  </service>
</service_bundle>
service_bundle是根元素,type='manifest'表示该文件定义manifest,type='profile'则表示该文件定义profile,name属性的值应该和该服务软件包名称一致。 service_bundle可以包含一个或多个service元素,因此可以在一个manifest文件中定义多个服务。但为了便于维护不相关的服务通常定义在不同的文件中。service元素用来定义服务。type属性值应该为service。name属性是该服务的名称,不能和其它服务名重复。dependency用来定义该服务依赖其它服务;exec_method是该服务启动/停止/刷新时需要执行的方法;property_group定义服务的扩展属性;template主要提供该服务描述简要描述,其文档的链接或使用手册。
#TODO: add ssh manifest as exmaple
定义profile
定义profile相对简单,通常都只是在manifest的基础上定义服务的实例。大致结构如下:
<service_bundle type='profile' name='xxx' xmlns i='http://www.w3.org/2003/XInclude' >
  <service name='xxx' version='1' type='service'>
    <instance name='default' enabled='true'/>
  </service>
</service_bundle>
服务profile定义同样以service_bundle元素为根元素,其type属性的值固定为"profile"。需要定义实例的服务用service元素表示,并名称、版本、类型要和manifest中定义的一致。服务实例在service元素的instance子元素定义。一个服务可以定义多个实例。instance元素中可以重新定义dependency,exec_method,property_group,template来覆盖manifest中该服务的设置。通常只需要定义实例名称和是否需要启用即可。
#TODO: add ssh profile as exmaple
依赖关系:
  SMF中服务支持依赖关系,在服务的manifest文件中service元素的子元素dependency用来定义依赖。大致结构如下:
        <dependency name='xxx'
                grouping='require_all|require_any|optional_all|exclude_all'
                restart_on='none|error|restart|refresh'
                type='service|path'>
                <service_fmri value='xxx' />
        </dependency>
该元素的name属性定义该依赖的名称,type属性值为service表示该服务依赖于其它服务是否运行,值为path则表示依赖某个文件是否存在。grouping属性表示该服务有多依赖情形时依赖满足的规则。require_all表示该组依赖都必须满足;require_any表示该服务的诸多依赖中至少有一个满足;optional_all表示依赖是可选的;exclude_all表示服务的依赖不满足时满足。服务运行后,如果它所依赖的服务终止或刷新,那么SMF将根据导致这个状态改变的原因(通常是软硬件故障和软硬件故障)和restart_on属性的值来决定该服务本身是否需停止或重启。其规则如下表
                          |  restart_on的值
     事件               |  none  error restart refresh
     -------------------+------------------------------
     软硬件故障         |  否    是    是      是
     非故障终止         |  否    否    是      是
     刷新                 |  否    否    否      是
简单地说,如果restart_on为none则不管什么原因引起的所依赖服务终止、刷新都不会终止或刷新服务本身;如果restart_on为error则仅当软硬件故障原因引起的所依赖服务终止、刷新都才会终止或刷新服务本身;如果restart_on为restart则软硬件故障或非故障终止都会终止或刷新服务本身;如果restart_on为refresh则不管什么原因引起的所依赖服务终止或刷新都会终止或刷新服务本身;
smf对旧的rc机制的支持,(以solaris 10 update 1为实例说明)
 
在Solaris 10中增加smf服务的步骤
1. 编写启动脚本
2. 编写manifest, profile
3. 导入到服务库中, svcadm import your_manifest.xml
 
总结:smf优点
smf和传统的后台进程运行机制的比较
运行级别<-> milestone
服务的依赖关系,旧机制通过安排服务启动顺序进行有限的支持,smf可以显式地定义服务的依赖关系。
跟小段一起学Solaris(8)---服务管理_服务_09
哈,总算是完了!小睡片刻。