电脑技术学习

Solaris系统的启动和关机

dn001

Solaris 2.x 采用了基于 Unix 系统 System V Release 4.0 标准的灵活的启动过程 , 使得很容易产生和定制在各个主机和系统上都通用的启动和关机过程,这与 Solaris 1.x 所用的简单的 BSD 风络的启动过程形成了对比,后者缺少针对不同的系统状态的启动脚本的不同组织形式。本章的目的是向读者介绍一些基本术语和初始化参数,它们在将 Solaris 系统引入到单用户和多用户运行等级或者 init 状态的过程中扮演了重要角色,其中 init 状态是非常独特的操作状态, init 状态间的切换由 init 进程管理。阅读本章后, Solaris 2.x 的管理员们在诊断他们自已系统的启动和关机过程时就会觉得有些自信了,并且在升级 Solaris 1.x 系统时,会对启动时各过程的顺序和之间的依赖关系有清楚的理解。

在许多方面, Solaris 的启动和关机于许多其它系统有相似性,然而,认识和理解 Solaris 操作系统于其它服务器不同的特性也是非常重要的。 SPARC 硬件的一个重要的功能是称为 OpenBoot 的固件监视系统,它负责启动前的一些重要任务:

· 通过键入下面的字符启动 Solaris 操作系统 :

ok boot

在 OpenBoot 提示符下 , 它将启动 Solaris 内核 ( 在 Solaris x86 上, boot 命令必须通过 Primary Boot Subsystem 菜单执行 )

· 设置系统配置参数,如启动设备,它可以是几个硬盘之一(由设备的全路径名确定),或者是网络上的一台其它主机,也可以是一个 CD-ROM 驱动器。

· 通过执行下面这条命令监测网络流量 :

ok watch-net

在 OpenBoot 提示符下运行

· 对系统设备执行简单的诊断和测试 ( 例如,检测 SCSI 总线的终结状态,或者执行称为上电自检的 POST ( Power-On Self Test POST )检测 )

和许多 Linux 版本带的 LILO Linux 加载器不一样, OpenBoot 不只是一个简单的操作系统加载器,它还允许地启动进程开始前写入、加载和运行用基于堆栈的 Forth 编程语言写的程序,当为一个大企业定制服务器时,常要求在启动时显示公司的标志而不是缺省的 Sun 标志,这时, OpenBoot 的这一特性就非常有用了,可以生成一个用合适的象素构成的 Forth 数组,然后运行 oem-logo 命令。另外,在单用户和多用户 init 状态中,也可以在启动后对变量的值进行设定,这可以通过以超级用户的身份运行 eeprom 命令实现。

例如, eeprom 可以用来将启动时自检的 RAM 改成 64M :

L 4-3

server# eeprom selftest-#megs=64

在 Solaris x86 系统中,固件不直接支持 eeprom 这样的功能 : 每个 PC 厂商有不同的 BIOS 系统,使得很难做到这一点, 做用替代,用 bootenv.rc 文件中的变量集仿真内存。

要想看 OpenBoot 为你的系统中的固件发布的信息,可以下面这一命令: :

L 4-4

ok banner
SPARCstation 10, Type 5 Keyboard
ROM Rev. 2.4, 64 MB memory installed, Serial #6745644
Ethernet address 6:3:10:a:cc:4a HostID 5767686

如果 OpenBoot 的提示符不是 ok ( 如,它显业为 >> ) ,那么只需简单地键入 n 回到 ok 提示符:

L 4-5

>>
n
ok

Solaris 操作系统的第二个重要特性是通过高效的内核和用户程序模式设计,达到 up-time 最大化的目的。在一些非 Solaris 服务器的环境中,每次安装一个新应用时必须重起系统,或者需要重新配置内核。对 Solaris 系统来说,只在极少的情况下才需重起系统,因为应用程序从逻辑上与系统配置选项是分开的,许多系统级的配置选项可以在超级用户的 shell 中设置,例如,许多 TCP/IP 选项可以用下面的命令动动修改:

L 4-6

server# ndd /dev/tcp

在一些比较新的硬件配置中,甚至不需要重起就可以安装新的硬件,这些优点可以减轻系统管员的工作,因此受到新的 Solaris 管理员的欢迎。

(1) 系统 V 启动过程

