本节说明当
Linux系统引导和关机时发生了什么,应该任何正确完成.如果没有遵循正确的过程,文件可能损坏或丢失.
. U8 f6 r9 ?5 f. V; J 引导和关机概述
6 B- ]+ {6 A. H3 d. I
开启
计算机并导致其
操作系统被加载的过程叫引导.Thenamecomesfromanimageofthecomputerpullingitselfupfromitsbootstraps,buttheactitselfslightlymorerealistic.
* }/ g. `' L5 X# h: R 启动过程中,计算机首先加载了一小段叫bootstraploader的
程序,它依次加载和启动操作系统,bootstraploader通常存储在
硬盘或软盘的固定的位置.这2步过程的理由是操作系统大而复杂,而计算机加载的第一段代码很小(几百字节),以免使固件不必要地复杂化.
3 |0 ~. ^% a7 S& W' X8 Z/ \
[color=#FFFFFF']
. c4 C9 ~7 e& i/ z: J8 g3 A7 ^: d5 G7 D0 `
6 P" e0 y9 _3 }( N5 k1 O
不同的计算机的bootstrap不同.对于PC,计算机(它的BIOS)读软盘或硬盘的第一个扇区(叫引导扇).bootstraploader包含在这个扇区中.它加载位于
磁盘(和其他)的其他地方的操作系统.
( N1 X- ~; K ?! }2 I& o3 B Linux加载后,它创始化
硬件和设备
驱动,然后运行init.init启动其他进程以允许用户登录和做其他事情.这部分的细节在下面讨论.
% W1 R) n; e. F1 T' I[color=#FFFFFF']
7 x* A. a& ~3 w
X5 T$ A8 C% r" ?' v 为了关闭一个Linux系统,首先所有进程被告知结束(这使他们关闭所有文件,完成必要的其他事情,使之整齐地结束),然后unmount文件系统和对换区,最后打印可以关掉
电源的
信息到控制台.如果没有遵循正确的过程,可怕的事情可能发生.最重要的,文件系统缓冲cache可能没有回写,这意味着其中的所有
数据将丢失,磁盘上的文件系统不完整,并可能不可用.
T/ C- k+ G( X( P& E 近观引导过程
4 @# R! Q9 `9 e# J 可以从软盘或硬盘引导Linux.安装和开始
指南的安装一节([Wel])告诉你如何安装Linux,并按你希望的方式引导.
+ k7 K3 D& Z: U( i$ \; l8 \
当PC引导后,BIOS做一些测试保证一切正常,然后开始真正的引导.它选择一个磁盘(通常是第一个软驱,如果有软盘的话,否则就是第一个硬盘,如果安装了的话;顺序是可设置的).然后读第一个扇区,这叫引导扇;对于硬盘,也叫主引导记录,因为硬盘可以包含多个分区,每个分区都有自己的引导扇.
/ t. o" f9 X: I+ w# o
引导扇包含一个小程序(小到可以存入一个扇区),它的责任是从磁盘读入真正的操作系统并启动之.从软盘启动Linux时,引导扇包含的代码只读前数百个数据块(当然,依赖于核心的大小)到预定的
内存位置.Linux引导软盘上,没有文件系统,核心存在连续的扇区中,因为这样简化了引导过程.当然,使用LILO(LInuxLOader)可以从文件系统引导.
" C: y1 i; e: h- T' l3 I 从硬盘引导,主引导记录的代码检查分区表(也在主引导记录扇区中),确认活动分区(标记为可引导的分区),从该分区读引导扇区,然后启动该引导扇区的代码.该分区的引导扇区的代码做与软盘所做的相同:从该分区读入核心并启动.但细节不同,因为一般只给核心映象做一个单独的分区是没什么用的,所以分区引导扇中的代码不能只顺序地读磁盘,它必须找到文件系统把它们放在哪些扇区中.有几个方法解决这个问题,但最通常的方法是使用LILO.(关于如何做的细节与这里的讨论无关;更多的信息请看LILO文档,它很全面)
( l9 k! U: W2 r0 T[color=#FFFFFF']
- }# h7 E' {2 g% {, d( j
. F. i7 u1 E l) L+ R7 Z" D$ T7 c 用LILO引导时,它读入并引导缺省核心.也可以设置LILO,使之能引导若干个核心之一,甚至其他操作系统,也可以在引导时让用户选择引导哪个核心或操作系统.LILO可以设置为如果有人在引导时按住alt,shift,orctrl键(LILO启动时),LILO将不立即引导缺省的而问用户引导哪个.LILO可以设置为带一个timeout选项并询问,当超时时,就引导缺省核心.
% n& ]) t$ r& _: b6 \+ D
META:除了LILO还有其他的引导载入程序,如loadlin,它们的信息将在下一版本中给出.
( _$ S) Z. v0 q9 ]
从软盘和硬盘启动各有优势,但通常从硬盘启动更好,因为这避免了关于软盘的争论.而且快.然而,安装相同从硬盘启动可能有更多的麻烦,因此很多人先用软盘引导,然后当相同工作很好后,再安装LILO从硬盘引导.
* A2 P; o1 d* w5 y4 }
Linux核心被读入内存后,才真正启动了,概述如下:
5 {* b4 c' P( N5 v
1 q- I& F4 T+ f7 S/ W( m Linux核心是被压缩安装的,所以它首先得解压自己.核心映象开头包括一个解压的小程序.
( j& R: N% T2 c1 i5 c[color=#FFFFFF']
7 `0 x/ d P+ S, r. \) a
5 s: L/ u/ u3 s3 m7 L 如果你有Linux可识别的super-VGA卡,且支持一些特殊的文本模式(如100列40行),Linux会问你要用哪个模式.编译核心时,可能预定了一个
视频模式,就不会问了.这也可以用LILO或rdev完成.
6 J; o1 F4 E7 ?. Y- l! s* |
然后,核心检查还有什么其他硬件(硬盘,软盘,
网卡...),并配置适当的设备驱动;同时,输出查找结果的信息.例如,我引导时,得到
类似如下信息:
$ Z+ o7 J3 {! y; h" G) u LILOboot:
. ~2 U7 z0 m& d' i4 p3 y1 E: d* ` Loadinglinux.
- }* S& ?" Y: n Console:colourEGA80x25,8virtualconsoles
! I8 q* U9 @# h5 D4 _# k
Serialdriverversion3.94withnoserialoptionsenabled
9 c+ q& H% ?) j/ D0 |+ | tty00at0x03f8(irq=4)isa16450
+ }# z9 M; K; d9 V2 O/ C& J& P tty01at0x02f8(irq=3)isa16450
( `5 H/ f' u& @ N1 P1 B2 C0 [
lp_init:lp1exists(0),usingpollingdriver
+ T1 i; V$ {4 H: A$ e4 L6 Z
Memory:7332k/8192kavailable(300kkernelcode,384kreserved,176kdata)
0 J0 z+ `/ f; e: x! F5 q; U Floppydrive(s):fd0is1.44M,fd1is1.2M
7 C* q8 [1 @# D& B
Loopbackdeviceinit
2 ?) T6 t1 l+ a" p. Q* w
WarningWD8013boardnotfoundati/o=280.
( J9 z e! X9 R1 U
Mathcoprocessorusingirq13errorreporting.
% b9 Y1 u6 d/ W5 ?% y! U7 B Partitioncheck:
. f! b/ q. |/ ^7 n; { hda:hda1hda2hda3
" {: T, z& `2 M! C
VFS:Mountedroot(extfilesystem).
0 n( J, f7 O0 C& }2 G
Linuxversion0.99.pl9-1(
root@haven)05/01/9314:12:20
2 v" D4 s( }! B7 t; Z. ~& r5 e, J
[color=#FFFFFF']
3 ^5 F) @8 v4 a) x% R6 f' S9 C
- m4 t. ~- ` p" K( [1 s 精确的文本在不同系统上不同,依赖硬件,Linux版本,及其配置.
7 v- t3 w/ g! g) X G/ n 然后核心试图mount根文件系统.位置可在编译时设置,或在任何时候使用rdev或LILO.文件系统类型自动检测.如果根文件系统mount失败,例如因为你忘了在核心中包含相关的文件系统驱动,核心将失败,系统停止(此时没什么可做了).
0 B2 D) t/ W. \5 ]& K) ~" g 根文件系统通常被只读mount(这可用与位置相同的方法).这可使文件系统在mount上时检查;检查一个可读写的已mount的文件系统可不是个好主意.
F- c+ @ s5 V3 M( v3 r
然后,核心在后台启动程序init(位于/sbin/init)(它的进程号是1).init做许多启动工作.确切的事依赖于设置;参见章了解更多信息.它至少要启动一些必要的后台守候程序.
% |, C, M& x7 a. s2 m
init然后切换到多用户模式并启动getty,提供虚拟控制台和串行线.getty是一个让用户通过虚拟控制台和串行终端登录的程序.init还可能启动一些其他程序,基于设置.
. J* J( l5 w+ R( y 至此,引导完成,系统启动并正常运行.
) X0 N4 p0 c! _# c) ]8 g1 j8 t 关于关机的更多信息
. B1 x# @) G, _& u: c& Z8 H
关闭Linux系统时,遵循正确的过程是很重要的。否则,文件系统可能成为废物,文件可能变成杂乱的。这是因为Linux使用磁盘缓存,并不立即将数据写到磁盘,而是间歇地回写。这极大地改善了性能,但同时也意味着如果你只是关闭电源,cache可能保留着大量数据,而磁盘上的数据可能不是一个全部的正在工作的文件系统(因为有些数据已经回写到硬盘,而有些没有)。
" n: t6 W, o2 H+ d 另一个不能直接关闭电源的原因是:在多任务系统中,后台可能运行着很多东西,关闭电源可能损失惨重。使用正确的关机顺序,可以保证所有的后台进程得以保存他们的数据。
4 \+ s0 ~4 J2 X i/ ?/ x6 h# C 正常关闭Linux系统的命令是shutdown。它通常使用2种方法之一。
! {6 \" v* R. n$ M! s) Z1 o
如果系统只有你一个用户,使用shutdown的通常方法是退出所有运行程序,从所有虚拟控制台注销,用root登录(如果你已经是root,当然不必再注销、登录,但应该换到根目录,以免由于unmount出现问题),然后运行命令shutdown-hnow(虽然单用户时一般不必要,但如果需要一个延时,用一个加号加一个表示分钟的数目代替now)
/ {- s9 |+ Z) ^2 |# m0 i# _ 如果系统是多用户,使用命令shutdown-htimemessage,time是到系统停止的分钟数,message是告知所有用户系统关机原因的
短信息。
8 X& f: k- E2 q" ?6 t$ n[color=#FFFFFF']
+ Y: \7 {) W5 @. w
9 P6 z0 [* e, b/ W$ Q
#shutdown-h10\\\'Wewillinstallanewdisk.
Systemshould
) i+ d; `2 ] u
〉bebackon-lineinthreehours.\\\'
( y* z0 h, i- }- L" M #
( ^$ C% \( n# W. K 上面的命令警告所有用户,系统将在10分钟后关闭,他们最好保存信息,否则将丢失。警告将显示在所有登录的终端上,包括所有的xterm上:
# x. }0 Y8 Y6 x1 t: G
Broadcastmessagefromroot(ttyp0)WedAug201:03:251995...
y1 p1 E. y: g. q7 Y$ S[color=#FFFFFF']
" f8 Q8 ?* h* J) w) k/ N) N
, Y" x; s5 P: f4 w- v/ J( a6 l+ i2 O Wewillinstallanewdisk.Systemshould
" g/ q; B& L3 Y/ F. T E% a
bebackon-lineinthreehours.
+ }1 R3 T E3 B7 P8 I+ {5 @. T" n ThesystemisgoingDOWNforsystemhaltin10minutes!!
$ M! b/ D' k* e- H7 x) ^! G
[color=#FFFFFF']
" f- S$ w+ {) _/ O; ^- O; x& g* R9 }' b* W) ]1 G, R
警告在系统关闭前将自动重复数遍,随着
时间流逝,间隔越来越短。
- l5 l: b0 m7 ^! c* D7 ~ F[color=#FFFFFF']
4 a- @& `. x3 S( L0 f5 f# t8 N4 [ J# i
当延时之后关闭系统真正开始时,所有文件系统(除了根)被unmount,所有用户进程(如果有人还未注销)被终止,守侯进程被关闭,所有东西都停下来。此后,init打印出一条信息告知你可以关掉电源了。此时,也只有在此时,你才可以关闭电源。
, U7 k& P5 _0 Q2 t- ~[color=#FFFFFF']
0 y0 l! r9 Q! F/ e( C( z# X( @8 @# ~ n5 h; E: c" j/ p
有时(虽然在任何好的系统上极少),系统可能不能正常关闭。例如,核心紊乱、崩溃等不正常情况,可能无法键入任何命令,因此正常关机可能有些困难,这是只能直接关机。问题可能没那么严重,比如,有人误动了你的
键盘,核心和update程序还在正常运行,等待一些时间可能是个好建议,这能使update有机会将缓冲cache中的数据回存硬盘,然后再直接关机。
+ ]3 J3 r+ e: c1 J& q8 I R3 C) T% s 有人喜欢用sync三遍来关闭系统,等到磁盘I/O停止,然后在关闭电源。如果没有什么程序运行着,这和用shutdown等效。然而,它不unmount任何文件系统,可能导致ext2fs的"干净文件系统"标志出问题。这种3遍sync的方法是不推荐使用的。
$ a4 T1 q% i* `3 D/ n: n; O# D$ T/ @8 C (Incaseyou\\\'rewondering:thereasonforthreesyncsisthatintheearlydaysofUNIX,whenthecommandswere
typedseparately,thatusuallygavesufficienttimeformostdiskI/Otobefinished.)
; K9 r4 y" D% Z( O! o/ H
重启动
4 G5 n8 ^! Y: @- X: r& y ]
[color=#FFFFFF']
" w+ G1 o; ^" H7 n; Z" Q Q# W8 D1 `6 t- l
重启动就是完全关闭系统,关掉电源,然后再打开。简单方法是用shutdown重启动系统而不是仅停止系统。这要使用shutdown的-r选项,例如命令shutdown-rnow。
/ `6 i. D; T1 P8 _ 许多Linux系统在按ctrl-alt-del键时运行shutdown-rnow。这是可设置的,比如在多用户系统中设置一定的延时也许更好。如果是谁都能接触到的系统,那么最好设置为按ctrl-alt-del什么也不干。
) i8 I- I) K$ R; A# o( s; _# s. y, d0 `# B+ r( N& _
单用户模式
- p# {0 }6 `7 n; @& s* g shutdown命令也可用于切换到单用户模式,这种模式谁也不能登录,只有root可以使用控制台。这对系统一般运行时不能做的系统
管理任务很有用。单用户模式将在章详细讨论。
6 A% { h% ^: ?2 \4 h Z$ n
紧急引导(软)盘
3 o+ n o+ V, ]
并非总可以从硬盘引导。例如,LILO设错了,系统可能就无法引导。这时,需要另一个总能引导的方法。对于典型的PC,可能是软驱。
' m% w! E) a( W* u# s) @; `5 G 许多Linuxdistributions允许在安装时产生一张紧急引导盘emergencybootfloppy。应该做。然而,有些这样的引导盘只包含核心,andassumeyouwillbeusingtheprogramsonthedistribution\\\'sinstallationdiskstofixwhateverproblemyouhave。有时这些程序是不够的:例如你可能需要回存你的备份,而备份/回存
软件在Linux安装盘里没有。
. T( s( }9 h C. f' X" K
因此,可能需要自己产生root盘。GrahamChapman写的BootdiskHOWTO([Cha])包含关于此的指导。当然,你必须记得使你的紧急引导盘和root盘最新。
+ E' J$ _4 E, v' Y
root盘被mount上时,不能用软驱干其他任何事,因此如果你只有一个软驱可能不太方便。然而,如果你有足够的内存,可以设置引导盘将root盘加载到RAM盘上(为此,引导盘的核心需要特殊设置)。一旦root盘被加载到RAM盘中,软驱就可以用于mount其他盘了。