一、 如何修改服务
1 修改smf服务
以下过程显示如何更改不是由 inetd 服务管理的服务的步骤:
成为超级用户或承担包括 Service Management 权限配置文件的角色。
根据需要对配置文件进行更改。
重新启动服务。
# svcadm restart FMRI
说明:许多服务都有一个或多个用来定义启动或其他配置信息的配置文件。这些文件可以在服务正在运行时进行更改。只有当服务已经启动后,才能检查这些文件的内容。我们看一个例子:
更改NFS 文件系统共享的目录
要更改 NFS 服务共享文件系统,必须在 /etc/dfs/dfstab 文件中定义 NFS 文件系统,然后重新启动 NFS 服务。以下示例显示 dfstab 文件的外观以及如何重新启动服务。
2 查看、修改服务的环境变量# cat /etc/dfs/dfstab
cat /etc/dfs/dfstab
share -F nfs -o rw=engineering -d "home dirs" /export/home2
# svcadm restart svc:/network/nfs/server
Unix(包括Solaris)是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。
(1) 使用set命令显示所有本地定义的Shell变量,如图1

图1 用set命令显示所有本地定义的Shell变量
从图1可以看到登录的用户名称(root),终端号(6),SSh ip地址和端口等信息。
(2) 使用env命令显示所有的环境变量
(3) 修改环境变量的步骤# env
HOME=/
LANG=zh_CN.GB18030
LOGNAME=root
MAIL=/var/mail//root
PATH=/usr/sbin:/usr/bin
SHELL=/sbin/sh
SSH_CLIENT=192.168.206.12 1048 22
SSH_CONNECTION=192.168.206.12 1048 192.168.206.129 22
SSH_TTY=/dev/pts/6
TERM=xterm
TZ=PRC
USER=root
以下过程显示如何修改 cron 环境变量以帮助进行调试。cron 系统可处理所有基于时间的命令执行计划,并提供了可用于在特定时间运行命令的两个不同解决方案。
成为超级用户或承担包括 Service Management 权限配置文件的角色。
检验该服务是否正在运行。
命令输出如图2 。# svcs system/cron
STATE STIME FMRI
online 19:06:04 svc:/system/cron:default
 查看修改前的环境变量
使用命令:pargs -e `pgrep -f /usr/sbin/cron`

图2查看修改前的环境变量
设置环境变量。
下面笔者设置的是 UMEM_DEBUG 环境变量。使用命令如下:
命令输出如图3 。# svccfg -s system/cron:default setenv UMEM_DEBUG default
 刷新和重新启动该服务
使用命令如下:
# svcadm refresh system/cron
# svcadm restart system/cron
 检验修改是否生效
使用命令:pargs -e `pgrep -f /usr/sbin/cron`

对比图2和图3 可以看到修改后的环境变量是:
envp[7]: UMEM_DEBUG=default
3更改由inetd 控制的服务的属性的步骤
成为超级用户或承担包括 Service Management 权限配置文件的角色。
列出指定服务的属性。
以下命令显示由 FMRI 标识的服务的所有属性。
# inetadm -l FMRI
更改该服务的属性。
由 inetd 控制的服务的每个属性都由属性名和指定的值来定义。提供属性名而不指定值会将属性重置为缺省值。有关服务属性的具体信息应包含在与该服务相关的手册页中。
# inetadm -m FMRI property-name=value
检验属性是否已更改。
再次列出属性以确保已进行相应的更改。
# inetadm -l FMRI
确认更改已生效。
确认属性更改达到了所需的效果。
下面看一个例子:
将 telnet 的 tcp_trace 属性设置为 true。
(1)首先查看telnet服务
# inetadm -l svc:/network/telnet:default
命令输出如图4 。

图4首先查看telnet服务
从图4 黑色标记部分可以看到现在telnet 的 tcp_trace 属性设置为false。
(2)使用命令修改
#inetadm -m svc:/network/telnet:default tcp_trace=TRUE
(3)重新查看telnet服务
# inetadm -l svc:/network/telnet:default
命令输出如图5 。

