系统管理指南:基本管理

第 19 章 管理服务(任务)

本章介绍了管理和监视服务管理工具 (Service Management Facility, SMF) 所需的任务。另外,本章还提供了与管理运行级别脚本有关的信息。本章包含以下主题:

管理服务(任务图)

以下任务图说明了使用 SMF 所需的过程。

任务 

说明 

参考 

显示服务实例的状态。 

显示所有正在运行的服务实例的状态。 

如何列出服务的状态

显示服务相关项。 

显示依赖指定服务的服务。 

如何显示依赖某个服务实例的服务

显示服务的相关性。 

显示指定服务所依赖的服务。此信息可用来帮助确定阻止服务启动的因素。 

如何显示某个服务所依赖的服务

禁用服务实例。 

关闭未正常工作或需要关闭以增强安全性的服务。 

如何禁用服务实例

启用服务实例 

启动服务。 

如何启用服务实例

重新启动服务实例。 

重新启动服务,而不必使用单独的命令先禁用服务,然后再启用服务。 

如何重新启动服务

修改服务实例。 

修改指定服务实例的配置参数。 

如何修改服务

 

更改由 inetd 控制的服务的配置属性。

如何更改由 inetd 控制的服务的属性

 

更改由 inetd 控制的服务的启动选项。

如何修改由 inetd 控制的服务的命令行参数

转换 inetd.conf 项。

inetd 服务转换为可使用 SMF 来监视的传统运行服务。

如何转换 inetd.conf

修复损坏的服务配置系统信息库。 

将损坏的系统信息库替换为缺省版本。 

如何修复已损坏的系统信息库

引导系统而不启动任何服务。 

引导系统而不启动任何服务,以便可以修复那些阻止引导的配置问题。 

如何在不启动任何服务的情况下引导

监视 SMF 服务

下列任务显示如何监视 SMF 服务。

Procedure如何列出服务的状态

以下过程可用来显示哪些服务正在运行。

  1. 运行 svcs 命令。

    在不使用任何选项的情况下运行此命令,会显示由 FMRI 指定的服务的状态报告。


    % svcs -l FMRI
    

示例 19–1 显示 rlogin 服务的状态

以下示例显示包括许多合同的服务的状态。


% svcs -l network/login:rlogin
fmri         svc:/network/login:rlogin
enabled      true
state        online
next_state   none
restarter    svc:/network/inetd:/default
contract_id  42325 41441 40776 40348 40282 40197 39025 38381 38053\
 33697 28625 24652 23689 15352 9889 7194 6576 6360 5387 1475 3015\
 6545 6612 9302 9662 10484 16254 19850 22512 23394 25876 26113 27326\
 34284 37939 38405 38972 39200 40503 40579 41129 41194


示例 19–2 显示 sendmail 服务的状态

以下示例显示包括相关性的服务的状态。


% svcs -l network/smtp:sendmail
fmri         svc:/network/smtp:sendmail
enabled      true
state        online
next_state   none
restarter    svc:/system/svc/restarter:default
contract_id  29462 
dependency   require_all/refresh file://localhost/etc/nsswitch.conf (-)
dependency   require_all/refresh file://localhost/etc/mail/sendmail.cf (-)
dependency   optional_all/none svc:/system/system-log (online)
dependency   require_all/refresh svc:/system/identity:domain (online)
dependency   require_all/refresh svc:/milestone/name-services (online)
dependency   require_all/none svc:/network/service (online)
dependency   require_all/none svc:/system/filesystem/local (online)


示例 19–3 显示所有服务的状态

以下命令列出系统上安装的所有服务以及每个服务的状态。该命令既显示已禁用的服务又显示已启用的服务。


% svcs -a


示例 19–4 显示由 inetd 控制的服务的状态

以下命令列出由 inetd 控制的服务,其中包括每个服务的 FMRI、运行状态以及服务是处于启用还是禁用状态。


% inetadm

Procedure如何显示依赖某个服务实例的服务

以下过程显示如何确定依赖指定服务的服务实例。

  1. 显示服务相关项。


    % svcs -D FMRI
    

示例 19–5 显示依赖多用户里程碑的服务实例

以下示例显示如何确定依赖多用户里程碑的服务实例。