从 OpenBoot 启动后, Solaris 有几个不同的操作模式,称为“运行等级”或“ init 状态”,之所以这么叫是因为常用 init 命令来改变运行等级,当然也可以用 init-wrapper 脚本(如关机)。这些 init 状态可以是单用户的也可以是多用户的,常常每一个状态都代表不同的管理目的,而且是完全不相关的(也就是说,一个系统任何时候只能在一个 init 状态上)。通常,一个设计成需不定期开机的 Solaris 系统将完成一系列预先定义好的步骤,以便启动为提供基本系统服务、主要的用户服务和可选应用服务所需的所有软件程序。这些服务一般只在 Solaris 系统运行在多用户状态时才提供,它们都通过运行控制 ( rc ) shell 脚本初始化。通常,在 Solaris 安装过程中会为管理员自动生成一个运行控制脚本,然而,如果你想安装第三方软件(比如数据库服务器),就需要在 /etc/init.d 目录下生成你自已的运行控制脚本,以便在系统启动时能自动加载这些服务。本章后面将全面介绍这个过程。

如果因为某些原因(例如,定期的电源损耗)系统需要断电或切换到一个特殊的管理模式来执行诊断测试,也可依据一系列预先定义好的控制脚本来杀死各个服务并保存用户数据。保证这些事件的执行顺序非常重要,因为这样才能保证用户数据的完整性。例如,对数据库服务器的操作通常关系到服务器端的写数据进程和后台的监听进程之间的通信,监听进程负责接受新的信息存储请求。如果这个后台进程没有在写数据进程之前关闭,它可能从网络客户端继续接受数据并将它存在一个已经被数据库关闭的缓存里,这将导致数据库以一种不协调的状态关闭,很可能会引起数据损坏或者记录丢失。图 4 - 1 说明了这个过程。 Solaris 管理员应利用他们的 shell 脚本知识严格管理系统的关机过程,就象利用运行控制脚本管理系统启动过程那样,这一点非常重要。

管理员应注意三种类型的启动方式。除了在超级用户 shell 下用下面命令发起的正常重起过程

L 4-7

server# shutdown

重配置启动关系到在 /dev 和 /devices 目录下重新组织设备信息,恢复启动关系到在系统对控制台输入的命令不做响应时对毁坏的文件进行保存和分析。在早年的 SPARC 系统中,当有新的硬盘加入系统时,常需要重新配置启动,在新一些的系统中就可能不需要这么做了,比如 E450 就有 hot-swapping 功能。在超级用户 shell 下,在发出 shuddown 命令前输入同的命令就可以执行重配置启动:

L 4-8

server# boot -r
at the OpenBoot monitor prompt, or by issuing the command:
server# touch /reconfigure

虽然在一个巨型系统中,硬件故障、内核模块冲突和不正确的内核参数时有发生,但恢复启动在 Solaris 系统中极少用到。如果在系统中发生了冲突经常会用堆栈跟踪,它利用内核的诊断器( kadb )可以提供跟踪系统错误原因的重要线索。

运行等级

虽然 Solaris 有八个 init 状态,但在正常操作中管理员只用得到其中的五个,它们是:

· 运行等级 S 这是一个用于系统管理任务和修复被损坏的文件系统的单用户 init 状态,可用这个命令 :

server# /usr/sbin/fsck

· 运行等级 2 除了 NFS exported network resources ,这个运行等级第一次转入多用户状态。

· 运行等级 3 在这个运行等级下,所有的用户都可以登录,并可利用所有系统和 NFS 网络资源。

· 运行等级 6 这个运行等级将停止操作系统运行并开始重起系统。

· 运行等级 0 在这个运行等级下操作系统将关机并确保可安全地关电。

在早一些的 SPARC 系弘中,要想安装新的硬件,比如磁盘驱动器、外设或内存模块,必须先让系统进入运行等级 0 ,但象 E450 这样新一些的系统,当新硬盘“热交换”到特定的驱动上去时可以继续在多用户 init 状态下运行。这也就是说,这些机器可能根本用不着进行运行等级 6 ,而且,连续开机几个月的状况也并不少见。

用户可以很容易地发现系统是在单用户运行等级 0 、 S 和多用户运行等级 3 ,运行等级 S 下将显示 Bourne shell 的缺省提示符 :

L 4-10

#

运行等级 0 将显示 OpenBoot 的提示符 :

L 4-11

ok

运行等级 3 显示如下提示:

L 4-12

server console login:

要想确定系统当前的运行等级,也可用下面的命令:

L 4-13

server# who -r

who 命令的输出也可以通过管道过滤去执行其它命令,具体命令决定与当前的运行等级,例如,如果一个数据库应用要求在本地服务器上有 NFS 空间,如果当前的运行等级不是 3 ,可以在数据库的初始化脚本中快速地查一下当前的运行等级:

