第六章 启动与关闭

 

让我行动起来

你必须如此你必须如此

永远、永远永远不要停止

让它动起来

让它动起来,永远、永远永远不要停止

你使一个成年人哭泣,

你使一个成年人哭泣

(滚石乐队)

 

本节解释了当Linux系统启动以及关闭时,做了些什么,以及为什么要适当地操作。如果不按照适当的步骤来做,文件有可能毁坏或丢失。

 

启动与关闭概述

打开一个计算机系统并把它的操作系统装入[1]内存中的过程称为引导(booting)。这个名字来自于计算机用引导程序将自己启动起来,但是这个过程本身实际上是比较复杂的。

在引导过程其间,计算机首先装入一段称为引导装入程序(bootstrap loader)的很短的一块代码,接下来,这块代码装入操作系统代码并运行之。引导装入程序通常存储于硬盘或软盘上的固定位置处。分成这两个过程的原因是,操作系统是一个大又复杂的程序,但是计算机装入的第一段程序必须很短小(几百个字节吧),以避免使得固件毫无必要地过分复杂。

不同类型的计算机的引导过程是不同的。对于PC来说,计算机(它的BIOS)读入软盘或硬盘的第一个扇区(称为引导扇区boot sector)。引导装入程序就包含在这个扇区中。它再将操作系统从磁盘(或其它的地方)的某处装入到内存中去。

Linux被装入内存后,它就初始化各种硬件以及设备驱动程序,然后运行initinit程序再启动其它进程,以允许用户登录和做工作。这部分的细节将在下面加以讨论。

为了关闭一个Linux系统,首先所有的进程都被告知进行结束操作(这使得它们能够关闭任何文件以及做其它必要的操作,以使得各件事情有条有理),然后文件系统和交换区被卸载下来,最后一条说明可以关闭电源的消息显示在控制台屏幕上。如果没有按照正确的步骤来做,很有可能发生可怕的事情;最重要的是,文件系统高速缓冲可能没被刷新,这意味着高速缓冲中的数据被丢失并且磁盘上的文件系统变得不完整了,因此文件系统很有可能变得不可用了。

 

引导过程详述

你可以从软盘或硬盘上来引导Linux系统。安装与使用手册中的安装部分(XXX引用)告诉你如何安装Linux系统,所以你可以用想用的方式来引导系统。

当引导一个PC系统时,BIOS会做各种测试操作以检查一切是否正常,[1] 然后将开始正真的引导过程。它将选择一个磁盘驱动器(典型地,如果有软盘插入在驱动器中,就首先选择软盘驱动器,否则就选择计算机中安装着的第一个硬盘;然而,选择的顺序通常是可以配置的)并且将读入它的第一个扇区。这个扇区称为引导扇区(boot sector);对于硬盘来说,它也被称为主引导记录(master boot record),因为一个硬盘可以包含有几个分区,每个分区都有它自己的引导扇区。

引导扇区中含有一个短小的程序(小得可以纳入一个扇区中)它的任务是将实际的操作系统从硬盘上读入内存并启动操作系统。当从软盘上引导一个Linux系统时,引导扇区中含有一些代码,这些代码将开始的几百个数据块(当然依赖于实际的内核的大小)读入到内存预定的地方。在Linux引导软盘上,不含有文件系统,内核只是存储在连续的扇区中,因此这样可以简化引导的过程。然而,从含有文件系统的软盘上引导一个系统也是可能的,即通过使用LILOLinux装入程序(LInux LOader)。

当从硬盘上引导时,主引导记录中的代码将检查分区表(该表同样在主引导记录中)、确定活动分区(标记为可以引导的扇区)、从该分区读入引导扇区并开始执行该引导扇区中的代码。该分区的引导扇区中的代码做与软盘的引导扇区同样的事情:从该分区中将内核读入内存中并启动它。然而,详细过程有所不同,因为,只含有内核映像的独立分区通常是无益的,所以该分区的引导扇区的代码不能只是按顺序去读磁盘,它必须寻找到文件系统放置内核的扇区。有几种方法来处理这些问题,但最常用的方法是使用LILO。(然而具体如何使用与本讨论无关;详细信息参见LILO的文档;叙述的很完整的。)

当使用LILO进行引导过程时,通常会直接引导缺省的内核并启动它。配置LILO,使之可以引导几个内核中的一个或者甚至是不同与Linux的其它操作系统,这也是可能的,并且,让用户在引导期间选择引导哪个内核或哪种操作系统也是可能的。LILO可以配置成为在引导时刻如果按下altshift或者ctrl键时(当LILO被装入内存),LILO会提示要引导除了缺省内核的那一种。另外,LILO可以配置成为有缺省提问时间的状态,当缺省时间一到就引导缺省内核。