% svcs -D milestone/multi-user
STATE          STIME    FMRI
online         Apr_08   svc:/milestone/multi-user-server:default

Procedure如何显示某个服务所依赖的服务

以下过程显示如何确定指定的服务实例所依赖的服务。

  1. 显示服务相关性。


    % svcs -d FMRI
    

示例 19–6 显示多用户里程碑所依赖的服务实例

以下示例显示多用户里程碑所依赖的服务实例。


% svcs -d milestone/multi-user:default
STATE          STIME    FMRI
disabled       Aug_24   svc:/platform/sun4u/sf880drd:default
online         Aug_24   svc:/milestone/single-user:default
online         Aug_24   svc:/system/utmp:default
online         Aug_24   svc:/system/system-log:default
online         Aug_24   svc:/system/system-log:default
online         Aug_24   svc:/system/rmtmpfiles:default
online         Aug_24   svc:/network/rpc/bind:default
online         Aug_24   svc:/milestone/name-services:default
online         Aug_24   svc:/system/filesystem/local:default
online         Aug_24   svc:/system/mdmonitor:default

管理 SMF 服务(任务图)

任务 

说明 

参考 

禁用服务实例。 

停止正在运行的服务并禁止重新启动该服务。 

如何禁用服务实例

启用服务实例。 

启动服务。另外,在以后重新引导系统时,该服务将重新启动。 

如何启用服务实例

重新启动服务。 

使用一个命令停止和启动服务。 

如何重新启动服务

恢复处于维护状态的服务。 

说明如何清除和重新启动处于维护状态的服务。 

如何恢复处于维护状态的服务

恢复到某个快照。 

使用以前的快照更正服务问题。 

如何恢复到另一个 SMF 快照

创建配置文件。 

创建一个根据需要禁用或启用服务的配置文件。 

如何创建 SMF 配置文件

应用配置文件。 

使用配置文件中的信息根据需要禁用或启用服务。 

如何应用 SMF 配置文件

使用 netservices 命令更改服务及其配置。

使用 generic_limited.xmlgeneric_open.xml 配置文件中的信息禁用或启用服务,同时还对这些服务的配置进行更改。

使用 generic*.xml 更改向网络提供的服务

管理 SMF 服务

本节包括有关管理 SMF 服务的信息。

对于 SMF 使用 RBAC 权限配置文件

可以使用 RBAC 权限配置文件来允许用户管理某些 SMF 服务,而不必授予用户 root 访问权限。权限配置文件定义用户可以运行哪些命令。已经为 SMF 创建了下列配置文件:

有关授权的具体信息,请参见 smf_security(5) 手册页。有关指定权限配置文件的说明,请参见《系统管理指南:安全性服务》中的“如何更改用户的 RBAC 属性”

Procedure如何禁用服务实例

请使用以下过程禁用服务。服务状态更改记录在服务配置系统信息库中。服务一旦被禁用,其禁用状态将持续到重新引导之后。使服务重新运行的唯一方法就是启用服务。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 检查要禁用的服务的相关项。

    如果此服务具有所需的相关项,则无法禁用此服务。


    # svcs -D FMRI
    
  3. 禁用此服务。


    # svcadm disable FMRI
    

示例 19–7 禁用 rlogin 服务

第一个命令的输出表明 rlogin 服务没有相关项。本示例中的第二个命令禁用 rlogin 服务。第三个命令显示 rlogin 服务实例处于禁用状态。


# svcs -D network/login:rlogin
# svcadm disable network/login:rlogin
STATE          STIME    FMRI
# svcs network/login:rlogin
STATE          STIME    FMRI
disabled         11:17:24 svc:/network/login:rlogin

Procedure如何启用服务实例

请使用以下过程启用服务。服务状态更改记录在服务配置系统信息库中。服务一旦被启用,则只要符合服务相关性,系统每次重新引导后仍将保持该启用状态。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 确定是否满足服务相关性。

    如果服务处于启用状态,则说明满足了服务相关性。否则,请使用 svcadm enable -r FMRI 以递归方式启用所有的相关性。


    # svcs -l FMRI|grep enabled
    
  3. 启用服务。


    # svcadm enable FMRI
    

示例 19–8 启用 rlogin 服务

本示例中的第二个命令启用 rlogin 服务。第三个命令显示 rlogin 服务实例处于联机状态。


