Linux管理员手册(8)--备份
5 ]; K2 u3 g- Q5 ^2006-06-01
! |3 f2 F: V$ q& ]( y) E/ E
/ z- b7 m# A" E/ S0 I: n. `7 @
# ~( g- }8 E! B" W硬件不肯定是可靠的
' e5 H& y4 j( K* H: R, W 软件肯定是不可靠的
( }9 X+ h. y p/ j' n 人不肯定是不可靠的
& Y' k) E7 G9 _2 R
而自然肯定是可靠的
+ U+ N9 ?1 Y) b$ N4 q$ S6 X2 [
" I4 c4 V; u2 S7 T t' h9 ^ 本张说明为什么、如何、何时要做备份,及如何回存备份的东西。
/ J4 A! n7 U# B- C, e ?8 c! B- K* c+ Z H' h& {+ x
备份的重要
: i& s- o, [1 g1 W, q0 ]; f! w1 h* y+ B1 h9 H8 A' F$ |8 q# l
数据是有价值的。重新产生它需要你花费
时间和努力,并且要花费金钱或至少伤心和
眼泪,有时甚至不可能重新产生,例如一些实验结果。由于数据是一种投资,你必须保护它,并采取措施避免丢失。
% p% ?7 r0 U4 g( I5 V& F- r( b, W, I, F8 n2 t0 m; O; z
丢失数据一般有4个原因:硬件失败、软件曲线、人为因素或自然灾害。虽然现代硬件已经相当可靠,但仍可能自然损坏。存储数据最决定性的硬件是
硬盘,它依赖微小的磁区在充满电噪声的世界上保存数据。现代软件依然不可靠,一个真正可靠的
程序是理想、罕见的,而不是规律。人更不可靠,他们很容易犯错误,甚至为某种目的恶意地破坏数据。自然可能不是邪恶的,但也可能造成破坏。一切的一切,希望什么都正常、完美几乎是不可能的。
9 U* M- O8 U% }% D# h8 T2 P* v
! i2 ]0 n8 u0 h0 w+ N* m 备份是保护数据投资的方法。有数据的多个拷贝,就不怕某个损坏(所需做的仅仅是从备份中恢复丢失的数据)。
8 {) o% R& Q6 g" ]! l& p
9 Q$ o* o* E; s0 D* H! x' n8 c 正确的备份是很重要的。正如
物理世界中任何东西都与其他相关,备份也迟早会失效。好的备份确保有效,你不希望你的备份无效。如果你的备份又坏了,这将雪上加霜,如果你只有一个备份,它可能根本是坏的,只留下你和硬盘中冒烟的灰烬。或者当你恢复时,发现忘了备份一些重要的东西,比如15000个用户站点的用户
数据库。Bestofall,allyourbackupsmightbeworkingperfectly,butthelastknowntapedrivereadingthekindoftapesyouusedwastheonethatnowhasabucketfulofwaterinit.
8 A6 _+ f' r( g! a. {: j
, D* n' T/ u9 ^; l& Y6 C, e% ~( s. ^ Whenitcomestobackups,paranoiaisinthejobdescription.
' j. ~0 Q. {1 {) o6 o1 v) S
. W# g/ Z3 |* [! `( l7 p8 p* ?# K 选择备份介质
: h' R5 u8 L6 M/ f( L
, c* q3 n5 l3 v" E/ V8 W8 o' A 备份所需的最重要的决定是选择备份介质。需要考虑
成本、可靠性、
速度、可得到、可用性。
& A% M6 E+ [5 n4 J! F
( `; V1 g V9 C+ x6 x, y9 s, e
成本是很重要的,因为你的数据可能需要多个存储、多个备份。便宜的介质可以用很多。
, _$ v) w2 p) Y$ j
- r1 G. Z/ [& |( e) ?+ W( c o
可靠性是最重要的,因为坏的备份会雪上加霜。备份介质必须能存储数据多年而不损坏。作为备份介质,使用方法影响可靠性。硬盘一般是很可靠的,但作为备份介质并非很可靠,如果它和备份源在同一
计算机里的话。
6 c0 a7 k3 h! |, K1 H: x* h, K+ R2 x. y- b
速度通常不太重要,如果备份可以非交互地完成。备份花2个小时无所谓,无须监督,多长时间都没有关系。另一方面,ifthebackupcan'tbedonewhenthecomputerwouldotherwisebeidle,那么速度也是个问题。
5 ^( f$ q- N+ @2 {: c0 n& [* ^) ?: o; }7 X7 r. S
可得到是明显必要的,因为你无法使用不存在的备份介质。不太明显的是要在将来还能得到这种介质,并且能在其他计算机上使用。否则灾害之后,你可能无法恢复你的备份。
, O3 o) T& e! n8 l
% K' w# U0 d5 ^. Q* Q9 R! }( G 可用性是决定备份
周期的主要因素。备份越容易使用越好。备份介质不能难以使用。
+ d( [1 n# h$ z7 A* I. P
2 ]5 I" I1 v2 t
一般用软盘和磁带。软盘很便宜,还算可靠,不太快,很容易得到,但数据量大时不容易使用。磁带也很便宜,还算可靠,还算快,很容易得到,而且,依赖于磁带的容量,使用很轻松。
6 C4 n3 N5 P# j+ \9 L7 M2 p
6 K! E9 L* o% t0 D; W: K9 V 还有其他选择。但通常可得性不好,但如果这不成问题,有时也不错。例如,磁光盘同时具有软盘(随机存取,可以快速地恢复单个文件)和磁带(大容量)的优点.
3 C3 L0 b. K* W) K7 z5 j
选择备份工具
* B" b: e4 b; _
; W2 M( t9 O B9 Q9 S# C 备份有很多工具,传统的UNIX备份工具是tar、cpio和dump。另外,还可以使用大量第三方软件包(包括freeware和商业版)。备份介质的选择可能影响工具的选择。
+ o: k W9 U% m2 O9 J8 p
# R( _( g1 ?' J! n; F
tar和cpio
类似,从备份来看二者基本等效。都能将文件存到磁带并取出文件。都能使用几乎所有介质,因为核心设备
驱动处理低级设备操作,对用户级程序看来所有设备都差不多。有写
Unix版本的tar和cpio对不是普通文件可能有问题(符号连接、设备文件、极长路径名的文件等等),但Linux的能正确处理所有文件。
. F0 d: K" \6 a6 ~' Y
1 ~& w4 f8 r" T3 P9 h dump不同,它直接读文件
系统,而不通过文件系统。Itisalsowrittenspecificallyforbackups;tar和cpioarereallyforarchivingfiles,althoughtheyworkforbackupsaswell.
/ ^* J' G0 D/ i3 ^( |' c: s# y; m
! D6 N, M6 `# e9 ?- { 直接读文件系统有些优点,它可能不考虑timestamps备份所有文件;对于tar和cpio,必须先将文件系统只读安装。直接读文件系统更有效,如果所有东西都要备份,因为它使磁头移动最少。它的主要缺点是每个文件系统种类需要特定的备份程序,Linux的dump程序只理解ext2文件系统。
5 \) y G7 c9 O4 j9 Q( u+ |$ a/ N, r3 ~# e9 e* ]
dump也直接支持备份级(下面讨论);对tar和cpio,这必须用其他工具实现。
: L: q% P& }) E% ]& l8 n) k2 E: z" c( O# ?7 y, C" r
第三方备份工具的比较超出了本书的范围。LinuxSoftwareMap列出了许多freeware的。
. N8 k9 F6 a% L1 F" N( P: x, n% b+ s" D* g# F
简单备份
9 F6 d6 f8 h& S ^7 Y
) o0 L4 Y2 M" ~& H, q- m 一个简单的备份
方案是一次备份所有东西,然后备份上次备份后改变的所有东西。第一个备份叫全备份fullbackup,后来的叫i增量备份ncrementalbackups。全备份比增量备份费时费力,因为有更多的东西写到磁带,而且全备份可能不能放如一盘磁带中(更别说软盘了)。回存增量备份比全备份可能要花更多的时间。备份可以这样优化,就是自上次全备份以后,总用增量备份保存所有改过的文件。这样,备份可能需要多一些的工作,但你只需回存一个全备份和一个增量备份。
# C, B; W: L6 ?$ f1 B( R; `) F# C3 `9 S/ a5 p
如果有6盘磁带想每天备份,可以用磁带1做第一个全备份(比如在星期五),用磁带2-5做增量备份(周一到周四)。然后用磁带6做新的全备份(第二个周五),然后再用磁带2-5做增量备份。在做完新的全备份之前不要覆盖旧的全备份(磁带1),一面在做全备份的时候出现问题。有了新的全备份磁带6以后,最好在另一个地方保存磁带1,这样如果有一个全备份磁带在火灾中损失了,还能有一个。当再做下一个全备份是,再用磁带1而保存磁带6。
/ V/ f9 {, ^5 v, Y, D
. f3 T& _7 B* m, H6 h5 M+ z0 x 如果你有多于6盘磁带,可以用多的做全备份。每次做全备份,应该使用最老的磁带。这样你会有最近几周的全备份,对你如果想找到一个现在已经删除的就文件,或一个文件的旧版本很有用。
4 V) w4 X9 ~" B$ ~
n3 f+ p* e! y8 N J! w/ t
用tar备份
$ |/ m9 Q$ @3 f9 P" X' X1 a0 D" E/ Z6 Y( H' N1 `
一个全备份可以很容易地用tar实现:
7 {5 n6 H; ~6 ]) V! b
3 h2 m1 h3 F$ G. Y #tar-create-file/dev/ftape/usr/src
7 O5 s( w4 i& l3 w" J5 v4 n tar:Removingleading/fromabsolutepathnamesinthearchive
9 v7 h& C% E h+ A1 E
#
( _! Q. v% b1 `$ d: k5 k. A1 {1 o& w6 m$ ]- G, y
上面的例子使用GNU版本的tar及其长选项名。传统版本的tar只理解单字符选项。GNU版还能处理一盘磁带或一张
磁盘不能容纳的备份,及很长的路径名;这不是所有传统的版本能作到的。(Linux只使用GNUtar。)
4 w/ Y( q% J# O' u, {9 G$ g. B( C
/ x* E7 A' b3 C( Z5 W, o
如果你的备份一盘磁带不能容纳,你需要使用-multi-volume(-M)选项:
# T) ~4 l% W+ Q4 Q! o% x/ m; k' ~$ e) o* Y1 P
#tar-cMf/dev/fd0H1440/usr/src
$ k; c1 c5 q K$ z" o# U' f2 g; U tar:Removingleading/fromabsolutepathnamesinthearchive
. ?2 p$ y9 V v% W/ X$ W Preparevolume#2for/dev/fd0H1440andhitreturn:
% f! [# y0 i5 B7 S% ~8 I
#
2 P9 u* v5 w! I. S/ g: ~
: a7 K1 Q5 a u; J1 `2 J: @$ F 注意开始备份前要格式化所有软盘,或在tar需要新软盘时用另一个虚拟控制台或虚拟终端格式化它。
6 |1 W0 I5 Z4 e; Y- ~* E) d# o 备份完后,应该检查它是否完好,用-compare(-d)选项:
- Y8 {+ o$ R0 u/ T9 H
8 E+ v1 X8 y6 k, F9 W5 P& z. f #tar-compare-verbose-f/dev/ftape
* U% ?& d& S0 x$ c1 |5 X( S* D usr/src/
7 ]4 R6 q- j: N( F) l, d( c+ F+ { usr/src/Linux
9 _2 ?, A5 W$ b+ A* X* ]3 ]: z: N usr/src/linux-1.2.10-includes/
1 U5 V! C9 S0 }: F) l ....
# n' \. t% T3 s- o& _, m2 t6 H7 U #
; L% e+ o/ s% g: ~
' D U0 C% v f4 [* b 失败的备份检查意味着如果你丢失了原始数据,备份也无法恢复。
5 |1 v1 b5 S9 Z0 I0 T" m8 o2 t+ |
5 T1 z) {5 h1 X6 ]' X 增量备份可用带-newer(-N)选项的tar来实现:
, {8 w4 X5 [) J; x6 j
8 Q9 B: F+ A* X4 w" M #tar-create-newer'8Sep1995'-file/dev/ftape/usr/src-verbose
* m/ a5 _. e M+ j2 v2 a
tar:Removingleading/fromabsolutepathnamesinthearchive
- N: s# o* h- j V usr/src/
9 e# }, e Q4 Z; e! L" c$ x usr/src/linux-1.2.10-includes/
) \% H, h! f3 w, s5 c: G usr/src/linux-1.2.10-includes/include/
9 q) @; P: ~) \7 i" e usr/src/linux-1.2.10-includes/include/linux/
/ ]6 {( o9 N0 x
usr/src/linux-1.2.10-includes/include/linux/modules/
* S8 e0 s- b# d/ U. s usr/src/linux-1.2.10-includes/include/asm-generic/
* ]. o. P# A9 F& B
usr/src/linux-1.2.10-includes/include/asm-i386/
9 t& k: O. D1 D2 D: F F% i
usr/src/linux-1.2.10-includes/include/asm-mips/
$ i* t/ h) k7 Y0 B0 [' T
usr/src/linux-1.2.10-includes/include/asm-alpha/
0 V' Y1 `2 r, ], y$ }' p usr/src/linux-1.2.10-includes/include/asm-m68k/
3 e( V1 J2 J; u3 k, @9 O usr/src/linux-1.2.10-includes/include/asm-sparc/
3 Z3 \+ O+ A: K y' r$ r, o& d usr/src/patch-1.2.11.gz
& O8 ~/ i U" N( A5 E) N: Y
#
( G- ~- u6 M* g" e: M2 F+ }) t% T) z, ], [# q, [6 }
不幸的是,tar不能知道一个文件的i节点
信息变化,例如,文件的权限位变化,或文件名变化。这可用find命令和比较当前文件系统状态和先前备份的文件列表。用于此的Scripts和程序可以在Linux
FTP站点上找到。
" a: O: o! \' Q W% s4 M# d
4 O! U1 U( U( m0 M/ A2 ` 用tar回存
1 m! t! T* I* M
& h) c* I. _. w5 G
tar的-extract(-x)选项展开文件:
7 K" S1 ?# {1 u i9 {8 e- e R: V# q# }
#tar-extract-same-permissions-verbose-file/dev/fd0H1440
2 \9 m) i! v* d3 R) U usr/src/
2 D0 B& Q% u* v. o* b usr/src/linux
7 w- R3 B1 }( W( y3 S3 h O, A usr/src/linux-1.2.10-includes/
. ^" d, o" [& [$ x* B1 p) Z1 W5 e usr/src/linux-1.2.10-includes/include/
# x0 Y3 v( _) \. p0 j2 C, _ usr/src/linux-1.2.10-includes/include/linux/
, G6 o9 ?9 @+ y( F/ c usr/src/linux-1.2.10-includes/include/linux/hdreg.h
& E; M! K* I6 u usr/src/linux-1.2.10-includes/include/linux/kernel.h
1 e1 @9 E; N4 V4 b8 ?% e
...
F& j# N3 C' }# K' `& }7 c- ] #
" G3 B0 ]$ h ^1 Z; \2 w7 G/ X' x& X
) o0 x$ P6 R1 o$ w 也可以用命令行只展开特定的文件和目录(及其中的文件和子目录):
( A4 ~ }1 }) U+ ?* u
#tarxpvf/dev/fd0H1440usr/src/linux-1.2.10-includes/include/linux/hdreg.h
: d3 |" D# K8 y& j" k. e7 G3 b
usr/src/linux-1.2.10-includes/include/linux/hdreg.h
" t' ?1 m* z1 Z
#
0 x0 r( N: W! N4 p( T
用-list(-t)选项看一个备份卷中有什么文件:
7 R/ l" N" q$ O #tar-list-file/dev/fd0H1440
- H S Z% p- B usr/src/
& R, w* V+ |- r- |" _
usr/src/linux
$ ~8 M; x+ q0 s, ?, ]! r usr/src/linux-1.2.10-includes/
! p" A- W2 a5 k% C1 y, }1 w
usr/src/linux-1.2.10-includes/include/
+ N; Z' i( } B: y
usr/src/linux-1.2.10-includes/include/linux/
U V5 u6 y0 [2 } usr/src/linux-1.2.10-includes/include/linux/hdreg.h
( b5 u% s& N( M. \$ h0 d6 S
usr/src/linux-1.2.10-includes/include/linux/kernel.h
! `) l$ b9 R S9 f ...
; U! T; ^3 r3 u2 }) [% ~ T& k #
S2 L& R1 ~4 }1 r' l. ~- p 注意tar永远是顺序读一个备份卷,因此大的卷会很慢。使用磁带机或其他顺序介质时不可能使用随机存取数据库
技术。
! }/ r( \- @0 n% A8 @- x' l3 S tar不处理删除文件属性。如果你需要从一个全备份和一个增量备份恢复一个文件系统,并且2个备份之间你删除了一个文件,当你恢复完后,这个文件又存在了。如果这个文件包含应该删除的敏感数据,这是个大问题。
3 o3 H: E* U2 N- j8 ?4 o% L
" v0 X3 y2 F- T) ` 多级备份
# K% F9 o z7 E' M/ G% s j6 k$ m2 f
, C- ?; u' t, C' {3 ?
上面的章节概述了简单备份的方法,对个人使用或小的站点使用。对于多数重负荷的使用,多级备份更适用。
: G' X# H; e! S" z/ j1 m. {8 d: Y+ q; B7 x$ S7 ~. J& T
简单备份有2个备份级:全备份和增量备份。通常可以有任意数量的备份级。全备份是0级,不同级别的增量备份是1、2、3...级,每个增量备份级备份同一或上一级别的上次备份后改变的所有东西。
3 [9 M* N. I8 ]. G& o
: e1 G! g4 t& x9 J3 Z 这样多的目的是更便宜地允许更长的备份历史backuphistory。在前面的例子中,备份历史追溯到上一个全备份。可以增多磁带来扩展备份历史,但每个新磁带扩展一周,这样可能太贵。更长的备份历史是有用的,因为删除或损坏的文件可能长时间未被发现。即使不是一个文件的最新版本,也比没有好。
- I* d3 j0 @% {( H9 F Z
( n; a: j, g6 q, [$ n3 O 多级备份可以更便宜地扩展备份历史。例如,如果你有10盘磁带,可用磁带1和2做月备份(每月的第一个周五),磁带3-6做周备份(其他周五,因为每月最多可能有5个周五,因此需要4盘磁带),磁带7-10做日备份(周一到周四)。只增加了4盘磁带,就将2周的备份历史扩展到2个月。诚然,我们无法恢复这2个月中每个文件的所有版本,但这样恢复的经常是足够好了。
& d) T$ a2 V( U8 p
( }1 M2 F/ Z+ I% { r+ J1 W4 m 备份级可使文件系统恢复用最少的时间。如果你有许多只是单调增长级别数的增量备份,要恢复整个文件系统,你需要回存所有备份。而如果级别数不是单调增长,可以减少备份和回存的数目。
: ~9 e( J4 j# Q8 n# Y7 y' G$ Z" z' n4 Y: i" G
为了将回存需要的磁带数据减至最小,可以用小的级别做每个增量磁带。然而,这样做每个增量备份的时间会增加(每个备份拷贝了上次全备份后改变的所有东西)。一个好的方案建议在dumpman页中给出,并在表9.2中说明。Usethefollowingsuccessionofbackuplevels:3,2,5,4,7,6,9,8,9...这使备份和回存所用的时间保持较少。Themostyouhavetobackupistwoday'sworthofwork.恢复所需磁带数有赖于全备份的间隔,但它比简单的方案少。
( b3 `9 S7 }5 o u- }, o
2 q7 s* z. i$ z' P* G* B R7 I 一个好的方案降低了工作量,并能追寻更多的东西。Youmustdecideifitisworthit.
) E3 R/ a, g; L! S3 f0 N
; m% T' T! L* L7 |& F* l dump对备份级有内置的支持。而tar和cpio则必须用
shellscripts实现。
; f3 C* E+ V9 O+ [
; D+ F- S. c$ f5 J1 f' e7 u3 ^; R
备份什么?
. {3 k8 `% [* u3 s! q3 y
+ T0 Z, u& ]; R* n' N 你可能想尽多备份。主要的例外是容易重安装的软件,但即使是它们,也有配置文件,对备份很重要,以免对这些软件全部重新配置。另一个主要的例外是/proc文件系统,因为他们只包含通常由核心自动产生的数据,备份它们绝不是个好主意。特别是/proc/kcore文件更是不必要,因为它只是你当前物理
内存的映象,而且很大。
! ], A4 u5 K9 s4 i7 C l- b: o" K- \. j
9 o% J1 E& \) L, v& @, L H+ v
Grayareasincludethenewsspool,logfiles,andmanyotherthingsin/var.你必须决定重点考虑什么。
; B& `' v7 O I5 c) b( I9 L2 L! M3 M
, _) B* `" Q1 I8 ]. s
备份最明显的是用户文件(/home)和系统配置文件(/etc,但还可能有散落在文件系统其他地方的其他东西。
$ Q0 V# C4 x2 k, ~. K! g! Z. ?6 f. j6 e( c- t5 p' W2 t! W8 W' O
压缩备份
! Q$ j+ G) I) c6 n+ S# o! o
7 E1 G% c# L0 a% e! H& W# [
备份占用大量
空间,要花费大量金钱。为了降低空间
需求,备份可以压缩。有几种方法。有些程序内置支持压缩。例如GNUtar的-gzip(-z)选项,通过管道(pipe),在写到备份介质前,先用gzip压缩程序压缩。
5 Q& `2 W) _2 N4 o2 J3 V9 L
, q! b! q B7 T2 X
不幸的是,压缩备份可能导致问题。由于压缩工作的原理,如果一个bit错误,可能导致所有其他压缩数据不可用。有些备份程序内置错误校正,但没有办法处理大量的错误。就是说,如果用GNUtar压缩备份,一个单独的错误回导致整个备份丢失。备份必须可靠,这样的压缩方法不好。
2 v& z8 C0 w% {% ?
% _# S+ }* C: k/ }- w7 G' F. W: K
还有一个方法是单独压缩每个文件,这也回导致一个文件的丢失,但不会影响其他文件。丢失的文件可能已经因为什么原因损坏,因此这种情况比不使用压缩差不了多少。afio程序(cpio的一个变种)可以这样。
: R5 [0 c& z/ x' X
4 E* `/ ?1 I- i" U6 H3 }5 }) \& E0 B 压缩需要时间,whichmaymakethebackupprogramunabletowritedatafastenoughforatapedrive.这可以靠输出缓冲来避免(如果备份程序足够智能,可以内置,否则可以通过其他程序),buteventhatmightnotworkwellenough.这只会在慢的计算机上是个问题。