Chinaunix首页 | 论坛 | 博客
  • 博客访问: 203222
  • 博文数量: 124
  • 博客积分: 7051
  • 博客等级: 少将
  • 技术积分: 1425
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-20 13:21
文章分类

全部博文(124)

文章存档

2008年(124)

我的朋友

分类: LINUX

2008-05-01 14:07:34

    硬件不肯定是可靠的
软件肯定是不可靠的
人不肯定是不可靠的
而自然肯定是可靠的

本张说明为什么、如何、何时要做备份,及如何回存备份的东西。

备份的重要

  数据是有价值的。重新产生它需要你花费时间和努力,并且要花费金钱或至少伤心和眼泪,有时甚至不可能重新产生,例如一些实验结果。由于数据是一种投资,你必须保护它,并采取措施避免丢失。

  丢失数据一般有4个原因:硬件失败、软件曲线、人为因素或自然灾害。 虽然现代硬件已经相当可靠,但仍可能自然损坏。存储数据最决定性的硬件是硬盘,它依赖微小的磁区在充满电噪声的世界上保存数据。现代软件依然不可靠,一个 真正可靠的程序是理想、罕见的,而不是规律。人更不可靠,他们很容易犯错误,甚至为某种目的恶意地破坏数据。自然可能不是邪恶的,但也可能造成破坏。一切 的一切,希望什么都正常、完美几乎是不可能的。

  备份是保护数据投资的方法。有数据的多个拷贝,就不怕某个损坏(所需做的仅仅是从备份中恢复丢失的数据)。

  正确的备份是很重要的。正如物理世界中任何东西都与其他相关,备份也迟早会失效。好的备份确保有效,你不希望你的备份无效。 如果你的备份又坏了,这将雪上加霜,如果你只有一个备份,它可能根本是坏的,只留下你和硬盘中冒烟的灰烬。 或者当你恢复时,发现忘了备份一些重要的东西,比如15000个用户站点的用户数据库。 Best of all, all your backups might be working perfectly, but the last known tape drive reading the kind of tapes you used was the one that now has a bucketful of water in it.

  When it comes to backups, paranoia is in the job description.

选择备份介质

  备份所需的最重要的决定是选择备份介质。需要考虑成本、可靠性、速度、可得到、可用性。

  成本是很重要的,因为你的数据可能需要多个存储、多个备份。便宜的介质可以用很多。

  可靠性是最重要的,因为坏的备份会雪上加霜。备份介质必须能存储数据多年而不损坏。作为备份介质,使用方法影响可靠性。硬盘一般是很可靠的,但作为备份介质并非很可靠,如果它和备份源在同一计算机里的话。

  速度通常不太重要,如果备份可以非交互地完成。备份花2个小时无所谓,无须监督,多长时间都没有关系。另一方面,if the backup can’t be done when the computer would otherwise be idle, 那么速度也是个问题。

  可得到是明显必要的,因为你无法使用不存在的备份介质。不太明显的是要在将来还能得到这种介质,并且能在其他计算机上使用。否则灾害之后,你可能无法恢复你的备份。

  可用性是决定备份周期的主要因素。备份越容易使用越好。备份介质不能难以使用。

  一般用软盘和磁带。软盘很便宜,还算可靠,不太快,很容易得到,但数据量大时不容易使用。磁带也很便宜,还算可靠,还算快,很容易得到,而且,依赖于磁带的容量,使用很轻松。

  还有其他选择。但通常可得性不好,但如果这不成问题,有时也不错。例如,磁光盘同时具有软盘(随机存取,可以快速地恢复单个文件)和磁带(大容量)的优点.
选择备份工具

  备份有很多工具,传统的UNIX备份工具是tar 、 cpio 和dump 。另外,还可以使用大量第三方软件包(包括freeware和商业版)。备份介质的选择可能影响工具的选择。

  tar 和cpio 类似,从备份来看二者基本等效。都能将文件存到磁带并取出文件。都能使用几乎所有介质,因为核心设备驱动处理低级设备操作,对用户级程序看来所有设备都差 不多。有写Unix版本的tar 和cpio 对不是普通文件可能有问题(符号连接、设备文件、极长路径名的文件等等),但Linux的能正确处理所有文件。

  dump 不同,它直接读文件系统,而不通过文件系统。 It is also written specifically for backups; tar 和cpio are really for archiving files, although they work for backups as well.

  直接读文件系统有些优点,它可能不考虑time stamps备份所有文件;对于tar 和cpio ,必须先将文件系统只读安装。直接读文件系统更有效,如果所有东西都要备份,因为它使磁头移动最少。它的主要缺点是每个文件系统种类需要特定的备份程序, Linux的dump 程序只理解ext2文件系统。

  dump 也直接支持备份级(下面讨论);对tar 和cpio ,这必须用其他工具实现。

  第三方备份工具的比较超出了本书的范围。Linux Software Map列出了许多freeware的。