# svcs -l network/login:rlogin|grep enabled
enabled      false
# svcadm enable network/login:rlogin
# svcs network/login:rlogin
STATE          STIME    FMRI
online         12:09:16 svc:/network/login:rlogin


示例 19–9 在单用户模式下启用服务

以下命令启用 rpcbind-t 选项在不更改服务系统信息库的临时模式下启动服务。在单用户模式下,系统信息库不可写。-r 选项以递归方式启动指定服务的所有相关性。


# svcadm enable -rt rpc/bind

Procedure如何重新启动服务

如果由于配置更改或其他原因而需要重新启动当前正在运行的服务,那么,可以重新启动该服务,而不必键入单独的命令来先停止后启动该服务。只有必须在禁用服务之后、启用服务之前更改配置时,才需要特意地先禁用服务,然后再启用。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 重新启动服务。


    # svcadm restart FMRI
    

Procedure如何恢复处于维护状态的服务

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 确定依赖该服务的任何进程是否已停止。

    通常,当某个服务实例处于维护状态时,与该实例相关的所有进程均已停止。但是,您应当在继续操作之前确保这一点。以下命令将列出与某个服务实例相关的所有进程以及这些进程的 PID(进程标识符)。


    # svcs -p FMRI
    
  3. (可选的)中止剩余的所有进程。

    对于由 svcs 命令显示的所有进程重复此步骤。


    # pkill -9 PID
    
  4. 如有必要,请修复服务配置。

    有关错误的列表,请查看 /var/svc/log 中相应的服务日志文件。

  5. 恢复此服务。


    # svcadm clear FMRI
    

Procedure如何恢复到另一个 SMF 快照

如果服务配置有误,则可以通过恢复到上次成功启动的快照来修复问题。在以下过程中,使用的是 console-login 服务以前的快照。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 运行 svccfg 命令。


    # svccfg
    svc:>
    1. 选择要修复的服务实例。


      注 –

      必须使用对该实例进行完全定义的 FMRI,而不允许使用快捷方式。



      svc:> select system/console-login:default
      svc:/system/console-login:default>
    2. 创建可用快照的列表。


      svc:/system/console-login:default> listsnap
      initial
      running
      start
      svc:/system/console-login:default>
    3. 选择或恢复到 start 快照。

      start 快照是上次成功启动服务时的快照。


      svc:/system/console-login:default> revert start
      svc:/system/console-login:default>
    4. 退出 svccfg


      svc:/system/console-login:default> quit
      #
  3. 更新服务配置系统信息库中的信息。

    该步骤用 start 快照中的配置信息更新系统信息库。


    # svcadm refresh system/console-login
    
  4. 重新启动服务实例。


    # svcadm restart system/console-login
    

Procedure如何创建 SMF 配置文件

配置文件是一个 XML 文件,其中列出了各个 SMF 服务以及每个服务是应当处于启用状态还是禁用状态。使用配置文件,可以同时启用或禁用多个服务。并非所有的服务都需要列在配置文件中。每个配置文件只需包括那些为了使其有用而必须启用或禁用的服务。

  1. 创建配置文件。

    在以下示例中,svccfg 命令用来创建一个配置文件,该配置文件反映当前系统上哪些服务处于启用状态,哪些服务处于禁用状态。您还可以创建现有配置文件的副本以对其进行编辑。


    # svccfg extract> profile.xml
    

    如果您使用的是 Oracle Solaris JumpStart,如果您具有大量相同的系统,或者您希望对系统配置进行归档以供日后恢复,则可能需要使用此过程来创建唯一版本的 SMF 配置文件。

  2. 编辑 profile.xml 文件以进行任何所需的更改。

    1. service_bundle 声明中更改配置文件的名称。

      在以下示例中,要将配置文件的名称更改为 profile


      # cat profile.xml
        ...
      <service_bundle type=`profile` name=`profile`
          xmIns::xi='http://www.w3.org/2003/XInclude'
        ...
    2. 删除所有不应当由该配置文件管理的服务。

      对于每个服务,删除三个描述该服务的行。每个服务说明都以 <service 开头并以 </service 结尾。以下示例说明 LDAP 客户机服务的说明行。


      # cat profile.xml
       ...
       <service name='network/ldap/client' version='1' type='service'>
               <instance  name='default' enabled='true'/>
       </service>
    3. 添加所有应当由该配置文件管理的服务。

      每个服务必须使用上面所示的三行语法来进行定义。

    4. 如有必要,请更改选定服务的启用标志。

      在以下示例中,sendmail 服务处于禁用状态。


      # cat profile.xml
        ...
        <service  name='network/smtp' version='1' type='service'>
          <instance  name='sendmail' enabled='false'/>
        </service>
        ...
  3. 如有必要,请应用新配置文件。

    有关说明,请参见如何应用 SMF 配置文件

