本节说明当
Linux系统引导和关机时发生了什么,应该任何正确完成.如果没有遵循正确的过程,文件可能损坏或丢失.
( l( q7 J- G, m' B M8 l 引导和关机概述
2 C7 V4 V3 @, _+ K( u 开启
计算机并导致其
操作系统被加载的过程叫引导.Thenamecomesfromanimageofthecomputerpullingitselfupfromitsbootstraps,buttheactitselfslightlymorerealistic.
$ ~1 |$ Y# @ v2 | ]$ m8 u 启动过程中,计算机首先加载了一小段叫bootstraploader的
程序,它依次加载和启动操作系统,bootstraploader通常存储在
硬盘或软盘的固定的位置.这2步过程的理由是操作系统大而复杂,而计算机加载的第一段代码很小(几百字节),以免使固件不必要地复杂化.
; ?7 [$ w; e$ Q# v
4 u: B9 k" O. W% j S2 { 不同的计算机的bootstrap不同.对于PC,计算机(它的BIOS)读软盘或硬盘的第一个扇区(叫引导扇).bootstraploader包含在这个扇区中.它加载位于
磁盘(和其他)的其他地方的操作系统.
" ]4 b( L0 z. j' V0 ^
Linux加载后,它创始化
硬件和设备
驱动,然后运行init.init启动其他进程以允许用户登录和做其他事情.这部分的细节在下面讨论.
% W- M* y# r' {( \9 y k[color=#FFFFFF']
- G! `; V7 G. b' h" ^, w+ |9 S, G
1 G& L9 r7 |8 `* U; s+ d9 j 为了关闭一个Linux系统,首先所有进程被告知结束(这使他们关闭所有文件,完成必要的其他事情,使之整齐地结束),然后unmount文件系统和对换区,最后打印可以关掉
电源的
信息到控制台.如果没有遵循正确的过程,可怕的事情可能发生.最重要的,文件系统缓冲cache可能没有回写,这意味着其中的所有
数据将丢失,磁盘上的文件系统不完整,并可能不可用.
- B% u. o: V' }; ^% e# n, p
近观引导过程
7 B9 P$ Y+ Q6 V( |; k[color=#FFFFFF']
6 K1 d) v7 I8 U- m3 D2 ^+ P5 q% u# K0 `$ E$ k% Z0 Z
可以从软盘或硬盘引导Linux.安装和开始
指南的安装一节([Wel])告诉你如何安装Linux,并按你希望的方式引导.
9 F+ B+ x, b) I. X9 |5 E, A 当PC引导后,BIOS做一些测试保证一切正常,然后开始真正的引导.它选择一个磁盘(通常是第一个软驱,如果有软盘的话,否则就是第一个硬盘,如果安装了的话;顺序是可设置的).然后读第一个扇区,这叫引导扇;对于硬盘,也叫主引导记录,因为硬盘可以包含多个分区,每个分区都有自己的引导扇.
) o" Q) S' A5 |* Q" L8 I
引导扇包含一个小程序(小到可以存入一个扇区),它的责任是从磁盘读入真正的操作系统并启动之.从软盘启动Linux时,引导扇包含的代码只读前数百个数据块(当然,依赖于核心的大小)到预定的
内存位置.Linux引导软盘上,没有文件系统,核心存在连续的扇区中,因为这样简化了引导过程.当然,使用LILO(LInuxLOader)可以从文件系统引导.
6 R* D* a: Q! L! g+ M* i) a
从硬盘引导,主引导记录的代码检查分区表(也在主引导记录扇区中),确认活动分区(标记为可引导的分区),从该分区读引导扇区,然后启动该引导扇区的代码.该分区的引导扇区的代码做与软盘所做的相同:从该分区读入核心并启动.但细节不同,因为一般只给核心映象做一个单独的分区是没什么用的,所以分区引导扇中的代码不能只顺序地读磁盘,它必须找到文件系统把它们放在哪些扇区中.有几个方法解决这个问题,但最通常的方法是使用LILO.(关于如何做的细节与这里的讨论无关;更多的信息请看LILO文档,它很全面)
0 D. e! I0 e7 |! P8 J3 @& d 用LILO引导时,它读入并引导缺省核心.也可以设置LILO,使之能引导若干个核心之一,甚至其他操作系统,也可以在引导时让用户选择引导哪个核心或操作系统.LILO可以设置为如果有人在引导时按住alt,shift,orctrl键(LILO启动时),LILO将不立即引导缺省的而问用户引导哪个.LILO可以设置为带一个timeout选项并询问,当超时时,就引导缺省核心.
7 E' Z* u9 k/ r* M+ [ META:除了LILO还有其他的引导载入程序,如loadlin,它们的信息将在下一版本中给出.
[! V _9 f8 r4 D0 W4 X) G
从软盘和硬盘启动各有优势,但通常从硬盘启动更好,因为这避免了关于软盘的争论.而且快.然而,安装相同从硬盘启动可能有更多的麻烦,因此很多人先用软盘引导,然后当相同工作很好后,再安装LILO从硬盘引导.
( C% m: P1 S- T6 Z" o- D
[color=#FFFFFF']
m9 w0 S4 p/ [! L8 s
1 M" Q! k) ?% _- `
Linux核心被读入内存后,才真正启动了,概述如下:
* F# K' N5 p) `, H) J9 p[color=#FFFFFF']
- U% S0 J/ f6 T9 n* N0 y
% ?5 F$ u0 @" Q5 O2 \$ Q5 y7 ?/ t& Q) U8 [& e4 K( q4 l6 W' _( _
Linux核心是被压缩安装的,所以它首先得解压自己.核心映象开头包括一个解压的小程序.
3 v* W" S% U3 U& q" ^; Y; K' v
[color=#FFFFFF']
% u+ } b3 V! Z4 F2 x
* k( k4 m: Z4 [, o' a. H
如果你有Linux可识别的super-VGA卡,且支持一些特殊的文本模式(如100列40行),Linux会问你要用哪个模式.编译核心时,可能预定了一个
视频模式,就不会问了.这也可以用LILO或rdev完成.
( y0 K E" I7 W! j: L6 \% B 然后,核心检查还有什么其他硬件(硬盘,软盘,
网卡...),并配置适当的设备驱动;同时,输出查找结果的信息.例如,我引导时,得到
类似如下信息:
* q9 N6 C! ?% e, D) N LILOboot:
0 Q5 Q' W y# V2 [ Loadinglinux.
y( W- O* R7 i- f( P
Console:colourEGA80x25,8virtualconsoles
0 [ h% p& G1 e3 W0 t' Y
Serialdriverversion3.94withnoserialoptionsenabled
1 A, D% {* x- P% h) A" O7 w* O
tty00at0x03f8(irq=4)isa16450
3 z9 m5 S9 B& D: t" @+ K
tty01at0x02f8(irq=3)isa16450
( a0 X5 S: X: G' r+ ~4 v8 @ lp_init:lp1exists(0),usingpollingdriver
4 k' u- ?+ _+ {- o( S Memory:7332k/8192kavailable(300kkernelcode,384kreserved,176kdata)
7 s0 D% L6 h* B
Floppydrive(s):fd0is1.44M,fd1is1.2M
1 y, U4 Y$ `- i3 U9 S7 Q8 L5 ]% T Loopbackdeviceinit
: F6 `3 j% n$ ^- N8 `
WarningWD8013boardnotfoundati/o=280.
: B8 h; q6 m8 N; z9 {
Mathcoprocessorusingirq13errorreporting.
( f+ I/ }" H7 x# a" G8 G6 _# r
Partitioncheck:
d5 _# H$ B( B$ o) F1 V
hda:hda1hda2hda3
# f- J" l( z' l# @1 @
VFS:Mountedroot(extfilesystem).
+ {4 D& @$ e, j5 ~4 C# k
Linuxversion0.99.pl9-1(
root@haven)05/01/9314:12:20
8 o* c# l5 u) _! c& E0 r
精确的文本在不同系统上不同,依赖硬件,Linux版本,及其配置.
" e, n2 d2 R; k* Z# r+ i 然后核心试图mount根文件系统.位置可在编译时设置,或在任何时候使用rdev或LILO.文件系统类型自动检测.如果根文件系统mount失败,例如因为你忘了在核心中包含相关的文件系统驱动,核心将失败,系统停止(此时没什么可做了).
1 }% l; B, o( s# _& x3 _ 根文件系统通常被只读mount(这可用与位置相同的方法).这可使文件系统在mount上时检查;检查一个可读写的已mount的文件系统可不是个好主意.
! U+ K8 W! U: N 然后,核心在后台启动程序init(位于/sbin/init)(它的进程号是1).init做许多启动工作.确切的事依赖于设置;参见章了解更多信息.它至少要启动一些必要的后台守候程序.
c- Z/ s0 S4 x5 h$ y
init然后切换到多用户模式并启动getty,提供虚拟控制台和串行线.getty是一个让用户通过虚拟控制台和串行终端登录的程序.init还可能启动一些其他程序,基于设置.
. x* t# U1 m: s[color=#FFFFFF']
3 x0 G+ V' ~" [
) X. u. {+ ^* j( Y 至此,引导完成,系统启动并正常运行.
% P3 A6 C0 v0 Y! _, m 关于关机的更多信息
6 W' }2 C9 x9 U1 J 关闭Linux系统时,遵循正确的过程是很重要的。否则,文件系统可能成为废物,文件可能变成杂乱的。这是因为Linux使用磁盘缓存,并不立即将数据写到磁盘,而是间歇地回写。这极大地改善了性能,但同时也意味着如果你只是关闭电源,cache可能保留着大量数据,而磁盘上的数据可能不是一个全部的正在工作的文件系统(因为有些数据已经回写到硬盘,而有些没有)。
* o, L4 K. p) L' ` 另一个不能直接关闭电源的原因是:在多任务系统中,后台可能运行着很多东西,关闭电源可能损失惨重。使用正确的关机顺序,可以保证所有的后台进程得以保存他们的数据。
' [9 M% j* n+ ~$ r, Y6 H 正常关闭Linux系统的命令是shutdown。它通常使用2种方法之一。
/ z+ e. W0 Z g: B/ J8 X8 R
如果系统只有你一个用户,使用shutdown的通常方法是退出所有运行程序,从所有虚拟控制台注销,用root登录(如果你已经是root,当然不必再注销、登录,但应该换到根目录,以免由于unmount出现问题),然后运行命令shutdown-hnow(虽然单用户时一般不必要,但如果需要一个延时,用一个加号加一个表示分钟的数目代替now)
7 m. L3 P% [# t9 k) _% i8 Z) ^ 如果系统是多用户,使用命令shutdown-htimemessage,time是到系统停止的分钟数,message是告知所有用户系统关机原因的
短信息。
! m& N/ {+ g+ Y# U+ b! g #shutdown-h10\\\'Wewillinstallanewdisk.
Systemshould
! S9 a6 B$ j) a( o% V5 m7 E5 u 〉bebackon-lineinthreehours.\\\'
: h6 O2 [" a9 |' Q4 q
#
+ [; M2 c5 ^8 e0 } 上面的命令警告所有用户,系统将在10分钟后关闭,他们最好保存信息,否则将丢失。警告将显示在所有登录的终端上,包括所有的xterm上:
! e) | }" l7 G$ }- r; s; f6 a9 G Broadcastmessagefromroot(ttyp0)WedAug201:03:251995...
" _4 A& b& y ]* Y1 e, Y3 c3 Z' t Wewillinstallanewdisk.Systemshould
6 z! C9 f5 a8 k) q
bebackon-lineinthreehours.
5 B) T8 K- F: T
ThesystemisgoingDOWNforsystemhaltin10minutes!!
& u. |& e& S0 \8 W: n3 j
[color=#FFFFFF']
3 y! k7 Y5 W7 I5 I% ?4 `: ?1 T
# A7 B/ l# X! f' q! D 警告在系统关闭前将自动重复数遍,随着
时间流逝,间隔越来越短。
9 `! Y# z+ E( }! N) I7 n- P8 I
[color=#FFFFFF']
. E5 h9 e+ `; \: G* W
8 a) F7 ~1 E' S4 R 当延时之后关闭系统真正开始时,所有文件系统(除了根)被unmount,所有用户进程(如果有人还未注销)被终止,守侯进程被关闭,所有东西都停下来。此后,init打印出一条信息告知你可以关掉电源了。此时,也只有在此时,你才可以关闭电源。
% z6 Q/ R [) \* |) b* o# _[color=#FFFFFF']
3 F) z1 o7 j* a; i6 Y9 I/ \- x4 u. p0 v a6 r% A8 w8 f/ H4 D
有时(虽然在任何好的系统上极少),系统可能不能正常关闭。例如,核心紊乱、崩溃等不正常情况,可能无法键入任何命令,因此正常关机可能有些困难,这是只能直接关机。问题可能没那么严重,比如,有人误动了你的
键盘,核心和update程序还在正常运行,等待一些时间可能是个好建议,这能使update有机会将缓冲cache中的数据回存硬盘,然后再直接关机。
\# F1 t! j1 y; Q+ z! a 有人喜欢用sync三遍来关闭系统,等到磁盘I/O停止,然后在关闭电源。如果没有什么程序运行着,这和用shutdown等效。然而,它不unmount任何文件系统,可能导致ext2fs的"干净文件系统"标志出问题。这种3遍sync的方法是不推荐使用的。
. o- N" a7 e8 H; b D( d (Incaseyou\\\'rewondering:thereasonforthreesyncsisthatintheearlydaysofUNIX,whenthecommandswere
typedseparately,thatusuallygavesufficienttimeformostdiskI/Otobefinished.)
7 d- J! k& v9 K$ ]9 d' W& w 重启动
3 v1 ~4 F" G) s: B
重启动就是完全关闭系统,关掉电源,然后再打开。简单方法是用shutdown重启动系统而不是仅停止系统。这要使用shutdown的-r选项,例如命令shutdown-rnow。
+ l- X: M: ~1 [% i$ v
许多Linux系统在按ctrl-alt-del键时运行shutdown-rnow。这是可设置的,比如在多用户系统中设置一定的延时也许更好。如果是谁都能接触到的系统,那么最好设置为按ctrl-alt-del什么也不干。
" g4 F% V7 z& n( f4 C2 {
4 R7 R, I# x& m, l/ W# G
单用户模式
7 u: F7 X" d5 t5 j' x& c5 n) Z shutdown命令也可用于切换到单用户模式,这种模式谁也不能登录,只有root可以使用控制台。这对系统一般运行时不能做的系统
管理任务很有用。单用户模式将在章详细讨论。
# e [1 I1 |0 O j$ x$ }( Q( n 紧急引导(软)盘
& F; d" K! N) d 并非总可以从硬盘引导。例如,LILO设错了,系统可能就无法引导。这时,需要另一个总能引导的方法。对于典型的PC,可能是软驱。
7 u& Q; O+ _( T
许多Linuxdistributions允许在安装时产生一张紧急引导盘emergencybootfloppy。应该做。然而,有些这样的引导盘只包含核心,andassumeyouwillbeusingtheprogramsonthedistribution\\\'sinstallationdiskstofixwhateverproblemyouhave。有时这些程序是不够的:例如你可能需要回存你的备份,而备份/回存
软件在Linux安装盘里没有。
g( u. G3 `3 |- n' h: u
[color=#FFFFFF']
# {0 o" a4 ]" a& {0 T6 F
6 _1 k4 t9 ?0 n E 因此,可能需要自己产生root盘。GrahamChapman写的BootdiskHOWTO([Cha])包含关于此的指导。当然,你必须记得使你的紧急引导盘和root盘最新。
# Y1 U d, ^7 ^ }! _0 f6 G4 e root盘被mount上时,不能用软驱干其他任何事,因此如果你只有一个软驱可能不太方便。然而,如果你有足够的内存,可以设置引导盘将root盘加载到RAM盘上(为此,引导盘的核心需要特殊设置)。一旦root盘被加载到RAM盘中,软驱就可以用于mount其他盘了。