简单备份

  一个简单的备份方案是一次备份所有东西,然后备份上次备份后改变的所有东西。第一个备份叫全备份full backup,后来的叫i增量备份ncremental backups。全备份比增量备份费时费力,因为有更多的东西写到磁带,而且全备份可能不能放如一盘磁带中(更别说软盘了)。回存增量备份比全备份可能要 花更多的时间。备份可以这样优化,就是自上次全备份以后,总用增量备份保存所有改过的文件。这样,备份可能需要多一些的工作,但你只需回存一个全备份和一 个增量备份。

  如果有6盘磁带想每天备份,可以用磁带1做第一个全备份(比如在星期五),用磁带2-5做增量备份(周一到周四)。然后用磁带6做新的全备份(第二个 周五),然后再用磁带2-5做增量备份。在做完新的全备份之前不要覆盖旧的全备份(磁带1),一面在做全备份的时候出现问题。有了新的全备份磁带6以后, 最好在另一个地方保存磁带1,这样如果有一个全备份磁带在火灾中损失了,还能有一个。当再做下一个全备份是,再用磁带1而保存磁带6。

  如果你有多于6盘磁带,可以用多的做全备份。每次做全备份,应该使用最老的磁带。这样你会有最近几周的全备份,对你如果想找到一个现在已经删除的就文件,或一个文件的旧版本很有用。

用tar备份

  一个全备份可以很容易地用tar 实现:

# tar -create -file /dev/ftape /usr/src
tar: Removing leading / from absolute path names in the archive
#

  上面的例子使用GNU版本的tar 及其长选项名。传统版本的tar 只理解单字符选项。 GNU版还能处理一盘磁带或一张磁盘不能容纳的备份,及很长的路径名;这不是所有传统的版本能作到的。 (Linux只使用GNU tar 。)

  如果你的备份一盘磁带不能容纳,你需要使用-multi-volume (-M)选项:

# tar -cMf /dev/fd0H1440 /usr/src
tar: Removing leading / from absolute path names in the archive
Prepare volume #2 for /dev/fd0H1440 and hit return:
#

  注意开始备份前要格式化所有软盘,或在tar 需要新软盘时用另一个虚拟控制台或虚拟终端格式化它。
备份完后,应该检查它是否完好,用-compare (-d)选项:

# tar -compare -verbose -f /dev/ftape
usr/src/
usr/src/linux
usr/src/linux-1.2.10-includes/
....
#

  失败的备份检查意味着如果你丢失了原始数据,备份也无法恢复。

  增量备份可用带-newer (-N)选项的tar 来实现:

# tar -create -newer ’8 Sep 1995’ -file /dev/ftape /usr/src -verbose
tar: Removing leading / from absolute path names in the archive
usr/src/
usr/src/linux-1.2.10-includes/
usr/src/linux-1.2.10-includes/include/
usr/src/linux-1.2.10-includes/include/linux/
usr/src/linux-1.2.10-includes/include/linux/modules/
usr/src/linux-1.2.10-includes/include/asm-generic/
usr/src/linux-1.2.10-includes/include/asm-i386/
usr/src/linux-1.2.10-includes/include/asm-mips/
usr/src/linux-1.2.10-includes/include/asm-alpha/
usr/src/linux-1.2.10-includes/include/asm-m68k/
usr/src/linux-1.2.10-includes/include/asm-sparc/
usr/src/patch-1.2.11.gz
#

  不幸的是,tar 不能知道一个文件的i节点信息变化,例如,文件的权限位变化,或文件名变化。这可用find 命令和比较当前文件系统状态和先前备份的文件列表。用于此的Scripts和程序可以在Linux FTP站点上找到。

用tar回存

  tar 的-extract (-x)选项展开文件:

# tar -extract -same-permissions -verbose -file /dev/fd0H1440
usr/src/
usr/src/linux
usr/src/linux-1.2.10-includes/
usr/src/linux-1.2.10-includes/include/
usr/src/linux-1.2.10-includes/include/linux/
usr/src/linux-1.2.10-includes/include/linux/hdreg.h
usr/src/linux-1.2.10-includes/include/linux/kernel.h
...
#

  也可以用命令行只展开特定的文件和目录(及其中的文件和子目录):