Procedure如何应用 SMF 配置文件

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见 《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 应用配置文件。

    以下示例使用的是 profile.xml 配置文件。


    # svccfg apply profile.xml
    

    注 –

    有关在 generic_limited_net.xmlgeneric_open.xml 之间切换以及在进行此切换时需要应用的属性的具体说明,请参见使用 generic*.xml 更改向网络提供的服务


Procedure使用 generic*.xml 更改向网络提供的服务

netservices 命令可在最小网络风险和传统网络风险之间切换系统服务(如在以前的 Solaris 发行版中那样)。该切换是使用 generic_limited.xmlgeneric_open.xml 配置文件实现的。另外,该命令还可更改某些服务属性,以便根据需要将相应的服务限制在仅本地模式或传统模式。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 运行 netservices 命令。

    在以下示例中,选择的是开放式网络风险(即传统网络风险)。


    # /usr/sbin/netservices open
    

示例 19–10 限制网络服务的暴露程度

以下命令更改一些服务属性以使相应的服务在本地模式下运行,并限制哪些服务可以通过 generic_limited_net 配置文件来启用。只有在应用了 generic_open.xml 配置文件时,才应当使用此命令。


# /usr/sbin/netservices limited

配置 SMF 服务

Procedure如何修改服务

以下过程显示如何更改不是由 inetd 服务管理的服务的配置。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 根据需要对配置文件进行更改。

    许多服务都有一个或多个用来定义启动或其他配置信息的配置文件。这些文件可以在服务正在运行时进行更改。只有当服务已经启动后,才能检查这些文件的内容。

  3. 重新启动服务。


    # svcadm restart FMRI
    

示例 19–11 共享 NFS 文件系统

要使用 NFS 服务共享文件系统,必须在 /etc/dfs/dfstab 文件中定义 NFS 文件系统,然后重新启动 NFS 服务。以下示例显示 dfstab 文件的外观以及如何重新启动服务。


# cat /etc/dfs/dfstab
 .
 .
share -F nfs -o rw /export/home
# svcadm restart svc:/network/nfs/server

Procedure如何更改服务的环境变量

以下过程显示如何修改 cron 环境变量以帮助进行调试。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 检验该服务是否正在运行。


    # svcs system/cron
    STATE          STIME    FMRI
    online         Dec_04   svc:/system/cron:default
  3. 设置环境变量。

    在本示例中,设置的是 UMEM_DEBUGLD_PRELOAD 环境变量。有关 setenv 子命令的信息,请参阅 svccfg(1M) 手册页。


    # svccfg -s system/cron:default setenv UMEM_DEBUG default
    # svccfg -s system/cron:default setenv LD_PRELOAD libumem.so
    
  4. 刷新和重新启动该服务。


    # svcadm refresh system/cron
    # svcadm restart system/cron
    
  5. 检验是否已进行更改。


    # pargs -e `pgrep -f /usr/sbin/cron`
    100657: /usr/sbin/cron
    envp[0]: LOGNAME=root
    envp[1]: LD_PRELOAD=libumem.so
    envp[2]: PATH=/usr/sbin:/usr/bin
    envp[3]: SMF_FMRI=svc:/system/cron:default
    envp[4]: SMF_METHOD=/lib/svc/method/svc-cron
    envp[5]: SMF_RESTARTER=svc:/system/svc/restarter:default
    envp[6]: TZ=GB
    envp[7]: UMEM_DEBUG=default
    #

