文章
服务器与存储管理
作者:Glynn Foster
svcbundle,并演示开发人员和管理员如何使用它更快地集成应用和 SMF。2012 年 10 月发布
随着 Oracle Solaris 11.1 中引入 svcbundle,创建清单和配置文件变得更容易,您可以利用自动应用重启的好处,而无需详细了解与服务管理工具 (SMF) 集成时使用的 XML 文件格式。
|
SMF 最初是在 Oracle Solaris 10 中引入的,是一个用来管理系统和应用服务的操作系统特性,它取代了 Oracle Solaris 和其他 UNIX 操作系统早期版本中传统的 init 脚本启动机制。SMF 可确保重要系统和应用服务即便在软硬件发生故障时也能继续运行,从而提高了系统的可用性。因此,SMF 是一个应用比较广泛的 Oracle Solaris 预测性自我修复功能组件。
本文介绍 Oracle Solaris 11.1 中新引入的名为 svcbundle 的实用程序,并演示如何使用它更快地集成应用和 SMF。如果您不熟悉 SMF,建议您先阅读“Oracle Solaris 11 中的服务管理工具 (SMF) 基础知识简介”和“利用 Oracle Solaris 11 中的服务管理工具 (SMF) 进行高级管理”这两篇文章。
SMF 的核心是服务包的概念,这是一个基于 XML 的文件,用于描述有关服务或服务实例的一切信息(包括其配置),然后会导入到 SMF 配置信息库中并用于运行中的系统。服务包用于将服务提供给 Oracle Solaris,此外,您还可利用它们在各种系统之间提供自定义配置。
SMF 中使用两种类型的服务包:清单和配置文件。
/lib/svc/manifest 中,在系统重新启动期间自动导入 SMF 配置信息库中,也可以通过重新启动 svc:/system/manifest-import:default 服务手动导入。/etc/svc/profile 中并在系统重新启动时应用,也可以通过重新启动 svc:/system/manifest-import:default 服务手动应用。svcbundle 将应用集成到 SMF“如何将系统服务控制从脚本迁移到服务管理工具”介绍了如何根据 /usr/share/lib/xml/dtd/service_bundle.dtd.1 中的 XML DTD 从头开始编写 SMF 清单(或从现有系统清单复制并修改)。但 Oracle Solaris 11.1 中提供了一个易于使用的新 svcbundle 命令行实用程序,可帮助您创建 SMF 清单或系统配置文件,而无需了解 XML 文件格式。
svcbundle 允许您针对常见场景创建和安装(可选)清单或系统配置文件。因此,svcbundle 进行了一些简单的假设来处理常见的场景:
svc.startd。svc:/milestone/multi-user 服务的自动依赖性确保了在系统启动过程中不会过早启动该服务。start 和 restart exec 方法的超时默认设置为 60 秒。您向 svcbundle 提供一系列名称-值对,用于定义清单或配置文件的不同元素,例如,服务实例名、应启用还是禁用、不同属性值、启动、停止和刷新方法,以及应为何种类型的服务。该实用程序还可以帮助将原来的 RC(运行控制)脚本转换成 SMF。
与许多命令行实用程序一样,用示例更容易看明白,因此我们将显示两个 svcbundle 用例:
svcbundle 创建 SMF 清单在本示例中,我们将使用 svcbundle 创建 SMF 清单,在系统重新启动时自动启动 Nagios。Nagios 目前并未打包在 Oracle Solaris 11 软件包信息库中,因此您必须先从 http://www.nagios.org 下载,然后执行简单的安装。
在本示例中,我们将 Nagios 安装到 /usr/local/nagios 前缀中,修改了 Apache Web 服务器配置文件,使其能够感知 Nagios 安装。我们可以直接启动 Nagios 后台进程,方法是使用 -d 选项并为其提供配置文件的位置,如下所示:
# /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
现在可以在浏览器中导航到 http://localhost/nagios,检查它是否成功运行,如图 1 所示:

