UNIX系统管理-第十二章:系统的关闭和启动
系统的启动是指从开始引导操作系统直到系统正常工作的过程。在启动之初,操作系统被装入内存并且开始执行,这个执行过程中将进行大量初始化操作以提供某些服务如打印服务,网络服务等。
用户,特别是系统管理员必须详细了解系统启动全过程的各个具体细节。启动是整个系统运行期间最脆弱、最容易出现问题的时候。稍有不慎,整个系统将无法正常启动,或正常启动了,却无法正常工作。
虽然UNIX系统被设计成一种可以可以永不关机的系统,但实际操作中却由于各种各样的原因,不得不在一定的时候将机器关闭,如电源出现问题,系统出现严重故障等。UNIX系统的复杂性不允许我们想关机时就直接切断电源,这样做会对整个系统造成极大的破坏,如用户数据丢失,文件系统结构的不一致等。所以关机过程必须遵守一定的规范才行。
在这一章中我们主要介绍如下几个问题:
系统的启动过程 介绍UNIX系统从加电到系统完全可用的全过程中的各个执行细节。
系统的关闭 介绍关闭系统的方法及关闭系统时应该注意的一些问题。
系统的启动过程
大多数的UNIX系统的启动都有两种方式:
自动启动在这种方式下,系统可以不经任何人工的干预而自动完成启动的全过程。
手工启动在系统启动过程到达某一点时,系统管理员可以进行一些人工的干预,如对文件系统进行检查,设置系统的日期等等。然后系统将继续进行引导。
通常这两种方式的最终效果是一样的。正常情况下,加电后系统均能自动启动至准备好状态。但在系统遇到一些人为破坏,如突然断电,系统发生崩溃或者系统管理员做了某种修改时,经常会需要手工引导。
我们可以把整个UNIX系统的启动过程大致划分为如下几个阶段:
操作系统装入程序(PDL)的加载
UNIX系统核心程序的装入
UNIX系统内核的初始化
硬件的检测和配置
系统进程的生成
管理人员的干预(自动启动时无此阶段)
系统初始化shell脚本的执行
各终端进程的生成
操作系统装入程序的加载
大多数计算机系统的操作系统都是驻留在系统的硬盘中的。一般可以把硬盘的存储空间分成几个不同的相互连接的片段,每个片称为一个硬盘分区。绝大多数硬盘都可被划分为四个分区。在各个分区中可以装载不同的操作系统。(对于专用的工作站或者主机系统,一般只装载一个UNIX系统)
在硬盘的多个分区中,有一个分区被称为是系统的活动分区。活动分区中的操作系统会在系统加电的时候被引导。
大多数机器在加电时均会转移到一特定的地址去执行存储在ROM中的程序。如果是从软盘上引导,这个程序将读取软盘上引导扇区(0头、0道、1扇区)中操作系统核心代码,再将控制交给核心程序,由此开始核心程序的装入和运行。但对于从硬盘上引导系统的情形,ROM载入程序装入的不是操作系统而是另外一段代码,这段代码在被装入到内存中后将获得控制权而得以执行,然后由它去装入UNIX系统。
一般而言,这段代码将位于硬盘0头、0道、1扇区。该扇区主要包括两部分的信息:主引导程序和分区信息表。其内容是由硬盘分区程序对硬盘进行分区时建立的。
在主引导程序被装入之后将获得CPU控制权而得以执行。执行时它会对分区信息表进行扫描,看哪个分区为活动分区,并试图装入该分区第一扇区的操作系统引导程序,由此开始操作系统核心的引导.
UNIX系统核心程序的装入
在操作系统获得系统控制权之后,我们可以说此时UNIX系统已经开始运行了,载入程序在执行时,将从硬盘活动分区中一个特定的地方(该分区的第一个扇区)装入操作系统的源代码:UNIX系统内核。UNIX系统内核实际上是一个程序,其名称一般是/unix或者/vmunix,名称随生产厂家的不同可能会有些差异。
在内核被装入的时候,屏幕上会显示:
Booting the
若此时按下任意键,系统核心装入程序将允许用户输入欲装入的其它核心程序的文件名。此时装入程序会显示:
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系统为提高机器的响应速度引入了缓冲机制。所有的这些都将使得在关闭系统时不能切断电源了事。事实上,系统的关闭和启动过程一样也是一个极为复杂的过程。当然这种复杂指的是系统内部操作上的复杂,而不是用户操作上的复杂。用户只需要按照一定的要求输入几个命令就能将系统正常地关闭下来。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论