Procedure如何更改由 inetd 控制的服务的属性

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 列出指定服务的属性。

    以下命令显示由 FMRI 标识的服务的所有属性。


    # inetadm -l FMRI
    
  3. 更改该服务的属性。

    inetd 控制的服务的每个属性都由属性名和指定的值来定义。提供属性名而不指定值会将属性重置为缺省值。有关服务属性的具体信息应包含在与该服务相关的手册页中。


    # inetadm -m FMRI property-name=value
    
  4. 检验属性是否已更改。

    再次列出属性以确保已进行相应的更改。


    # inetadm -l FMRI
    
  5. 确认更改已生效。

    确认属性更改达到了所需的效果。


示例 19–12 更改 telnettcp_trace 属性

以下示例显示如何将 telnettcp_trace 属性设置为 true。在运行 telnet 命令之后,检查 syslog 的输出,此时会发现所做的更改已经生效。


# inetadm -l svc:/network/telnet:default
SCOPE    NAME=VALUE
         name="telnet"
 .
 .
default  inherit_env=TRUE
default  tcp_trace=FALSE
default  tcp_wrappers=FALSE
# inetadm -m svc:/network/telnet:default tcp_trace=TRUE
# inetadm -l svc:/network/telnet:default
SCOPE    NAME=VALUE
         name="telnet"
 .
 .
default  inherit_env=TRUE
         tcp_trace=TRUE
default  tcp_wrappers=FALSE
# telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
login: root
Password: 
Last login: Mon Jun 21 05:55:45 on console
Sun Microsystems Inc.   SunOS 5.10      s10_57  May 2004
# ^D
Connection to localhost closed by foreign host.
# tail -1 /var/adm/messages
Jun 21 06:04:57 yellow-19 inetd[100308]: [ID 317013 daemon.notice] telnet[100625]
    from 127.0.0.1 32802

Procedure如何修改由 inetd 控制的服务的命令行参数

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 列出特定服务的 exec 属性。

    以下命令显示由 FMRI 标识的服务的所有属性。添加 grep 命令会将输出限制在该服务的 exec 属性。


    # inetadm -l FMRI|grep exec
    
  3. 更改该服务的 exec 属性。

    具有 exec 属性的 command-syntax 集定义在启动服务时运行的命令字符串。


    # inetadm -m FMRI exec="command-syntax
    "
    
  4. 检验属性是否已更改。

    再次列出属性以确保已进行相应的更改。


    # inetadm -l FMRI
    

示例 19–13 向 ftp 命令添加连接日志 (-l) 选项

在以下示例中,当 ftp 守护进程启动时,会向其中添加 -l 选项。此更改的效果可通过在 ftp 登录会话已经完成之后,检查 syslog 输出来查看。


# inetadm -l svc:/network/ftp:default | grep exec
        exec="/usr/sbin/in.ftpd -a"
# inetadm -m svc:/network/ftp:default exec="/usr/sbin/in.ftpd -a -l"
# inetadm -l svc:/network/ftp:default
SCOPE    NAME=VALUE
         name="ftp"
         endpoint_type="stream"
         proto="tcp6"
         isrpc=FALSE
         wait=FALSE
         exec="/usr/sbin/in.ftpd -a -l"
 .
 .
# ftp localhost
Connected to localhost.
220 yellow-19 FTP server ready.
Name (localhost:root): mylogin
331 Password required for mylogin.
Password:
230 User mylogin logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 236 bytes in 0 transfers.
221-Thank you for using the FTP service on yellow-19.
221 Goodbye.
# tail -2 /var/adm/messages
Jun 21 06:54:33 yellow-19 ftpd[100773]: [ID 124999 daemon.info] FTP LOGIN FROM localhost 
     [127.0.0.1], mylogin
Jun 21 06:54:38 yellow-19 ftpd[100773]: [ID 528697 daemon.info] FTP session closed

Procedure如何转换 inetd.conf

以下过程将 inetd.conf 项转换为 SMF 服务清单。无论何时向系统添加依赖 inetd 的第三方应用程序,都需要运行此过程。如果您需要更改 /etc/inetd.conf 中项的配置,也需要运行此过程。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 转换 inetd.conf 项。

    inetconv 命令将选定文件中的每个项都转换为服务清单。


    # inetconv -i filename
    

示例 19–14 将 /etc/inet/inetd.conf 项转换为 SMF 服务清单


# inetconv -i /etc/inet/inetd.conf

使用运行控制脚本(任务图)

任务 

说明 

参考 

停止或启动服务。 

使用运行控制脚本停止或启动服务。 