图 1.Nagios
一旦我们有了一个工作的 Nagios 安装,下一步是将此应用集成到 SMF,这样若发生任何软件故障,它就会在系统启动或重新启动过程中启动。为此,我们将使用 svcbundle 为其生成一个 SMF 清单,如下所示:
# svcbundle -o nagios.xml -s service-name=application/nagios -s model=daemon \ -s start-method="/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg"
在清单 1 所示的示例中,我们定义了三个名称-值对。我们将 -s service-name 选项定义为 application/nagios,这将生成名为 svc:/application/nagios:default 的服务。我们将 -s model 选项定义为 daemon,这样 SMF 将跟踪此服务的所有进程。我们还将 -s start-method 选项定义为稍前启动 Nagios 后台进程时所用的值。我们将此清单输出到 nagios.xml 文件,如 -o 选项所定义。SMF 将自动验证生成的清单。
# cat nagios.xml
<?xml version="1.0" ?>
<!DOCTYPE service_bundle
SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<!--
Manifest created by svcbundle (2012-Sep-11 00:19:49+1200)
-->
<service_bundle type="manifest" name="application/nagios">
<service version="1" type="service" name="application/nagios">
<!--
The following dependency keeps us from starting until the
multi-user milestone is reached.
-->
<dependency restart_on="none" type="service"
name="multi_user_dependency" grouping="require_all">
<service_fmri value="svc:/milestone/multi-user"/>
</dependency>
<exec_method timeout_seconds="60" type="method" name="start"
exec="/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg"
/>
<!--
The exec attribute below can be charged to a command that SMF
should execute to stop the service. See smf_method(5) for more
details.
-->
<exec_method timeout_seconds="60" type="method" name="stop"
exec=":kill"/>
<!--
The exec attribute below can be changed to a command that SMF
should execute when the service is refreshed. Services are
typically refreshed when their properties are changed in the
SMF repository. See smf_method(5) for more details. It is
common to retain the value of :true which means that SMF will
take no action when the service is refreshed. Alternatively,
you may wish to provide a method to reread the SMF repository
and act on any configuration changes.
-->
<exec_method timeout_seconds="60" type="method" name="refresh"
exec=":true"/>
....
</service>
</service_bundle>
清单 1.示例清单
下一步是重新启动 svc:/system/manifest-import:default 服务,获取此清单并将其安装到 /lib/svc/manifest/site 中。我们还要重新启动 svc:/network/http:apache22 服务,因为我们修改了 Apache 配置。
# svcadm restart apache22 # cp nagios.xml /lib/svc/manifest/site # svcadm restart manifest-import # svcs nagios STATE STIME FMRI online 2:13:01 svc:/application/nagios:default # ps -ef | grep nagios nagios 25743 1 0 00:50:43 ? 0:06 /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
我们还可以使用 -i 选项(而非 -o 选项)将生成的 SMF 清单直接安装到系统中,并自动重新启动 svc:/system/manifest-import:default 服务。
这是一个使用 svcbundle 快速生成简单 SMF 清单的简单示例。如果您想要进一步自定义,可以在生成此模板清单时立即进行修改。
svcbundle 创建 SMF 系统配置文件在本示例中,我们将使用 svcbundle 生成一个 SMF 系统配置文件,自定义 svc:/network/dns/client 服务中的名称服务器地址配置。为此,我们将需要使用 service-property 和 bundle-type 名称-值对,如下所示:
# svcbundle -o nameserver-config.xml -s service-name=network/dns/client \ -s bundle-type=profile -s service-property="config:nameserver:net_address:192.168.0.1"
svcbundle 的默认包类型为 manifest,因此我们将 bundle-type 定义为 profile。使用一个由冒号分隔的四元组:属性组、属性名称、属性类型和值,定义服务和服务实例配置属性。在清单 2 中,我们将 service-property 名称值定义为 config:nameserver:net_address:192.168.0.1。
# cat nameserver-config.xml
<?xml version="1.0" ?>
<!DOCTYPE service_bundle
SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<!--
Manifest created by svcbundle (2012-Sep-11 02:33:16+1200)
-->
<service_bundle type="profile" name="network/dns/client">
<service version="1" type="service" name="network/dns/client">
<property_group type="application" name="config">
<propval type="net_address" name="nameserver"
value="192.168.0.1"/>
</property_group>
</service>
</service_bundle>
清单 2.示例配置文件
如前面 SMF 清单中一样,现在需要获取此 SMF 系统配置文件并将其安装到系统上。为此,我们将其复制到 /etc/svc/profile/site/ 并重新启动 svc:/system/manifest-import:default 服务:
# cp nameserver-config.xml /etc/svc/profile/site # svcadm restart manifest-import # svcprop -p config/nameserver dns/client 192.168.0.1
和前面一样,可以使用 -i 选项将配置文件直接安装到系统上。
这是一个简单示例,只是设置服务的一个属性。此时,svcbundle 只支持为一个服务或服务实例创建系统配置文件,但创建这些初始配置文件之后,即可构造更复杂的配置文件。
如果您管理 Oracle Solaris 11 系统服务和应用,SMF 为您提供了许多好处,包括服务自动重新启动、统一的服务配置和与故障管理框架整合。新工具 svcbundle 可帮助您创建 SMF 清单并将关键服务和应用集成到 SMF 框架中。它还可用于创建系统配置文件,为数据中心环境中安装的各种 Oracle Solaris 系统提供自定义。
Glynn Foster 是 Oracle Solaris 的首席产品经理,负责技术领域,包括映像包管理系统 (IPS) 和服务管理工具 (SMF)。Glynn 于 2010 年随着 Oracle 收购 Sun Microsystems 而加入 Oracle。
| 修订版 1.1,2014 年 3 月 10 日 |