本节说明当Linux系统引导和关机时发生了什么,应该任何正确完成. 如果没有遵循正确的过程, 文件可能损坏或丢失.

  引导和关机概述

  开启计算机并导致其操作系统被加载的过程 叫引导. The name comes from an p_w_picpath of the computer pulling itself up from its bootstraps, but the act itself slightly more realistic.
  启动过程中,计算机首先加载了一小段叫 bootstrap loader的程序,它依次加载和启动操作系统, bootstrap loader通常存储在硬盘或软盘的固定的位置. 这2步过程的理由是操作系统大而复杂,而计算机加载的第一段代码很小(几百字节),以免使固件不必要地复杂化.

  不同的计算机的bootstrap不同. 对于PC, 计算机(它的BIOS)读软盘或硬盘的第一个扇区(叫 引导扇). bootstrap loader包含在这个扇区中. 它加载位于磁盘(和其他)的其他地方的操作系统.

  Linux加载后, 它创始化硬件和设备驱动, 然后运行 init . init 启动其他进程以允许用户登录和做其他事情. 这部分的细节在下面讨论.

  为了关闭一个Linux系统, 首先所有进程被告知结束(这使他们关闭所有文件, 完成必要的其他事情, 使之整齐地结束), 然后unmount文件系统和对换区, 最后打印可以关掉电源的信息到控制台. 如果没有遵循正确的过程, 可怕的事情可能发生. 最重要的, 文件系统缓冲cache可能没有回写, 这意味着其中的所有数据将丢失, 磁盘上的文件系统不完整, 并可能不可用.

  近观引导过程

  可以从软盘或硬盘引导Linux. 安装和开始指南的安装一节 ([Wel]) 告诉你如何安装Linux, 并按你希望的方式引导.

  当PC引导后, BIOS做一些测试保证一切正常, 然后开始真正的引导. 它选择一个磁盘(通常是第一个软驱, 如果有软盘的话, 否则就是第一个硬盘, 如果安装了的话; 顺序是可设置的). 然后读第一个扇区, 这叫引导扇; 对于硬盘, 也叫主引导记录, 因为硬盘可以包含多个分区, 每个分区都有自己的引导扇.

  引导扇包含一个小程序(小到可以存入一个扇区), 它的责任是从磁盘读入真正的操作系统并启动之. 从软盘启动Linux时, 引导扇包含的代码只读前数百个数据块(当然, 依赖于核心的大小)到预定的内存位置. Linux引导软盘上, 没有文件系统, 核心存在连续的扇区中, 因为这样简化了引导过程. 当然, 使用LILO(LInux LOader)可以从文件系统引导.

  从硬盘引导, 主引导记录的代码检查分区表(也在主引导记录扇区中), 确认活动分区(标记为可引导的分区), 从该分区读引导扇区, 然后启动该引导扇区的代码. 该分区的引导扇区的代码做与软盘所做的相同: 从该分区读入核心并启动. 但细节不同, 因为一般只给核心映象做一个单独的分区是没什么用的, 所以分区引导扇中的代码不能只顺序地读磁盘, 它必须找到文件系统把它们放在哪些扇区中. 有几个方法解决这个问题, 但最通常的方法是使用LILO. (关于如何做的细节与这里的讨论无关; 更多的信息请看LILO文档, 它很全面)

  用LILO引导时, 它读入并引导缺省核心. 也可以设置LILO, 使之能引导若干个核心之一, 甚至其他操作系统, 也可以在引导时让用户选择引导哪个核心或操作系统. LILO可以设置为如果有人在引导时按住 alt, shift, or ctrl键 (LILO启动时), LILO将不立即引导缺省的而问用户引导哪个. LILO可以设置为带一个timeout选项并询问, 当超时时, 就引导缺省核心.

  META: 除了LILO还有其他的引导载入程序, 如loadlin, 它们的信息将在下一版本中给出.

  从软盘和硬盘启动各有优势, 但通常从硬盘启动更好, 因为这避免了关于软盘的争论. 而且快. 然而, 安装相同从硬盘启动可能有更多的麻烦, 因此很多人先用软盘引导, 然后当相同工作很好后, 再安装LILO从硬盘引导.

  Linux核心被读入内存后, 才真正启动了, 概述如下:


  Linux核心是被压缩安装的, 所以它首先得解压自己. 核心映象开头包括一个解压的小程序.

  如果你有Linux可识别的super-VGA卡, 且支持一些特殊的文本模式(如100列40行), Linux会问你要用哪个模式. 编译核心时, 可能预定了一个视频模式, 就不会问了. 这也可以用LILO或 rdev 完成.
  然后, 核心检查还有什么其他硬件(硬盘, 软盘, 网卡...), 并配置适当的设备驱动; 同时, 输出查找结果的信息. 例如, 我引导时, 得到类似如下信息:

  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版本, 及其配置.
  然后核心试图mount根文件系统. 位置可在编译时设置, 或在任何时候使用 rdev 或LILO. 文件系统类型自动检测. 如果根文件系统mount 失败, 例如因为你忘了在核心中包含相关的文件系统驱动, 核心将失败, 系统停止(此时没什么可做了).

  根文件系统通常被只读mount(这可用与位置相同的方法). 这可使文件系统在mount上时检查; 检查一个可读写的已mount的文件系统可不是个好主意.

  然后, 核心在后台启动程序 init (位于/sbin/init ) (它的进程号是1). init 做许多启动工作. 确切的事依赖于设置; 参见章了解更多信息. 它至少要启动一些必要的后台守候程序.

  init 然后切换到多用户模式并启动getty ,提供虚拟控制台和串行线. getty 是一个让用户通过虚拟控制台和串行终端登录的程序. init 还可能启动一些其他程序, 基于设置.

  至此, 引导完成, 系统启动并正常运行.

  关于关机的更多信息

  关闭Linux系统时,遵循正确的过程是很重要的。否则,文件系统可能成为废物,文件可能变成杂乱的。这是因为Linux使用磁盘缓存,并不立即将数据写到磁盘,而是间歇地回写。这极大地改善了性能,但同时也意味着如果你只是关闭电源,cache可能保留着大量数据,而磁盘上的数据可能不是一个全部的正在工作的文件系统(因为有些数据已经回写到硬盘,而有些没有)。

  另一个不能直接关闭电源的原因是:在多任务系统中,后台可能运行着很多东西,关闭电源可能损失惨重。使用正确的关机顺序,可以保证所有的后台进程得以保存他们的数据。

  正常关闭Linux系统的命令是shutdown 。它通常使用2种方法之一。

  如果系统只有你一个用户,使用shutdown 的通常方法是退出所有运行程序,从所有虚拟控制台注销,用root登录(如果你已经是root,当然不必再注销、登录,但应该换到根目录,以免由于unmount出现问题),然后运行命令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.'
  #

  上面的命令警告所有用户,系统将在10分钟后关闭,他们最好保存信息,否则将丢失。警告将显示在所有登录的终端上,包括所有的xterm 上:
  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 !!

  警告在系统关闭前将自动重复数遍,随着时间流逝,间隔越来越短。

  当延时之后关闭系统真正开始时,所有文件系统(除了根)被unmount,所有用户进程(如果有人还未注销)被终止,守侯进程被关闭,所有东西都停下来。此后,init 打印出一条信息告知你可以关掉电源了。此时,也只有在此时,你才可以关闭电源。

  有时(虽然在任何好的系统上极少),系统可能不能正常关闭。例如,核心紊乱、崩溃等不正常情况,可能无法键入任何命令,因此正常关机可能有些困难,这是只能直接关机。问题可能没那么严重,比如,有人误动了你的键盘,核心和update 程序还在正常运行,等待一些时间可能是个好建议,这能使update 有机会将缓冲cache 中的数据回存硬盘,然后再直接关机。

  有人喜欢用sync 三遍来关闭系统,等到磁盘I/O停止,然后在关闭电源。如果没有什么程序运行着,这和用shutdown 等效。然而,它不unmount任何文件系统,可能导致ext2fs的"干净文件系统"标志出问题。这种3遍sync的方法是不推荐使用的。

  (In case you're wondering: the reason for three syncs is that in the early days of UNIX, when the commands were typed separately, that usually gave sufficient time for most disk I/O to be finished.)

  重启动

  重启动就是完全关闭系统,关掉电源,然后再打开。简单方法是用shutdown 重启动系统而不是仅停止系统。这要使用shutdown的 -r选项,例如命令shutdown -r now。

  许多Linux系统在按ctrl-alt-del键时运行shutdown -r now。这是可设置的,比如在多用户系统中设置一定的延时也许更好。如果是谁都能接触到的系统,那么最好设置为按ctrl-alt-del什么也不干。


  单用户模式

  shutdown命令也可用于切换到单用户模式,这种模式谁也不能登录,只有root可以使用控制台。这对系统一般运行时不能做的系统管理任务很有用。单用户模式将在章详细讨论。

  紧急引导(软)盘

  并非总可以从硬盘引导。例如,LILO设错了,系统可能就无法引导。这时,需要另一个总能引导的方法。对于典型的PC,可能是软驱。

  许多Linux distributions允许在安装时产生一张紧急引导盘emergency boot floppy。应该做。然而,有些这样的引导盘只包含核心,and assume you will be using the programs on the distribution's installation disks to fix whatever problem you have。有时这些程序是不够的:例如你可能需要回存你的备份,而备份/回存软件在Linux安装盘里没有。

  因此,可能需要自己产生root盘。 Graham Chapman写的Bootdisk HOWTO([Cha]) 包含关于此的指导。当然,你必须记得使你的紧急引导盘和root盘最新。

  root盘被mount上时,不能用软驱干其他任何事,因此如果你只有一个软驱可能不太方便。然而,如果你有足够的内存,可以设置引导盘将root盘加载到RAM盘上(为此,引导盘的核心需要特殊设置)。一旦root盘被加载到RAM盘中,软驱就可以用于mount其他盘了。