如何使用运行控制脚本来停止或启动传统服务

添加运行控制脚本。 

创建运行控制脚本并将其添加到 /etc/init.d 目录中。

如何添加运行控制脚本

禁用运行控制脚本。 

通过重命名运行控制脚本文件来禁用该脚本。 

如何禁用运行控制脚本

使用运行控制脚本

Procedure如何使用运行控制脚本来停止或启动传统服务

每个运行级别都有单独脚本的一个优点是,可以在 /etc/init.d 目录中单独运行脚本来停止系统服务,而不必更改系统的运行级别。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 停止系统服务。


    # /etc/init.d/filename 
    stop
    
  3. 重新启动系统服务。


    # /etc/init.d/filename 
    start
    
  4. 检验服务是否已停止或启动。


    # pgrep -f service
    

示例 19–15 使用运行控制脚本停止或启动服务

例如,可以通过键入以下命令来停止 NFS 服务器守护进程:


# /etc/init.d/nfs.server stop
# pgrep -f nfs

然后,可以通过键入以下命令来重新启动 NFS 服务器守护进程:


# /etc/init.d/nfs.server start
# pgrep -f nfs
101773
101750
102053
101748
101793
102114
# pgrep -f nfs -d, | xargs ps -fp
     UID    PID   PPID   C    STIME TTY         TIME CMD
  daemon 101748      1   0   Sep 01 ?           0:06 /usr/lib/nfs/nfsmapid
  daemon 101750      1   0   Sep 01 ?          26:27 /usr/lib/nfs/lockd
  daemon 101773      1   0   Sep 01 ?           5:27 /usr/lib/nfs/statd
    root 101793      1   0   Sep 01 ?          19:42 /usr/lib/nfs/mountd
  daemon 102053      1   0   Sep 01 ?        2270:37 /usr/lib/nfs/nfsd
  daemon 102114      1   0   Sep 01 ?           0:35 /usr/lib/nfs/nfs4cbd

Procedure如何添加运行控制脚本

如果要添加用来启动和停止服务的运行控制脚本,请将该脚本复制到 /etc/init.d 目录中。然后,在要从其中启动和停止服务的 rcn .d 目录中创建链接。

有关命名运行控制脚本的更多信息,请参见每个 /etc/rc n.d 目录中的 README 文件。以下过程介绍如何添加运行控制脚本。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. /etc/init.d 目录中添加脚本。


    # cp filename/etc/init.d
    # chmod 0744 /etc/init.d/filename
    # chown root:sys /etc/init.d/filename
    
  3. 创建指向相应 rc n.d 目录的链接。


    # cd /etc/init.d
    # ln filename /etc/rc2.d/Snnfilename
    # ln filename /etc/rcn.d/Knnfilename
    
  4. 检验脚本在指定的目录中是否具有链接。


    # ls /etc/init.d/*filename /etc/rc2.d/*filename /etc/rcn.d/*filename
    

示例 19–16 添加运行控制脚本

以下示例显示如何为 xyz 服务添加运行控制脚本。


# cp xyz /etc/init.d
# chmod 0744 /etc/init.d/xyz
# chown root:sys /etc/init.d/xyz
# cd /etc/init.d
# ln xyz /etc/rc2.d/S99xyz
# ln xyz /etc/rc0.d/K99xyz
# ls /etc/init.d/*xyz /etc/rc2.d/*xyz /etc/rc0.d/*xyz

Procedure如何禁用运行控制脚本

通过在文件名开头加一个下划线 (_) 来重命名运行控制脚本可以禁用该运行控制脚本。系统不执行以下划线或点开头的文件。如果通过为文件添加后缀的方法来复制该文件,那么,带后缀和不带后缀的文件都将运行。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 通过在新文件的开头添加下划线 (_) 来重命名脚本。


    # cd /etc/rcn.d
    # mv filename_filename
    
  3. 检验脚本是否已重命名。


    # ls _*
    _filename
    

示例 19–17 禁用运行控制脚本

以下示例显示如何重命名 S99datainit 脚本。


# cd /etc/rc2.d
# mv S99datainit _S99datainit
# ls _*
_S99datainit

对服务管理工具进行故障排除

Procedure调试未启动的服务