# tar xpvf /dev/fd0H1440 usr/src/linux-1.2.10-includes/include/linux/hdreg.h
usr/src/linux-1.2.10-includes/include/linux/hdreg.h
#
用-list (-t)选项看一个备份卷中有什么文件:
# tar -list -file /dev/fd0H1440
usr/src/
usr/src/linux
usr/src/linux-1.2.10-includes/
usr/src/linux-1.2.10-includes/include/
usr/src/linux-1.2.10-includes/include/linux/
usr/src/linux-1.2.10-includes/include/linux/hdreg.h
usr/src/linux-1.2.10-includes/include/linux/kernel.h
...
#
  注意tar 永远是顺序读一个备份卷,因此大的卷会很慢。使用磁带机或其他顺序介质时不可能使用随机存取数据库技术。
tar 不处理删除文件属性。如果你需要从一个全备份和一个增量备份恢复一个文件系统,并且2个备份之间你删除了一个文件,当你恢复完后,这个文件又存在了。如果这个文件包含应该删除的敏感数据,这是个大问题。

多级备份

  上面的章节概述了简单备份的方法,对个人使用或小的站点使用。对于多数重负荷的使用,多级备份更适用。

  简单备份有2个备份级:全备份和增量备份。通常可以有任意数量的备份级。全备份是0级,不同级别的增量备份是1、2、3...级,每个增量备份级备份同一或上一级别的上次备份后改变的所有东西。

  这样多的目的是更便宜地允许更长的备份历史backup history。在前面的例子中,备份历史追溯到上一个全备份。可以增多磁带来扩展备份历史,但每个新磁带扩展一周,这样可能太贵。更长的备份历史是有用 的,因为删除或损坏的文件可能长时间未被发现。即使不是一个文件的最新版本,也比没有好。

  多级备份可以更便宜地扩展备份历史。例如,如果你有10盘磁带,可用磁带1和2做月备份(每月的第一个周五),磁带3-6做周备份(其他周五,因为每 月最多可能有5个周五,因此需要4盘磁带),磁带7-10做日备份(周一到周四)。只增加了4盘磁带,就将2周的备份历史扩展到2个月。诚然,我们无法恢 复这2个月中每个文件的所有版本,但这样恢复的经常是足够好了。

  备份级可使文件系统恢复用最少的时间。如果你有许多只是单调增长级别数的增量备份,要恢复整个文件系统,你需要回存所有备份。而如果级别数不是单调增长,可以减少备份和回存的数目。

  为了将回存需要的磁带数据减至最小,可以用小的级别做每个增量磁带。然而,这样做每个增量备份的时间会增加(每个备份拷贝了上次全备份后改变的所有东 西)。一个好的方案建议在dump man页中给出,并在表 9.2中说明。 Use the following succession of backup levels: 3, 2, 5, 4, 7, 6, 9, 8, 9... 这使备份和回存所用的时间保持较少。 The most you have to backup is two day’s worth of work. 恢复所需磁带数有赖于全备份的间隔,但它比简单的方案少。

  一个好的方案降低了工作量,并能追寻更多的东西。You must decide if it is worth it.

  dump 对备份级有内置的支持。而tar 和cpio 则必须用shell scripts实现。