使用LILO,在内核或操作系统名称之后给出一内核命令行参数(kernel command line argument)也是可能的。

从软盘引导或从硬盘引导各有各的优点,但是一般来说从硬盘上来引导更好一些,因为这避免了使用软盘的争论。这样做也更快。但是,安装系统从硬盘引导可能更麻烦一点,所以许多人会首先从软盘来引导系统,然后,当系统安装好并且运行正常之后,再安装LILO并从硬盘引导启动。

在不管用什么方法,Linux内核被读入内存以后,就会大概地发生以下事情:

Linux内核是压缩安装的,所以首先它要自解压。内核映像文件的开头部分含有一段小程序来做解压工作。

。如果你有一块Linux能识别出的super-VGA卡并且它有几种特殊的文本模式(比如100列、40行),Linux会提问你要用哪一种文本模式。在编译内核期间,可以预设一种显示模式,就不会再有这种提问出现了。使用LILOrdev也同样能做到。

。在这之后,内核会检查有些什么其它的硬件(硬盘、软驱、网络适配器等等),并会适当地配置其中一些硬件的设备驱动文件;在内核做这些工作时,会输出有关检查结果的信息。例如,当我引导系统时,就有如下信息:

LILO boot:

Loading linux.

Console: colour EGA+ 80x25, 8 virtual consoles

Serial driver version 3.94 with no serial options enabled

tty00 at 0x03f8 (irq = 4) is a 16450

tty01 at 0x02f8 (irq = 3) is a 16450

lp_init: lp1 exists (0), using polling driver

Memory: 7332k/8192k available (300k kernel code, 384k reserved, 176k data)

Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M

Loopback device init

Warning WD8013 board not found at i/o = 280.

Math coprocessor using irq13 error reporting.

Partition check:

hda: hda1 hda2 hda3

VFS: Mounted root (ext filesystem).

Linux version 0.99.pl9-1 (root@haven) 05/01/93 14:12:20

在不同的系统上,上面显示的文字会有所不同。这与所使用的硬件、所用的Linux版本以及与它是如何配置的有关。

。然后,内核将试图加载根文件系统。根文件系统被加载的地方,在内核编译的时候可以配置,也可以在任何时候用rdevLILO来加以指定。文件系统的类型是自动检测出的。如果根文件系统的加载失败了,例如,因为你忘了将相应的文件系统的驱动程序包含入内核,内核将不知所措而使系统停机(不管怎样,此时内核没别的可做)。

根文件系统是以只读方式加载的(这可以用设置地点的同样方式来设置)。这使得文件系统被加载后也能够进行检查;对以读写方式加载的文件系统进行检查不是个好主意。

。在这以后,内核在后台(这将总是进程1号)启动程序init(位于/sbin/init)。Init做各种各样的启动琐事。它所做的确切的事要视它是如何配置的而定;更多信息参见第七章(至今还未写)。至少它会启动一些基本的后台程序。

。然后,init程序转换到多用户模式,并且为虚拟终端以及串行线路启动一个getty程序。getty这个程序用于让人通过虚拟终端以及串行终端登录系统。init也可能启动其它一些程序,这要看它是如何配置而定。

。这之后,引导过程就完成了,并且系统启动并正常运行了。

 

关闭系统详述

按照正确的过程来关闭Linux系统是很重要的。如果你没有这样做,你的文件系统很可能会变得毫无价值并且文件也会变得混乱。这是因为Linux有一个磁盘缓冲,它不会将数据立刻写入磁盘的,而是在一定的间隔时间。这极大地改进了性能,但也意味着如果你随意地关闭电源,此时缓冲中可能保存着许多数据并且磁盘上的数据会不完全而不能成为一个完整运行的文件系统(因为只有一些数据被写入硬盘)。

不能仅仅扳动电源开关的另一个理由是,在一个多任务系统中,后台可能正运行着许多程序,随意地关闭电源损失会非常惨重的。通过进行适当的关机过程,你可以确信所有的后台进程都能保存它们的数据。

正确地关闭Linux系统的命令是shutdown。它通常有两种方法使用。

如果你正在运行只有你一个用户的系统,使用shutdown的通常方法是关闭所有正在运行的程序,退出所有的虚拟终端,以root在一个虚拟终端上登录(或者如果你已是root的话就不要退出了,但你要转到root的主目录中或root目录中,以避免不卸载的问题),然后执行命令shutdown –h now(如果你要延迟关闭系统,则用+号和一个代表分钟的数字来替代now,尽管你在单用户系统上不需要这样做)。