在该过程中,打印服务处于禁用状态。

  1. 成为超级用户或同等角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”

  2. 请求有关挂起服务的信息。


    # svcs -xv
    svc:/application/print/server:default (LP Print Service)
     State: disabled since Wed 13 Oct 2004 02:20:37 PM PDT
    Reason: Disabled by an administrator.
       See: http://sun.com/msg/SMF-8000-05
       See: man -M /usr/share/man -s 1M lpsched
    Impact: 2 services are not running:
            svc:/application/print/rfc1179:default
            svc:/application/print/ipp-listener:default

    -x 选项提供有关受到影响的服务实例的其他信息。

  3. 启用服务。


    # svcadm enable application/print/server
    

Procedure如何修复已损坏的系统信息库

以下过程显示如何将已损坏的系统信息库替换为缺省的系统信息库副本。系统信息库守护进程 svc.configd 在启动之后不会对配置系统信息库执行完整性检查。配置系统信息库存储在 /etc/svc/repository.db 中。配置系统信息库可能会由于以下某种原因而损坏:

如果完整性检查失败,svc.configd 守护进程会向控制台写入一条以下类似的消息:


svc.configd: smf(5) database integrity check of:

    /etc/svc/repository.db

  failed.  The database might be damaged or a media error might have
  prevented it from being verified.  Additional information useful to
  your service provider is in:

    /etc/svc/volatile/db_errors

  The system will not be able to boot until you have restored a working
  database.  svc.startd(1M) will provide a sulogin(1M) prompt for recovery
  purposes.  The command:

    /lib/svc/bin/restore_repository

  can be run to restore a backup version of your repository. See
  http://sun.com/msg/SMF-8000-MY for more information.

随后,svc.startd 守护进程将退出,并启动 sulogin,以便您进行维护。

  1. sulogin 提示符下输入 root 口令。借助 suloginroot 用户可以进入系统维护模式从而修复系统。

  2. 运行以下命令:


    # /lib/svc/bin/restore_repository
    

    运行此命令可指导您完成恢复未经损坏的备份所必需的步骤。SMF 会在系统的任何关键时刻自动提取系统信息库的备份。有关更多信息,请参见SMF 系统信息库备份

    在启动 /lib/svc/bin/restore_repository 命令之后,会显示一条以下类似的消息:


    Repository Restore utility
    See http://sun.com/msg/SMF-8000-MY for more information on the use of
    this script to restore backup copies of the smf(5) repository.
    
    If there are any problems which need human intervention, this script
    will give instructions and then exit back to your shell.
    
    Note that upon full completion of this script, the system will be
    rebooted using reboot(1M), which will interrupt any active services.

    如果要恢复的系统不是本地区域,则该脚本将说明如何使用读取和写入权限来重新挂载 //usr 文件系统,以便恢复数据库。该脚本会在列显这些说明之后退出。请按照这些说明执行操作,同时应特别注意可能出现的任何错误。

    在使用写入权限挂载了 root ( /) 文件系统之后,或者如果该系统是本地区域,则系统将提示您选择要恢复的系统信息库备份:


    The following backups of /etc/svc/repository.db exists, from
    oldest to newest:
    
    ... list of backups ...

    基于备份类型和备份时间来确定备份的名称。以 boot 开头的备份在系统引导之后、首次更改系统信息库之前完成。以 manifest_import 开头的备份在 svc:/system/manifest-import:default 完成其进程之后完成。备份时间以 YYYYMMDD_HHMMSS 格式提供。

  3. 输入相应的响应。

    通常会选择最新的备份选项。

    Please enter one of:
            1) boot, for the most recent post-boot backup
            2) manifest_import, for the most recent manifest_import backup.
            3) a specific backup repository from the above list
            4) -seed-, the initial starting repository. (All customizations
               will be lost.)
            5) -quit-, to cancel.
    
    Enter response [boot]:

    如果在未指定要恢复的备份的情况下按 Enter 键,则会选择用 [] 括起的缺省响应。选择 -quit- 会退出 restore_repository 脚本,并返回到 shell 提示符。


    注 –

    选择 -seed- 会恢复 seed 系统信息库。此系统信息库设计用于初始安装和升级过程。如非绝对必要,请勿使用 seed 系统信息库进行恢复。


    在选择了要恢复的备份之后,系统将对其进行验证并检查其完整性。如有任何问题,restore_repository 命令会列显错误消息并提示您进行其他选择。在选择了有效的备份之后,系统会列显如下信息,并提示您进行最终确认。

    After confirmation, the following steps will be taken:
    
    svc.startd(1M) and svc.configd(1M) will be quiesced, if running.
    /etc/svc/repository.db
        -- renamed --> /etc/svc/repository.db_old_YYYYMMDD_HHMMSS
    /etc/svc/volatile/db_errors
        -- copied --> /etc/svc/repository.db_old_YYYYMMDD_HHMMSS_errors
    repository_to_restore
        -- copied --> /etc/svc/repository.db
    and the system will be rebooted with reboot(1M).
    
    Proceed [yes/no]?
  4. 键入 yes 修复故障。

    restore_repository 命令执行了列出的所有操作之后,系统将重新引导。

