本章介绍了管理和监视服务管理工具 (Service Management Facility, SMF) 所需的任务。另外,本章还提供了与管理运行级别脚本有关的信息。本章包含以下主题:
以下任务图说明了使用 SMF 所需的过程。
任务 |
说明 |
参考 |
---|---|---|
显示服务实例的状态。 |
显示所有正在运行的服务实例的状态。 | |
显示服务相关项。 |
显示依赖指定服务的服务。 | |
显示服务的相关性。 |
显示指定服务所依赖的服务。此信息可用来帮助确定阻止服务启动的因素。 | |
禁用服务实例。 |
关闭未正常工作或需要关闭以增强安全性的服务。 | |
启用服务实例 |
启动服务。 | |
重新启动服务实例。 |
重新启动服务,而不必使用单独的命令先禁用服务,然后再启用服务。 | |
修改服务实例。 |
修改指定服务实例的配置参数。 | |
更改由 inetd 控制的服务的配置属性。 | ||
更改由 inetd 控制的服务的启动选项。 | ||
转换 inetd.conf 项。 |
将 inetd 服务转换为可使用 SMF 来监视的传统运行服务。 | |
修复损坏的服务配置系统信息库。 |
将损坏的系统信息库替换为缺省版本。 | |
引导系统而不启动任何服务。 |
引导系统而不启动任何服务,以便可以修复那些阻止引导的配置问题。 |
下列任务显示如何监视 SMF 服务。
以下过程可用来显示哪些服务正在运行。
以下示例显示包括许多合同的服务的状态。
% 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 |
以下示例显示包括相关性的服务的状态。
% 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) |
以下命令列出系统上安装的所有服务以及每个服务的状态。该命令既显示已禁用的服务又显示已启用的服务。
% svcs -a |
以下命令列出由 inetd 控制的服务,其中包括每个服务的 FMRI、运行状态以及服务是处于启用还是禁用状态。
% inetadm |
以下过程显示如何确定依赖指定服务的服务实例。
以下示例显示如何确定依赖多用户里程碑的服务实例。
% svcs -D milestone/multi-user STATE STIME FMRI online Apr_08 svc:/milestone/multi-user-server:default |
以下过程显示如何确定指定的服务实例所依赖的服务。
以下示例显示多用户里程碑所依赖的服务实例。
% 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 |
任务 |
说明 |
参考 |
---|---|---|
禁用服务实例。 |
停止正在运行的服务并禁止重新启动该服务。 | |
启用服务实例。 |
启动服务。另外,在以后重新引导系统时,该服务将重新启动。 | |
重新启动服务。 |
使用一个命令停止和启动服务。 | |
恢复处于维护状态的服务。 |
说明如何清除和重新启动处于维护状态的服务。 | |
恢复到某个快照。 |
使用以前的快照更正服务问题。 | |
创建配置文件。 |
创建一个根据需要禁用或启用服务的配置文件。 | |
应用配置文件。 |
使用配置文件中的信息根据需要禁用或启用服务。 | |
使用 netservices 命令更改服务及其配置。 |
使用 generic_limited.xml 或 generic_open.xml 配置文件中的信息禁用或启用服务,同时还对这些服务的配置进行更改。 |
本节包括有关管理 SMF 服务的信息。
可以使用 RBAC 权限配置文件来允许用户管理某些 SMF 服务,而不必授予用户 root 访问权限。权限配置文件定义用户可以运行哪些命令。已经为 SMF 创建了下列配置文件:
Service Management:用户可以添加、删除或修改服务。
Service Operator: 用户可以请求对任何服务实例的状态进行更改(如重新启动和刷新)。
有关授权的具体信息,请参见 smf_security(5) 手册页。有关指定权限配置文件的说明,请参见《系统管理指南:安全性服务》中的“如何更改用户的 RBAC 属性”。
请使用以下过程禁用服务。服务状态更改记录在服务配置系统信息库中。服务一旦被禁用,其禁用状态将持续到重新引导之后。使服务重新运行的唯一方法就是启用服务。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
检查要禁用的服务的相关项。
如果此服务具有所需的相关项,则无法禁用此服务。
# svcs -D FMRI |
禁用此服务。
# svcadm disable FMRI |
第一个命令的输出表明 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 |
请使用以下过程启用服务。服务状态更改记录在服务配置系统信息库中。服务一旦被启用,则只要符合服务相关性,系统每次重新引导后仍将保持该启用状态。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
确定是否满足服务相关性。
如果服务处于启用状态,则说明满足了服务相关性。否则,请使用 svcadm enable -r FMRI 以递归方式启用所有的相关性。
# svcs -l FMRI|grep enabled |
启用服务。
# svcadm enable FMRI |
本示例中的第二个命令启用 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 |
以下命令启用 rpcbind。-t 选项在不更改服务系统信息库的临时模式下启动服务。在单用户模式下,系统信息库不可写。-r 选项以递归方式启动指定服务的所有相关性。
# svcadm enable -rt rpc/bind |
如果由于配置更改或其他原因而需要重新启动当前正在运行的服务,那么,可以重新启动该服务,而不必键入单独的命令来先停止后启动该服务。只有必须在禁用服务之后、启用服务之前更改配置时,才需要特意地先禁用服务,然后再启用。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
重新启动服务。
# svcadm restart FMRI |
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
确定依赖该服务的任何进程是否已停止。
通常,当某个服务实例处于维护状态时,与该实例相关的所有进程均已停止。但是,您应当在继续操作之前确保这一点。以下命令将列出与某个服务实例相关的所有进程以及这些进程的 PID(进程标识符)。
# svcs -p FMRI |
(可选的)中止剩余的所有进程。
对于由 svcs 命令显示的所有进程重复此步骤。
# pkill -9 PID |
如有必要,请修复服务配置。
有关错误的列表,请查看 /var/svc/log 中相应的服务日志文件。
恢复此服务。
# svcadm clear FMRI |
如果服务配置有误,则可以通过恢复到上次成功启动的快照来修复问题。在以下过程中,使用的是 console-login 服务以前的快照。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
运行 svccfg 命令。
# svccfg svc:> |
选择要修复的服务实例。
必须使用对该实例进行完全定义的 FMRI,而不允许使用快捷方式。
svc:> select system/console-login:default svc:/system/console-login:default> |
创建可用快照的列表。
svc:/system/console-login:default> listsnap initial running start svc:/system/console-login:default> |
选择或恢复到 start 快照。
start 快照是上次成功启动服务时的快照。
svc:/system/console-login:default> revert start svc:/system/console-login:default> |
退出 svccfg。
svc:/system/console-login:default> quit # |
更新服务配置系统信息库中的信息。
该步骤用 start 快照中的配置信息更新系统信息库。
# svcadm refresh system/console-login |
重新启动服务实例。
# svcadm restart system/console-login |
配置文件是一个 XML 文件,其中列出了各个 SMF 服务以及每个服务是应当处于启用状态还是禁用状态。使用配置文件,可以同时启用或禁用多个服务。并非所有的服务都需要列在配置文件中。每个配置文件只需包括那些为了使其有用而必须启用或禁用的服务。
创建配置文件。
在以下示例中,svccfg 命令用来创建一个配置文件,该配置文件反映当前系统上哪些服务处于启用状态,哪些服务处于禁用状态。您还可以创建现有配置文件的副本以对其进行编辑。
# svccfg extract> profile.xml |
如果您使用的是 Oracle Solaris JumpStart,如果您具有大量相同的系统,或者您希望对系统配置进行归档以供日后恢复,则可能需要使用此过程来创建唯一版本的 SMF 配置文件。
编辑 profile.xml 文件以进行任何所需的更改。
在 service_bundle 声明中更改配置文件的名称。
在以下示例中,要将配置文件的名称更改为 profile。
# cat profile.xml ... <service_bundle type=`profile` name=`profile` xmIns::xi='http://www.w3.org/2003/XInclude' ... |
删除所有不应当由该配置文件管理的服务。
对于每个服务,删除三个描述该服务的行。每个服务说明都以 <service 开头并以 </service 结尾。以下示例说明 LDAP 客户机服务的说明行。
# cat profile.xml ... <service name='network/ldap/client' version='1' type='service'> <instance name='default' enabled='true'/> </service> |
添加所有应当由该配置文件管理的服务。
每个服务必须使用上面所示的三行语法来进行定义。
如有必要,请更改选定服务的启用标志。
在以下示例中,sendmail 服务处于禁用状态。
# cat profile.xml ... <service name='network/smtp' version='1' type='service'> <instance name='sendmail' enabled='false'/> </service> ... |
如有必要,请应用新配置文件。
有关说明,请参见如何应用 SMF 配置文件。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见 《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
应用配置文件。
以下示例使用的是 profile.xml 配置文件。
# svccfg apply profile.xml |
有关在 generic_limited_net.xml 和 generic_open.xml 之间切换以及在进行此切换时需要应用的属性的具体说明,请参见使用 generic*.xml 更改向网络提供的服务。
netservices 命令可在最小网络风险和传统网络风险之间切换系统服务(如在以前的 Solaris 发行版中那样)。该切换是使用 generic_limited.xml 和 generic_open.xml 配置文件实现的。另外,该命令还可更改某些服务属性,以便根据需要将相应的服务限制在仅本地模式或传统模式。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
运行 netservices 命令。
在以下示例中,选择的是开放式网络风险(即传统网络风险)。
# /usr/sbin/netservices open |
以下命令更改一些服务属性以使相应的服务在本地模式下运行,并限制哪些服务可以通过 generic_limited_net 配置文件来启用。只有在应用了 generic_open.xml 配置文件时,才应当使用此命令。
# /usr/sbin/netservices limited |
以下过程显示如何更改不是由 inetd 服务管理的服务的配置。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
根据需要对配置文件进行更改。
许多服务都有一个或多个用来定义启动或其他配置信息的配置文件。这些文件可以在服务正在运行时进行更改。只有当服务已经启动后,才能检查这些文件的内容。
重新启动服务。
# svcadm restart FMRI |
要使用 NFS 服务共享文件系统,必须在 /etc/dfs/dfstab 文件中定义 NFS 文件系统,然后重新启动 NFS 服务。以下示例显示 dfstab 文件的外观以及如何重新启动服务。
# cat /etc/dfs/dfstab . . share -F nfs -o rw /export/home # svcadm restart svc:/network/nfs/server |
以下过程显示如何修改 cron 环境变量以帮助进行调试。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
检验该服务是否正在运行。
# svcs system/cron STATE STIME FMRI online Dec_04 svc:/system/cron:default |
设置环境变量。
在本示例中,设置的是 UMEM_DEBUG 和 LD_PRELOAD 环境变量。有关 setenv 子命令的信息,请参阅 svccfg(1M) 手册页。
# svccfg -s system/cron:default setenv UMEM_DEBUG default # svccfg -s system/cron:default setenv LD_PRELOAD libumem.so |
刷新和重新启动该服务。
# svcadm refresh system/cron # svcadm restart system/cron |
检验是否已进行更改。
# 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 # |
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
列出指定服务的属性。
以下命令显示由 FMRI 标识的服务的所有属性。
# inetadm -l FMRI |
更改该服务的属性。
由 inetd 控制的服务的每个属性都由属性名和指定的值来定义。提供属性名而不指定值会将属性重置为缺省值。有关服务属性的具体信息应包含在与该服务相关的手册页中。
# inetadm -m FMRI property-name=value |
检验属性是否已更改。
再次列出属性以确保已进行相应的更改。
# inetadm -l FMRI |
确认更改已生效。
确认属性更改达到了所需的效果。
以下示例显示如何将 telnet 的 tcp_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 |
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
列出特定服务的 exec 属性。
以下命令显示由 FMRI 标识的服务的所有属性。添加 grep 命令会将输出限制在该服务的 exec 属性。
# inetadm -l FMRI|grep exec |
更改该服务的 exec 属性。
具有 exec 属性的 command-syntax 集定义在启动服务时运行的命令字符串。
# inetadm -m FMRI exec="command-syntax " |
检验属性是否已更改。
再次列出属性以确保已进行相应的更改。
# inetadm -l FMRI |
在以下示例中,当 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 |
以下过程将 inetd.conf 项转换为 SMF 服务清单。无论何时向系统添加依赖 inetd 的第三方应用程序,都需要运行此过程。如果您需要更改 /etc/inetd.conf 中项的配置,也需要运行此过程。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
转换 inetd.conf 项。
inetconv 命令将选定文件中的每个项都转换为服务清单。
# inetconv -i filename |
# inetconv -i /etc/inet/inetd.conf |
任务 |
说明 |
参考 |
---|---|---|
停止或启动服务。 |
使用运行控制脚本停止或启动服务。 | |
添加运行控制脚本。 |
创建运行控制脚本并将其添加到 /etc/init.d 目录中。 | |
禁用运行控制脚本。 |
通过重命名运行控制脚本文件来禁用该脚本。 |
每个运行级别都有单独脚本的一个优点是,可以在 /etc/init.d 目录中单独运行脚本来停止系统服务,而不必更改系统的运行级别。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
停止系统服务。
# /etc/init.d/filename stop |
重新启动系统服务。
# /etc/init.d/filename start |
# pgrep -f service |
例如,可以通过键入以下命令来停止 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 |
如果要添加用来启动和停止服务的运行控制脚本,请将该脚本复制到 /etc/init.d 目录中。然后,在要从其中启动和停止服务的 rcn .d 目录中创建链接。
有关命名运行控制脚本的更多信息,请参见每个 /etc/rc n.d 目录中的 README 文件。以下过程介绍如何添加运行控制脚本。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
# cp filename/etc/init.d # chmod 0744 /etc/init.d/filename # chown root:sys /etc/init.d/filename |
创建指向相应 rc n.d 目录的链接。
# 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 |
以下示例显示如何为 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 |
通过在文件名开头加一个下划线 (_) 来重命名运行控制脚本可以禁用该运行控制脚本。系统不执行以下划线或点开头的文件。如果通过为文件添加后缀的方法来复制该文件,那么,带后缀和不带后缀的文件都将运行。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
通过在新文件的开头添加下划线 (_) 来重命名脚本。
# cd /etc/rcn.d # mv filename_filename |
# ls _* _filename |
以下示例显示如何重命名 S99datainit 脚本。
# cd /etc/rc2.d # mv S99datainit _S99datainit # ls _* _S99datainit |
在该过程中,打印服务处于禁用状态。
成为超级用户或同等角色。
角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见《系统管理指南:安全性服务》中的“配置 RBAC(任务列表)”。
请求有关挂起服务的信息。
# 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 选项提供有关受到影响的服务实例的其他信息。
启用服务。
# svcadm enable application/print/server |
以下过程显示如何将已损坏的系统信息库替换为缺省的系统信息库副本。系统信息库守护进程 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,以便您进行维护。
在 sulogin 提示符下输入 root 口令。借助 sulogin,root 用户可以进入系统维护模式从而修复系统。
运行以下命令:
# /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 格式提供。
输入相应的响应。
通常会选择最新的备份选项。
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]?
键入 yes 修复故障。
在 restore_repository 命令执行了列出的所有操作之后,系统将重新引导。
如果在启动服务时出现问题,有时系统会在引导过程中挂起。以下过程显示如何解决此问题。
在不启动任何服务的情况下引导。
此命令指示 svc.startd 守护进程临时禁用所有的服务并在控制台上启动 sulogin。
ok boot -m milestone=none |
以 root 身份登录系统。
启用所有的服务。
# svcadm milestone all |
确定引导过程挂起的位置。
在引导过程挂起时,通过运行 svcs -a 来确定哪些服务未在运行。在位于 /var/svc/log 中的日志文件中查找错误消息。
在问题得以修复之后,检验所有的服务是否已启动。
继续执行正常的引导过程。
引导 Solaris OS 时不需要的本地文件系统由 svc:/system/filesystem/local:default 服务挂载。当其中的任何文件系统无法挂载时,该服务将进入维护状态。系统将继续启动,并将启动不依赖 filesystem/local 的任何服务,而要求 filesystem/local 联机才能通过相关性启动的服务将不会启动。
要更改系统的配置,以在该服务失败后立即出现 sulogin 提示符(而不是允许系统继续启动),请按照下面的过程操作。
修改 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 |
刷新该服务。
# svcadm refresh console-login |
将下面的命令保存到一个脚本中并将该脚本另存为 /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。