备份什么?

  你可能想尽多备份。主要的例外是容易重安装的软件, 但即使是它们,也有配置文件,对备份很重要,以免对这些软件全部重新配置。另一个主要的例外是/proc 文件系统,因为他们只包含通常由核心自动产生的数据,备份它们绝不是个好主意。特别是/proc/kcore 文件更是不必要,因为它只是你当前物理内存的映象,而且很大。

  Gray areas include the news spool, log files, and many other things in /var . 你必须决定重点考虑什么。

  备份最明显的是用户文件(/home )和系统配置文件(/etc ,但还可能有散落在文件系统其他地方的其他东西。

压缩备份

  备份占用大量空间,要花费大量金钱。为了降低空间需求,备份可以压缩。有几种方法。有些程序内置支持压缩。例如GNU tar 的-gzip (-z)选项,通过管道(pipe),在写到备份介质前,先用 gzip 压缩程序压缩。

  不幸的是,压缩备份可能导致问题。由于压缩工作的原理,如果一个bit错误,可能导致所有其他压缩数据不可用。有些备份程序内置错误校正,但没有办法 处理大量的错误。就是说,如果用GNU tar 压缩备份,一个单独的错误回导致整个备份丢失。备份必须可靠,这样的压缩方法不好。

  还有一个方法是单独压缩每个文件,这也回导致一个文件的丢失,但不会影响其他文件。丢失的文件可能已经因为什么原因损坏,因此这种情况比不使用压缩差不了多少。 afio 程序(cpio 的一个变种)可以这样。

  压缩需要时间,which may make the backup program unable to write data fast enough for a tape drive. 这可以靠输出缓冲来避免(如果备份程序足够智能,可以内置,否则可以通过其他程序), but even that might not work well enough. 这只会在慢的计算机上是个问题。

Linux 管理员手册(9)--Keeping Time

  本章说明Linux系统如何keeps time,及需要做什么来避免发生问题。通常,你无须对时间做什么,但理解它会更好。

时区

  时间测量基于最规则的自然现象,如地球转动导致的昼夜更替。昼夜总时间是恒定的,但昼夜分别的长度是变化的。一个简单的常数是正午。

  正午是白天太阳在最高点的时间。由于地球是圆的, 不同地方正午发生在不同的时间。这引出了本地时local time的概念。

硬件时钟和软件时钟

  个人计算机有一个电池驱动的硬件时钟。电池保证始终在计算机没电的时候依然能工作。硬件始终能从BIOS设置屏或操作系统的别的地方进行设置。

  Linux核心独立于硬件始终跟踪时间。启动时,Linux根据硬件时钟设置自己的时钟。此后,2个始终相互独立运行。因为查看硬件始终慢而复杂,因此Linux管理自己的时钟。

  核心始终一直显示通用时间。这样,核心无须知道时区,高可靠的简单结果使更新时区信息更简单。每个进程自己处理时区转换(使用时区包部分里的标准工具)。

  硬件始终可以是本地时间或通用时间。通常用通用时间更好,因为这样你无须在夏时制开始或结束时改变硬件时钟 (UTC does not have DST)。不幸的是,有些PC操作系统,包括MSDOS、Windows、OS/2都假设硬件时钟是本地时间。 Linux可处理2种方式,但如果硬件时钟显示本地时间,那么必须在夏时制开始或结束时(否则就不能显示本地时间)。

显示和设置时钟

  在Debian系统中,系统时区由符号连接/etc/localtime 决定。连接指向描述本地时区的时区数据文件。时区数据文件存在/usr/lib/zoneinfo 中。其他Linux distributions可能不同。

  用户可以用设置TZ环境变量来改变他的私人时区。如果不设置,就假定是系统时区。 TZ变量的语法在tzset (3)man页中说明。

  date 命令显示当前日期和时间。 例如:

$ date
Sun Jul 14 21:53:41 EET DST 1996
$
That time is Sunday, 14th of July, 1996, at about ten before ten at the evening, in the time zone called ``EET DST’’ (which might be East European Daylight Savings Time). date 也可用于显示通用时间:
$ date -u
Sun Jul 14 18:53:42 UTC 1996
$
date 也可用于设置核心的软件始终:
# date 07142157
Sun Jul 14 21:57:00 EET DST 1996
# date
Sun Jul 14 21:57:02 EET DST 1996
#

  更详细的见date man页--syntax is a bit arcane. 只有root能设置时间。虽然每个用户可以有自己的时区,但时钟对每个人都是一样的。

'; tpl += '
'; tpl += '
'; tpl += '
'; tpl += ''; tpl += '
'; tpl += '
'; tpl += '
'; $('.z_move_comment').html(''); $(this).parents('.Blog_right1_8').find('.z_move_comment').html(tpl).show(); }); //引用的评论提交 $('#quota_sbumit').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var tid = $(this).attr('tid');//被引用人的id var qid = $(this).attr('cid');//引用的id var url = $(this).attr('url'); var text = $('#rmsg').val(); var tname = $(this).attr('tname'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : tid , 'qid' : qid , 'text': text , 'tname' : tname }, dataType: 'json', success: function(data){ if(data.code == 1){ var tpl = '
'; tpl+= ''; tpl+= '
'; tpl+= '

' + data.info.username + '' + data.info.dateline + '

'; tpl+= '

' + data.info.quota.username + ':'+ data.info.quota.content + '

'; tpl+= '

' + data.info.content + '

回复 |  删除 |  举报
'; tpl+= ''; tpl+= '
'; $('#replyList .Blog_right1_8:first').before(tpl); $('.z_move_comment').html('').hide(); } else if(data.code == -1){ //showErrorMsg(data.info , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); } }, error: function(){//请求出错处理 } }); }); //底部发表评论 $('#submitmsg').click(function(){ if(allowComment == 1) { showErrorMsg('该博文不允许评论' , '消息提示'); return false; } var bid = $(this).attr('bid'); var toid = $(this).attr('toid'); var text = $('#reply').val(); var url = $(this).attr('url'); if(text == '' || text=='文明上网,理性发言...') { showErrorMsg('评论内容不能为空!' , '消息提示'); return false; } else { if(mb_strlen(text) > 1000){ showErrorMsg('评论内容不能超过500个汉字' , '消息提示'); return false; } } $.ajax({ type: "post", url: url , data: {'bid': bid , 'to' : toid ,'text': text}, dataType: 'json', success: function(data){ if(data.code == 1) { var tpl = '
'; tpl += ''; tpl += '
'; tpl += '

' + data.info.username + '' + data.info.dateline + '

'; tpl += '

' + data.info.content + '

'; tpl += '
回复 |  删除 |  举报
'; tpl += ''; tpl += '
'; $('.Blog_tit3:first').after(tpl); $('#reply').val('文明上网,理性发言...'); } else if(data.code == -1) { showErrorMsg(data.info , '消息提示'); } }, error: function(){//请求出错处理 } }); }); //底部评论重置 $('#reset_comment').click(function(){ $('#reply').val('文明上网,理性发言...'); }); //取消回复 $('#qx_comment').live('click' , function(){ $('.z_move_comment').html('').hide(); }); $('#rmsg, #reply').live({ focus:function(){ if($(this).val() == '文明上网,理性发言...'){ $(this).val(''); } }, blur:function(){ if($(this).val() == ''){ $(this).val('文明上网,理性发言...'); } } }); //删除留言确认 $('.comment_del_mark').live('click' , function(){ var url = $(this).attr('url'); asyncbox.confirm('删除留言','确认', function(action){ if(action == 'ok') { location.href = url; } }); }); //删除时间确认 $('.del_article_id').click(function(){ var delurl = $(this).attr('delurl'); asyncbox.confirm('删除文章','确认', function(action){ if(action == 'ok') { location.href = delurl; } }); }); /* //字数限制 $('#rmsg, #reply').live('keyup', function(){ var id = $(this).attr('id'); var left = Util.calWbText($(this).val(), 500); var eid = '#errmsg'; if(id == 'reply') eid = '#rerrmsg'; if (left >= 0) $(eid).html('您还可以输入' + left + '字'); else $(eid).html('您已超出' + Math.abs(left) + ''); }); */ //加载表情 $('#face').qqFace({id : 'facebox1', assign : 'reply', path : '/image/qqface/'}); $('#mface').qqFace({id : 'facebox', assign : 'rmsg', path:'/image/qqface/'}); /* $('#class_one_id').change(function(){ alert(123213); var id = parseInt($(this).val() , 10); if(id == 0) return false; $('.hidden_son_class span').each(function( index , dom ){ if( dom.attr('cid') == id ) { } }); }); */ //转载文章 var turn_url = "/blog/viewClassPart.html"; $('#repost_bar').click(function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var id = $(this).attr('bid'); asyncbox.open({ id : 'turn_class_thickbox', url : turn_url, title : '转载文章', width : 330, height : 131, scroll : 'no', data : { 'id' : id }, callback : function(action){ if(action == 'close'){ $.cover(false); } } }); }); /* //转发文章 $('#repost_bar').live('click' , function(){ if(isOnLine == '' ) { //showErrorMsg('登录之后才能进行此操作' , '消息提示'); showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); return false; } var bid = $(this).attr('bid'); var url = $(this).attr('url'); asyncbox.confirm('转载文章','确认', function(action){ if(action == 'ok'){ $.ajax({ type:"POST", url:url, data: { 'bid' : bid }, dataType: 'json', success:function(msg){ if(msg.error == 0){ showSucceedMsg('转发成功!', '消息提示'); }else if(msg.error == 1){ //location.href = '/index.php?r=site/login'; showErrorMsg('操作失败,您需要先登录!', '消息提示', 'http://account.chinaunix.net/login'); }else{ showErrorMsg(msg.error_content, '消息提示'); } } }); } }); }); */ });