Procedure如何在不启动任何服务的情况下引导

如果在启动服务时出现问题,有时系统会在引导过程中挂起。以下过程显示如何解决此问题。

  1. 在不启动任何服务的情况下引导。

    此命令指示 svc.startd 守护进程临时禁用所有的服务并在控制台上启动 sulogin


    ok boot -m milestone=none
    
  2. root 身份登录系统。

  3. 启用所有的服务。


    # svcadm milestone all
    
  4. 确定引导过程挂起的位置。

    在引导过程挂起时,通过运行 svcs -a 来确定哪些服务未在运行。在位于 /var/svc/log 中的日志文件中查找错误消息。

  5. 在问题得以修复之后,检验所有的服务是否已启动。

    1. 检验是否所有必需的服务都已联机。


      # svcs -x
      
    2. 检验是否满足 console-login 服务的相关性。

      以下命令检验控制台上的 login 进程是否将运行。


      # svcs -l system/console-login:default
      
  6. 继续执行正常的引导过程。

Procedure系统引导期间当 system/filesystem/local:default 服务失败时,如何强制出现 sulogin 提示符

引导 Solaris OS 时不需要的本地文件系统由 svc:/system/filesystem/local:default 服务挂载。当其中的任何文件系统无法挂载时,该服务将进入维护状态。系统将继续启动,并将启动不依赖 filesystem/local 的任何服务,而要求 filesystem/local 联机才能通过相关性启动的服务将不会启动。

要更改系统的配置,以在该服务失败后立即出现 sulogin 提示符(而不是允许系统继续启动),请按照下面的过程操作。

  1. 修改 system/console-login 服务。


    # svccfg -s svc:/system/console-login
    svc:/system/console-login> addpg site,filesystem-local dependency
    svc:/system/console-login> setprop site,filesystem-local/entities = fmri: svc:/system/filesystem/local
    
    svc:/system/console-login> setprop site,filesystem-local/grouping = astring: require_all
    
    svc:/system/console-login> setprop site,filesystem-local/restart_on = astring: none
    
    svc:/system/console-login> setprop site,filesystem-local/type = astring: service
    
    svc:/system/console-login> end
    
  2. 刷新该服务。


    # svcadm refresh console-login
    

示例 19–18 使用 Oracle Solaris JumpStart 强制出现 sulogin 提示符

将下面的命令保存到一个脚本中并将该脚本另存为 /etc/rcS.d/S01site-customfs


#!/bin/sh
#
# This script adds a dependency from console-login -> filesystem/local
# This forces the system to stop the boot process and drop to an sulogin prompt
# if any file system in filesystem/local fails to mount.

PATH=/usr/sbin:/usr/bin
export PATH

	svccfg -s svc:/system/console-login << EOF
addpg site,filesystem-local dependency
setprop site,filesystem-local/entities = fmri: svc:/system/filesystem/local
setprop site,filesystem-local/grouping = astring: require_all
setprop site,filesystem-local/restart_on = astring: none
setprop site,filesystem-local/type = astring: service
EOF

svcadm refresh svc:/system/console-login

[ -f /etc/rcS.d/S01site-customfs ] &&
    rm -f /etc/rcS.d/S01site-customfs

故障排除

system/filesystem/local:default 服务失败时,应当使用 svcs -vx 命令来标识该失败。在错误得以修复之后,可以使用下面的命令来清除错误状态并允许系统继续引导: svcadm clear filesystem/local