使用libscf.so实现SMF服务refresh方法

Solaris 10的SMF机制向系统管理员提供了统一的服务管理平台,利用它可方便地对所辖服务进行配置和管理,还可以在必要的时候自动重启服务 。SMF的配置功能不但可让系统管理员在服务下线的状态下通过svccfg(1M)配置服务属性,还可以在服务联机的状态下结合使用svCADm refresh命令,动态配置和启用最新属性 。另外,SMF还提供编程接口API(包含在libscf.so库中),利用它可以取代用户的配置文件以及相应的配置读取解析逻辑,享受专业级配置工具svccfg(1M)带来的便利 。本文将结合一个例子讲述如何在应用程序中使用libscf.so所提供的部分API实现SMF服务refresh方法 。
服务配置概述
对于大部分服务类应用而言,为了适应运行环境的多变性,一般都会在服务程序中编写配置读取模块,在服务启动时通过读取配置来决定如何提供服务 。比如,一个典型的网络服务可能在服务启动时通过读取配置文件决定网络服务端口、服务日志路径等 。配置的存在形式有多种,比如配置文件、数据库记录,甚至简单到使用操作系统环境变量等 。无论配置采用何种形式存在,为了能获取配置值,服务程序需要自行实现相应的配置读取和解析逻辑 。
除了在服务启动时需要读取配置外,有些行业领域要求服务应用可在服务运行过程中具有动态采用新配置的功能 。这就要求开发人员编写更复杂的逻辑以保证服务进程在运行过程中可在适当的时机,重新读取配置并采用新配置,同时又必须保证新配置的采用过程不会导致服务进程不稳定甚至崩溃 。动态读取配置的时机可有多种方式,较简单的方法比如,通过向服务进程发送某个特定信号,服务进程接到信号后重新读取配置,然后根据新配置设置服务环境并继续提供服务 。
SMF框架对服务配置的支持
在SMF中,配置被称为属性(property),配置值称为属性值(property value) 。利用svccfg(1M)工具可以设置服务的属性和属性值 。服务配置缺省保存在SMF全局资源库/etc/svc/repository.db中 。SMF的svc.configd进程负责存取资源库 。当其他SMF进程或工具需要配置信息时,可以通过连接svc.configd进程从资源库中获取配置,同样也通过svc.configd将配置存入资源库 。用户服务程序也可以通过使用libscf.so提供的API与svc.configd进程相连接,从资源库中存取服务配置 。
配置SMF服务最简单的方式是使用svccfg(1M)工具 。svccfg(1M)工具是一个交互式的配置修改工具,它包含许多简单实用的命令(具体命令可以在进入svccfg后使用help查询) 。比如常用命令有:
import命令可将以xml格式定义的用户服务加载为SMF服务并启动运行 。
delete命令可以删除用户服务 。
list和select命令可以查看和选取系统中现有的服务 。
listprop、editprop、setprop、delprop命令可以查看和修改当前服务的配置属性 。
另外,SMF还支持配置快照(snapshot)功能,通过它可以保留服务在某一时刻的属性配置,并在需要的时候可通过revert将当前配置恢复为某一时刻的快照配置 。快照相关的命令包括listsnap,selectsnap和revert 。
无论采用何种方式修改了当前服务的配置,这些修改只影响到资源库而非正在运行的服务进程 。如果要求当前服务能够马上应用新配置,则用户在退出svccfg(1M)工具后需要使用svCADm refresh命令指示相关服务重新读取配置并采用新配置 。
在SMF框架中,start和stop方法是服务必须提供的,这是由于SMF需要调用start和stop方法来启动和停止相应的服务 。而refresh方法则不是必要的,前提是用户服务不需要动态刷新启用新配置属性 。如果用户服务需要动态刷新配置属性,则用户服务在定义时,必须提供服务refresh方法,而相应服务程序也必须实现适时重新读取配置的逻辑 。

推荐阅读