图5重新查看telnet服务
从图5 黑色标记部分可以看到现在telnet 的 tcp_trace 属性设置为 true。
另外在运行 telnet 命令之后,检查 syslog 的输出,此时会发现所做的更改已经生效。使用命令:tail -1 /var/adm/messages 。
二、 使用脚本来管理服务
每个运行级都有单独脚本的一个优点是,可以在 /etc/init.d 目录中单独运行脚本来停止系统服务,而不必更改系统的运行级。
1 使用运行控制脚本来停止或启动传统服务的步骤:
成为超级用户或承担包括 Service Management 权限配置文件的角色。
停止系统服务。
# /etc/init.d/filename stop
重新启动系统服务。
# /etc/init.d/filename start
检验服务是否已停止或启动。
# pgrep -f service
下面以nfs服务为例子:
(1) 首先关闭nfs服务
/etc/init.d/nfs.server stop
(2) 查看nfs服务
pgrep -f nfs
(3) 重新启动nfs服务
/etc/init.d/nfs.server start
(4) 重新查看nfs服务
2 添加运行控制脚本的步骤# pgrep -f nfs -d, | xargs ps -fp
UID PID PPID C STIME TTY TIME CMD
daemon 239 1 0 19:06:07 ? 0:00 /usr/lib/nfs/statd
daemon 246 1 0 19:06:09 ? 0:00 /usr/lib/nfs/lockd
如果要添加用来启动和停止服务的运行控制脚本,请将该脚本复制到 /etc/init.d 目录中。然后,在要从其中启动和停止服务的 rcn.d 目录中创建链接。以下步骤介绍如何添加运行控制脚本。
成为超级用户或承担包括 Service Management 权限配置文件的角色。
将脚本添加到 /etc/init.d 目录中。
# cp filename /etc/init.d
# chmod 0744 /etc/init.d/filename
# chown root:sys /etc/init.d/filename
创建指向相应 rc n.d 目录的链接。
3 运行控制脚本# cd /etc/init.d
# ln filename /etc/rc2.d/Snnfilename
# ln filename /etc/rcn.d/Knnfilename
 检验脚本在指定的目录中是否具有链接。
# ls /etc/init.d/**//*filename /etc/rc2.d/*filename /etc/rcn.d/*filename
以下示例显示如何重命名 S99datainit 脚本。
# cd /etc/rc2.d
# mv S99datainit _S99datainit
三、 SMF服务的调试和修复
1 自动修复已损坏的SMF系统信息库
系统信息库守护进程 svc.configd 在启动之后不会对配置系统信息库执行完整性检查。配置系统信息库存储在 /etc/svc/repository.db SMF系统信息库中。配置系统信息库可能会由于以下某种原因而损坏:磁盘故障,硬件错误,软件错误,无意中覆写文件。如果完整性检查失败,svc.configd 守护进程会向控制台写入一条消息,随后,svc.startd 守护进程将退出,并启动 sulogin,以便您进行维护。步骤如下:
在 sulogin 提示符处输入 root 密码。sulogin 使 root 用户能够进入系统维护模式来修复系统。
运行以下命令:
# /lib/svc/bin/restore_repository
运行此命令可指导您完成恢复未经损坏的备份所必需的步骤。SMF 会在系统的任何关键时刻自动提取系统信息库的备份。
2 手工修复已损坏的SMF系统信息库
步骤如下:
成为超级用户或者授权角色用户
3 在系统启动时如何交互式启动服务 停止svc.startd daemon
#pstop ‘pgrep svc.startd’
 停止svc.configd daemon
#pkill svc.configd
 保存当前数据库
#cp /etc/svc/repository.db /etc/svc/repository.bad
 用备份数据库替换当前库。
#cp /lib/svc/seed/global.db /etc/svc/repository.db
成为超级用户或者授权角色用户
不启动svc.startd daemon,但是在控制台启动sulogin
ok boot –m milestone=none
以root登陆到系统
启动所有服务:
#svcadm milestone –t all
查看那些服务没有启动:
#svcs -l
然后修复这些问题,检查这些服务是否启动。
a. 检查所有服务是否在线使用命令:
#svcs -l
b. 检查login进程是否在运行使用命令:
#svcs –l system/console-login:default
继续系统启动进程
4 当SMF服务没有启动时如何处理
假设打印服务处于禁用状态,处理步骤:
成为超级用户或者授权角色用户
查看问题服务信息
#svcs –xv
输出如图6 。

图6查看问题服务信息
修复后,重新启动问题服务。
#svcadm enable application/print/server
重新查看服务信息
使用svcs -a 命令查看服务,如图7 。

图7 使用svcs -a 命令查看
从图7 的最后三行已经处于online状态了。
总结:到此为止smf服务系列文章全部介绍完了,主要介绍了管理和监视服务管理工具 (Service Management Facility, SMF) 所需的任务。另外,本章还提供了与管理运行级脚本有关的信息。Solaris 10引入全新的后台服务管理机制,该机制被称为SMF,它包含了新的概念、管理工具和服务定义方式。比如用里程碑(milestone)代替了运行级别的概念;用服务配置库代替分散在/etc/rcx.d目录的服务启动脚本。通过使用SMF技术,系统中所有的服务可以在一个统一而强大的平台中进行配置和管理。同时,它也是预测性自愈技术的组成部分,可以自我侦测各服务的运行状态,尽可能地减少服务下线的机率。另外,利用SMF 技术系统管理员可以降低系统维护难度,减少人为出错机会。