第11章: 系统的关闭和启动
系统的启动是指从开始引导操作系统直到系统正常工作的过程。在启动时,操作系统被装入内存并且开始执行。在这个执行过程中将进行许多的初始化操作以提供某种服务,如打印服务,网络服务等等。
用户特别是系统管理员必须详细了解系统启动全过程的各个具体细节。系统的启动时整个系统运行期间最为脆弱、最容易出现问题的时候。稍有不慎,整个系统将无法正常启动,或启动启动了,却无法正常工作
虽然
UNIX系统被设计成一种可以可以永不关机的系统,但实际中却由于各种各样的原因,我们不得不在一定的时候将机器关闭,如电源问题,系统出现严重故障等。UNIX系统的复杂性不允许我们想关机时就切断电源。这样做会对整个系统造成极大的破坏。例如用户数据丢失。文件系统结构的不一致等。所以关机过程必须遵守一定的规范才行。
在这一章中我们主要介绍如下几个问题:
※系统启动过程? 介绍UNIX系统从加电导系统准备好全过程中的各个执行细节。
※系统关闭??? 介绍关闭系统的方法及关闭系统时应该注意的一些问题。
系统的启动过程
大多数的UNIX系统的启动都有两种方式:
※自动启动??在这种方式下,系统可以不经任何人工的干预而自动完成启动的全过程。
※手工启动??在系统启动过程到达某一点时,系统管理员可以进行一些人工的干预,如对文件系统进行检查,设置系统的日期,等等。完成之后系统将继续进行引导。
通常这两种方式的最终效果是一样的。正常情况下,加电后系统均能自动启动至准备好状态。在系统遭到一些人为破坏,如突然断电,系统发生崩溃或者系统管理员做了某种修改时,经常需要手工引导。
我们可以把整个UNIX系统的启动过程大致划分为如下几个阶段:
※操作系统装入程序的加载
※UNIX系统核心程序的装入
※UNIX系统内核的初始化
※硬件的检测和配置
※系统进程的生成
※管理人员的干预(自动启动时无此阶段)
※系统初始化shell命令文本的执行
※各终端进程的生成
操作系统装入程序的加载
大多数计算机系统的操作系统都是驻留在系统的硬盘中的。一般我们可以把硬盘的存储空间分成几个不同的相互连接的片段,每个片称为一个硬盘分区。绝大多数硬盘一般都可划分为四个分区。在各个分区上可以装载不同的操作系统。(对于许多专用的工作站或者主机系统,一般它们只装载一个UNIX系统)
在硬盘的多个分区中,有一个分区被称为是系统的活动分区。活动分区中的操作系统在系统加电的时候被引导。
大多数机器在加电时均会转移到一特定的地址去执行存储在ROM中的程序。对于从软盘上引导的情形,这个程序将读取软盘上引导扇区(0头、0道、1扇区)中操作系统核心代码,再将控制交给核心程序,由此开始核心的装入和运行。但对于从硬盘上引导系统的情形,ROM装入程序装入的不是操作系统而是另外一段代码。这段代码在被装入到内存中后将获得控制权而得以执行。它在执行时才会去装入UNIX系统。
一般而言,这段代码将位于硬盘0头、0道、1扇区。该扇区主要包括两个部分:主引导程序和分区信息表。其内容有硬盘分区程序在对硬盘分区时建立。
在主引导程序被装入之后,它获得控制而得以执行。执行时它对分区信息表进行扫描,看那个分区为活动分区,并试图装入该分区第一扇区的操作系统引导程序,由此开始操作系统核心的引导.
UNIX系统核心程序的装入
在操作系统获得控制权之后,我们可以说此时UNIX系统已经开始运行了。这个装入程序在执行时,将从硬盘活动分区中特定的地方(该分区的第一个扇区)装入操作系统的地代码:UNIX系统内核。UNIX系统内核实际上是一个程序。其名称一般是/unix或者/vmunix,这个随厂家的不同而可能会有些差异。
在内核被装入的时候,屏幕上会显示:
Booting the UNIX system......
若此时按下任意键,系统核心装入程序将允许用户输入欲装入的其它核心程序的文件名。此时装入程序会显示: boot:
用户可以在冒号后输入其它的某个核心程序的名称。
为什么要提供这种功能呢?因为在许多情况下我们需要对系统内核进行重新配置,以生成新的核心程序,而老的核心程序可以保留到另外一个文件中。用此新的核心程序可能并不能成功地启动系统。这种情况下我们就可用这种方法装入原来的核心程序引导系统。
如果并不想真的装入其它内核,可以不作任何操作或者仅仅按一下回车。稍后,装入程序会装入缺省的内核。
系统内核试UNIX系统常驻内存的部分。内核装入程序从磁盘上装入核心程序之后,将把控制权交给新装入的内核,从而使之得以运行。
系统内核的初始化
核心程序开始执行时,UNIX系统核心的初始化工作就开始了。此时,内核会检查内存。以前我们知道,系统内核会占据物理内存的低端并固定在此空间中运行。内核将能知道系统中内存的总数,内核自己占用多少,剩下多少可以供普通进程使用,这就是启动信息中关于内存的部分。
在内存中还有文件系统高速缓冲。内核的各种内部数据结构,如页表,进程结构表(proc结构),所以系统内存并不是仅仅等于内核的大小加上可用的内存的大小。
硬件的检测和配置
在内核自身的初始化完成之后,它将对系统中所安装的各种硬件进行检测。由于每种系统的硬件千差万别,将很难对它给出一个一般性的说明。
系统管理员在配置内核时,将告诉系统要处理那些设备。当内核初始化完成之后,它将开始寻找这些设备,并且按照系统管理员的设置对这些设备进行初始化配置。大多数情况下,内核将报告它应该找到但是由于种种原因没有找到的地设备。
在配置内核时候,系统管理员说明的设备信息往往是不充分的。在这种情况下,核心将通过检查与设备连接的总线及相应的地设备驱动程序来获得关于设备的其它信息。如果某设备未被找到或者用于某种原因未能对内核检测作出响应,内核将标记该设备为不存在,同时时相应的设备驱动程序不再起作用。此时即使设备和系统又连接上,该系统也不能使用。要想再使用这个设备,只有重新启动系统。
系统进程的生成
在硬件检测,配置完成之后,核心将生成一些系统进程,这些进程并不是系统核心的一部分,它们将作为一个普通的进程在用户进程空间运行,提供各种系统服务。这些进程的数量和性质随系统的不同而不同。
在AT&T systerm V中,有
※调度进程 sched(0号进程)
※初始化进程init(1号进程)
※虚存管理进程pageout(2号进程)
※缓冲区至磁盘写进程fsflush(3号进程)
※缓冲区映射进程Rmdaemon(4号进程)
在BSD系统中,相应的进程分别是:
※换入换出进程swapper(0号进程)
※初始化进程init(1号进程)
※页面守护进程pagedaemon(2号进程)
这三个进程与上面的0、1、2号进程对应。
在所有的这些进程中,只有1号进程init才算是真正意义上的进程,而其它的“进程”并不是真正意义上的进程。它们是系统核心的一部分,其作用类似于一个函数调用,只是由于进程调度的原因才将其作得同进程类似。
在生成这些系统进程之后,内核在启动中的任务就完成了。下面的工作将由init进程来承担。这些工作包括:启动各种服务,生成接受终端注册的getty进程等等。
系统初始化shell命令脚本的执行
操作系统为了给用户提供各种服务,通常要生成一些提供这些服务的进程。这种服务进程一般被称为守护(daemon)进程。它们不知疲倦地为系统中的用户提供某种特定的服务。
通常这些进程是在核心生成各系统进程之后,由init进程执行一系列特定的shell命令而生成的。
init通过/etc/inittab文件对各种守护进程进行管理。init将顺序地读取inittab中的各行并逐个进行处理
各终端进程的生成
随着整个系统初始化的完成,整个系统就已经能够正常工作了,但是此时用户还不能使用计算机,因为我们暂时还没有办法注册到系统中。
为了使用户能够注册到系统中,必须生成getty进程。各getty进程将分别监视某一个通讯端口,以检测来自相应终端或者调制解调器的连接信号。然后getty将首先打印注册提示,等待用户输入注册名,然后调用login命令进行注册。注册成功后,系统会生成一个shell进程,同时相应的getty进程会消亡。
当用户从系统中注销时,init进程将根据/etc/inittab文件中的相应的数据行重新生成相应的终端上的getty进程。
启动过程中的人工干预
在内核初始化完成之后、系统初始化开始之前,如果系统进入单用户状态(手工启动方式下),那么内核在启动init进程时就将通知这一点。这种情况下,init将首先在控制台上生成一个shell进程,并等待该shell进程中止,再进行系统的初始化操作。
在此shell进程中,用户可以以超级用户的身份执行所有的可以执行的命令。但由于此时系统只安装了根文件系统,这将使得管理员只能执行/bin或/etc目录下的文件。如想执行其它文件系统上的命令,需管理员自己先安装相应的文件系统。
但一般系统管理员在此阶段所作的工作是对文件系统进行检查(fsck)。但是在出现某些系统故障的情况下才需要管理人员干预对文件系统的维护。关于文件系统的检查我们将在第10章进行详细介绍。
在了解UNIX系统启动的全过程之后,我们将有可能对系统启动过程中出现的种种问题进行分析,找出故障发生的原因,进而想办法排除。一般而言,无法正常启动的原因有:
※硬件故障
※启动盘被破坏
※文件系统被破坏
※内核配置有问题
※系统初始化shell脚本出现问题
在系统无法正常启动时,借助启动过程中控制台上显示的信息,我们可以大致判断到底是哪个阶段出现了问题,这样才能对症下药排除故障。
系统的关闭
在了解系统的引导过程后,我们就会知道:系统处于正常工作状态时,系统中会有许多各式各样的进程在运行着,如init进程、各种守护进程。当有用户登录到系统中时,还有许多用户进程。另外我们还知道UNIX系统为提高机器的响应速度引入了缓冲机制。所有的这些都将使得在关闭系统时不能一断电源就了事。事实上,系统的关闭和启动过程一样,也是一个极为复杂的过程。当然这种复杂指的是系统内部操作上的复杂,而不是用户操作上的复杂。用户只需要按照一定的要求输入几个命令就能将系统正常地关闭下来。
在各种UNIX系统中,都提供有多种正常或者不正常的关机方式。例如,鉴于init进程(1号进程)在系统中的特殊地位,我们可以通过终止这个进程来使系统关闭下来:
# kill -9 1
但是这种方法是不安全的,其造成的后果可能并不亚于直接关闭电源。为了能够使整个系统正常地停下来,许多系统都提供了专用的命令。下面我们以AT&T
UNIX System 为例来说明这个过程。
System
V提供了一个/etc/shutdown的shell命令。借助这个命令,我们可以安全地把系统停下来。在运行此命令之前,仍应对系统的运行情况进行检查,你可以使用ps
和who命令来进行这种检查。
然后,在超级用户提示符下输入:
# shutdown -y
将使系统开始关闭过程。此时,在每一个用户的终端屏幕上将出现关于系统即将被关闭的警告信息。用户在看到这一信息后应立即中止自己的工作,并且从系统中注销退出。shutdown命令并不会立即关闭系统。在开始实际关闭之前先暂停60秒(缺省的时间间隔),给用户一个回旋地余地。
暂停时间一过,关闭过程就开始。此时shutdown给仍在系统中的用户发送第二条信息。如用户仍旧不退出,他们的文件可能会被损坏。
第二条信息发出之后,系统中所有的活动进程均被终止,同时系统将用内存缓冲区中的内容对磁盘上的有关内容进行更新,以保持磁盘上内容的一致性(因为有些操作的结构可能只是记录在缓冲区中而没有被写到磁盘上)这个操作称为同步。
同步完成后,系统将停止运行而处于可断电状态或可重启动状态。这时你就可以切断电源或者重新启动。
各种不同的系统提供有关关闭系统的独特方法,如有些系统中设置有一个专门用于关闭系统的帐号。当管理人员以这个帐号登录到系统中时,系统将执行关闭命令,这些方法本身是简单的,重要的是我们要认识关闭过程的重要性,必要性,以及关闭系统时系统进行了一些什么操作。
阅读(956) | 评论(0) | 转发(0) |