另一种方法是,如果你的系统上现有许多用户,则使用命令shutdown -h +time message,这里time是系统停止的延迟时间,message系统为什么要关闭的简短解释消息。

# shutdown -h +10 'We will install a new disk. System should

> be back on-line in three hours.'

#

这将警告所有用户系统将在十分钟内关闭,并且他们最好马上退出以防止数据的丢失。警告信息将显示在所有登录的用户的终端上,包括所有xterms

Broadcast message from root (ttyp0) Wed Aug 2 01:03:25 1995...

We will install a new disk. System should

be back on-line in three hours.

The system is going DOWN for system halt in 10 minutes !!

[root(ttyp0)播出消息,Wed Aug 2 01:03:25 1995

我们将安装一个新硬盘。系统将

3小时后启动。

系统将在10分钟内关闭!!]

警告信息在系统关闭之前会自动重复几遍,而且随着关闭时刻的迫近,警告信息播出的时间间隔越来越短。

当延迟时间到开始正真的关闭操作时,所有的文件系统(除了根文件系统)都被卸载,所有用户进程(如果还有人没退出)都被终止,后台程序也关闭了,所有文件系统被卸载,并且一般地所有的工作安排都关闭了。当所有这一切做完以后,init打印出你可以关闭系统电源的提示。然后,也仅仅在此时,你才可以关闭机器的电源。

尽管在任何正常的机器上很少发生,有时,不能正常地关闭系统。例如,如果内核发生问题并且错误地执行指令,就会完全不接受任何新的命令,因此,想正常地关闭系统就很困难了,你此时所能做的就是期望系统没有遭到严重的损坏并把电源关掉。如果问题不严重的话(例如,有人砍了你的键盘),并且内核以及update程序仍能正常地工作的话,等待几分钟,给update一个机会来刷新缓冲,并仅在此之后关闭电源。

有些人喜欢使用三次sync [3] 来关闭系统,等待磁盘I/O停止,然后关闭电源。如果没有程序运行着,那么这和使用shutdown是等同的。然而,这样做没有卸载任何文件系统并且可能会导致ext2fs的“干净文件系统”标志。三次使用sync来关闭系统的方法不值得推荐。

(如果你觉得奇怪话:使用三个sync是因为在UNIX的早期,当命令分开来键入时,对磁盘I/O通常会有足够的时间。)

重启动

重启动表示再次启动引导系统。做法是首先完全关闭系统,关闭电源,然后再打开电源。一个更简单的方法是请求shutdown来重启动系统,而不是仅仅停止系统。这是用带选项-rshutdown来做的,例如,执行命令shutdown –r now

当按下ctrl-alt-del组合键时,大多数Linux系统运行shutdown –r now来重启动系统。然而,ctrl-alt-del组合键的功能是可以配置的,因此在一个多用户的机器上最好是在重启动前给出一些延迟时间。对于任何人都可以动的系统甚至可以将ctrl-alt-del配置成不起任何作用。

 

单用户模式

shutdown命令也可以将系统转到单用户模式,在这种方式下除了root使用控制台,别人是不可以登录系统的。这对于系统正常运行时不能进行的系统管理任务是非常有用的。

 

紧急启动(引导)盘

并不是总能从计算机的硬盘上引导启动的。例如,如果你配置LILO有误,会使你的系统不可引导。针对这些情况,你需要另外一个总能工作的方法(在硬盘能工作时)。对于典型的Pc机来说,这是指从软盘驱动器上启动。

大多数Linux发行版本允许在安装时创建一个紧急引导盘(emergency boot floppy)。这样做是好有益处的。然而,有些这样的引导盘仅含有一个内核,并且假设使用发行的安装盘上的程序来修复任何碰到的问题。有时候有了这些程序还是不够的;例如,你可能需要从备份中恢复一些文件,但所用的备份软件在安装盘没有。

因此,有可能需要创建一张定制的root软盘。Graham Chapman著的Bootdisk HOWTOXXX引用)这方面的说明。当然,你必须保持你的紧急引导盘和root盘是最新的。

加载了root盘的软盘驱动器不能再用于其它用途。这对于只有一个软盘驱动器的人来说甚为不便。然而,如果你有足够的内存的话,你可以配置你的引导盘将root盘的内容装入RAM盘中(针对于此,引导盘上的内核需要进行特别的配置)。一旦root盘的内容被装入RAM盘中,软盘驱动器就可以加载其它磁盘了。

 

注释

  1. 在早期的计算机中,仅仅打开计算机电源是不够的,你还要手工地将操作系统装入内存。而这些新发明的事情会自己执行完所有这些过程。
  2. 这称为开机自检(power on self test),或简称POST
  3. sync用于刷新高速缓冲。