L 4-14

#!/bin/sh
# Determine run-level
set ‘/usr/bin/who -r'
# Check third argument for current run-level
if [ $3 != "3" ]
then
echo 'Error: NFS services are not available under run level 3.'
echo 'NFS Volumes must be available to run this application.'
exit
fi
# else execute database initialization here

在表 4 - 1 中列出了所有运行等级,以及它们各自的运行控制脚本目录。

运行等级

描述

用户状态

运行控制脚本目录

0

硬件管理模式

通过控制台访问

/etc/rc0.d

1

系统管理状态,只可访问有根文件系统

单用户

/etc/rc1.d

2

第一个多用户状态,可访问 NFS 资源

多用户

/etc/rc2.d

3

可访问 NFS 资源

多用户

/etc/rc3.d

4

用户定义的状态

没有特别规定

N/A

5

关机时的固件状态

通过控制台访问

/etc/rc5.d

6

操作系统停止运行

单用户

/etc/rc6.d

S

执行管理任务和修复被破坏的系统文件

通过控制台访问

/etc/rcS.d

各个启动阶段

对于大多数系统来说,缺省的运行等级是 init 3 ,它允许多个用户登录,并可运行各种程序,包括 NFS ( network research services ),然而,要从 OpenBoot 转入这个状态需要经过一系列预先规定的 init 状态转移,从单用户( 1,S )到多用户 (2 , 3) 运行状态,图 4 - 2 给出了这个转移过程。在这一节中,我们将研究在这些运行等级中系统的相关工作。

Solaris 软件环境提供了一系列详细的运行控制脚本来控制运行等级的转换,我们将逐个地研究这些控制脚本,并将那些对以前的 BSD 风格的 Solaris 1.x 控制脚本所做的改进和创新部分用加亮方式标出。每一个运行等级都在 /sbin 目录下有一个相关的 rc 脚本,它们也分别符号链接到 /etc 目录 : rc0 , rc1 , rc2 , rc3 , rc5 , rc6 , rcS . /sbin/rc0 的作用有:

· 如果 /etc/rc0.d, 这个目录存在的话,执行这个目录下的所有脚本。

· 停止所有系统服务和活着的进程,用 /usr/sbin/killall 和 /usr/sbin/killall 9 对付那些难处理的进程

· 用 /sbin/sync 同步所有 mount 的文件系统

· 用 /sbin/umountall 卸载所有 mount 的文件系统

/sbin/rc5 和 /sbin/rc6 都符号链接到 /sbin/rc0 ,因此不需要分别对待,

/sbin/rc1 负责执行 /etc/rc1.d 目录下存在的所有脚本。这将终止所有系统服务和活着的进程,用 /usr/sbin/killall 和 /usr/sbin/killall 9 对付那些难以处理的进程。 /etc/rc0 和 /etc/rc1 之间的不同在于后者在关闭所有多用户状态下的进程后将系统引入单用户状态,但并不卸载所有文件系统。

在运行等级 2 中, /sbin/rc2 执行 /etc/rc2.d 目录下的所有脚本,将系统引入第一个多用户状态,因此,所有在 /etc/vfstab 下列出的文件系统都被 mount ,磁盘引用和文件系统目志被打开(如果已经配置好的话),编辑了一半的文件将被保存, /tmp 目录将被清空并允许系统计帐和初始化许多网络服务,表 4 - 2 详细列出了这些服务。

在运行等级 3 中, /sbin/rc3 将执行 /etc/rc3.d 目录下所有脚本文件,并将系统引入最终的多用户状态。这里的服务主要于网络资源的共享有关,如 NFS ,但 Solstice Enterprise Agents 和其它基于 SNMP 的系统可能不从这里加载。 /sbin/rcS 执行所有在 /sbin/rcS.d 目录下的脚本,并将系统引入单用户运行等级。如果系统发现了一个网络,还将建立最小网络配置,否则将报告接口错误。如果那些主要的系统文件系统可用的话,还将 mount 这些文件系统,并设置系统的名字。

在 Solaris 1.x 下有两个主要的 BSD 风格的脚本 : /etc/rc 和 /etc/rc.local 。通常,由经销商提供的程序将从 /etc/rc 初始化,用户定义的和本地安装的程序则从 /etc/rc.local 执行。例如, /etc/rc 负责 mount 文件系统、允许引用和加入交换空间、开始 Internet superdaemon ( inetd ) ,而 /etc/rc.local 则负责以后安装的一些服务,如 web 服务器和认证服务以及打印服务。

标签: