-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 S90samba
其中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快速入门
面向开发者的SMF介绍
http://www.sun.com/bigadmin/content/selfheal/sdev_intro.html配置JBoss为SMF服务的例子
配置Postfix为SMF服务的例子
Solaris管理员手册:
System Administration Guide: Basic Administration Chapter 14 Managing Services (Overview),Chapter 15 Managing Services (Tasks)
新增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文件,大致结构是
name='xxx'
type='service'
version='1'>
type='method'
name='start'
exec='/lib/svc/method/sshd start'
timeout_seconds='60'/>
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的基础上定义服务的实例。大致结构如下:
服务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用来定义依赖。大致结构如下:
grouping='require_all|require_any|optional_all|exclude_all'
restart_on='none|error|restart|refresh'
type='service|path'>
该元素的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可以显式地定义服务的依赖关系
相关的手册
smf(5)
相关的文件和目录
/etc/svc/*; /var/svc/*; /lib/svc/*
参考信息
SMF快速入门
面向开发者的SMF介绍
http://www.sun.com/bigadmin/content/selfheal/sdev_intro.html配置JBoss为SMF服务的例子
配置Postfix为SMF服务的例子
Solaris管理员手册:
System Administration Guide: Basic Administration Chapter 14 Managing Services (Overview),Chapter 15 Managing Services (Tasks)