第二十五章、 Linux 备份策略

最近升级日期:2009/09/18
万一不幸你的 Linux 被黑客入侵了、或是你的 Linux 系统由於硬件关系 (不论是天灾还是人祸) 而挂掉了!这个时候,请问如何快速的回复你的系统呢?呵呵!当然罗,如果有备份数据的话, 那么回复系统所花费的时间与成本将降低相当的多!平时最好就养成备份的习惯, 以免突然间的系统损毁造成手足无措!此外,哪些文件最需要备份呢?又,备份是需要完整的备份还是仅备份重要数据即可? 嗯!确实需要考虑看看呦!


备份要点


备份是个很重要的工作,很多人总是在系统损毁的时候才在哀嚎说:『我的数据啊!天那...!』此时才会发现备份数据的可爱! 但是备份其实也非常可怕!因为你的重要数据都在备份档里面,如果这个备份被窃取或遗失,其实对你的系统资安影响也非常大! 同时,备份使用的媒体选择也非常多样,但是各种储存媒体各有其功能与优劣,所以当然得要选择罗!闲话少说,来谈谈备份吧!


备份数据的考量


老实说,备份是系统损毁时等待救援的救星!因为你需要重新安装系统时, 备份的好坏会影响到你系统复原的进度!不过,我们想先知道的是,系统为什么会损毁啊?是人为的还是怎样产生的啊? 事实上,系统有可能由於不预期的伤害而导致系统发生错误! 什么是不预期的伤害呢?这是由於系统可能因为不预期的硬件损坏,例如硬盘坏掉等等,或者是软件问题导致系统出错, 包括人为的操作不当或是其他不明因素等等所致。底下我们就来谈谈系统损坏的情况与为何需要备份吧!


  • 造成系统损毁的问题-硬件问题

基本上,『计算机是一个相当不可靠的机器』这句话在大部分的时间内还是成立的! 常常会听到说『要计算机正常的工作,最重要的是要去拜拜!』嘿嘿!不要笑!这还是真的哩! 尤其是在日前一些计算机周边硬件的生产良率 (就是将硬件产生出来之后,经过测试, 发现可正常工作的与不能正常工作的硬件总数之比值) 越来越差的情况之下,计算机的不稳定状态实在是越来越严重了!

举个例子来说,鸟哥曾经同时买过同一厂牌的 30GB 硬盘三颗,回来之后经过一个星期,嘿嘿!挂掉了两颗! 其中一颗是有坏轨,另外一颗是『完全死掉』,拿去公司要求修理,结果呢?嗯!店家直接拿了一颗新的给我, 害我吓一跳,店家的工程师说『唉呀!目前这个牌子的良率太差了,所以代理商为了怕麻烦,都会直接拿新的替换给我们啦!』 要晓得的是,当初那一颗完全死掉的硬盘,是我用来备份我的主机数据的.... 好在当时我将备份的数据放在三四个地方,还好...

一般来说,会造成系统损毁的硬件组件应该要算硬盘吧!因为其他的组件坏掉时,虽然会影响到系统的运行, 不过至少我们的数据还是存在硬盘当中的啊!为了避免这个困扰,於是乎有可备份用的 RAID1, RAID5 等磁盘阵列的应用啊!但是如果是 RAID 控制芯片坏掉呢?这就麻烦了~所以说,如果有 RAID 系统时, 鸟哥个人还是觉得需要进行额外的备份才好的!如果数据够重要的话。


  • 造成系统损毁的问题-软件问题

根据分析,其实系统的软件伤害最严重的就属使用者的操作不当啦!像最近这几天才在鸟园讨论区发现, 有网友手滑了一下,结果在命令列输入了『 rm -rf /home 』,这造成什么后果?就造成使用者家目录被删光光~ 因为当时下达命令的身份是 root 啊~会欲哭无泪喔!为了避免这方面的『手滑』问题,备份是重要的!

软件伤害除了来自主机上的使用者操作不当之外,最常见的可能是资安攻击事件了。 假如你的 Linux 系统上面某些 Internet 的服务软件是最新的!这也意味著可能是『相对最安全的』, 但是,这个世界目前的闲人是相当多的,你不知道什么时候会有所谓的『黑客软件』被提供出来,万一你在 Internet 上面的服务程序被攻击,导致你的 Linux 系统全毁,这个时候怎么办?当然是要复原系统吧?

那如何复原被伤害的系统呢?『重新安装就好啦!』或许你会这么说, 但是,像鸟哥管理的几个网站的数据,尤其是 MySQL 数据库的数据,这些都是弥足珍贵的经验数据, 万一被损毁而救不回来的时候,不是很可惜吗?这个还好哩,万一你是某家银行的话, 那么数据的损毁可就不是能够等闲视之的!关系的可是数千甚至上万人的身家财产!这就是备份的重要性了! 他可以最起码的稍微保障我们的数据有另外一份 copy 的备援以达到『安全回复』的基本要求!


  • 主机角色不同,备份任务也不同

由於软硬件的问题都可能造成系统的损毁,所以备份当然就很重要啦!问题是,每一部主机都需要备份吗? 多久备份一次呢?要备份什么数据呢?

如果是针对个人桌上型计算机使用的数据,那么 Norton 的『 Ghost 』应该算是一套好到不行的备份大师了! 最主要是 Ghost 可以针对整个 partition 来进行备份,所以罗,我们可以将 Windows 系统当中的整个 C 或者是整个 D 槽完整的备份下来。甚至在还原方面也是非常的快速,而且操作简便! 另外,由於个人桌上型计算机所使用的数据量通常不大,所以当 ghost 完成之后,通常只要将数据烧录到光盘片当中,大约只要一至两片的光盘片也就绰绰有余罗! 那么将光盘片保存好,这就是最简易的数据备份模式罗! 此外,由於个人的数据变动性不大,所以数据的备份频率方面也不需要非常的频繁!

但是,万一你的主机有提供 Internet 方面的服务呢?又该如何备份啊?举个例子来说,像是我们 Study Area 团队的讨论局域网站 http://phorum.study-area.org 提供的是类似 BBS 的讨论文章, 虽然数据量不大,但是由於讨论区的文件是天天在添加的,每天都有相当多的资讯流入, 由於某些资讯都是属於重要的人物之留言,这个时候,我们能够让机器死掉吗?或者是能够一季三个月才备份一次吗? 这个备份频率需求的考量是非常重要的!

再提到 2002 年左右鸟哥的讨论区曾经挂点的问题,以及 2003 年初 Study-Area 讨论区挂点的问题,讨论区一旦挂点的话,该数据库内容如果损毁到无法救回来, 嘿嘿!要晓得讨论区可不是一个人的心血耶!有的时候 (像 Study-Area 讨论区) 是一群热心 Linux 的朋友们互相创建交流起来的数据流通网,如果死掉了,那么不是让这些热血青年的热情付之一炬了吗? 所以罗,创建备份的策略 (频率、媒体、方法等) 是相当的重要的。


  • 备份因素考量

由於计算机 (尤其是目前的计算机,操作频率太高、硬件良率太差、使用者操作习惯不良、 『某些』操作系统的死机率太高....) 的稳定性较差,所以罗!备份的工作就越来越重要了! 那么一般我们在备份时考虑的因素有哪些呢?

  • 备份哪些文件:
    哪些数据对系统或使用者来说是重要的?那些数据就是值得备份的数据!例如 /etc/* 及 /home/* 等。

  • 选择什么备份的媒介:
    是可读写光盘、另一颗硬盘、同一颗硬盘的不同 partition、还是使用网络备援系统? 哪一种的速度最快,最便宜,可将数据保存最久?这都可以考虑的。

  • 考虑备份的方式:
    是以完整备份(类似 ghost)来备份所有数据,还是使用差异备份仅备份有被更动过的数据即可?

  • 备份的频率:
    例如 MySQL 数据库是否天天备份、若完整备份,需要多久进行一次?

  • 备份使用的工具为何:
    是利用 tar 、 cpio 、 dd 还是 dump 等等的备份工具?

底下我们就来谈一谈这些问题的解决之道吧! ^_^


哪些 Linux 数据具有备份的意义

一般来说,鸟哥比较喜欢备份最重要的文件而已 (关键数据备份),而不是整个系统都备份起来 (完整备份, Full backup)!那么哪些文件是有必要备份的呢?具有备份意义的文件通常可以粗分为两大类,一类是系统基本配置资讯、一类则是类似网络服务的内容数据。 那么各有哪些文件需要备份的呢?我们就来稍微分析一下。


  • 操作系统本身需要备份的文件:

这方面的文件主要跟『帐号与系统配置档』有关系! 主要有哪些帐号的文件需要备份呢?就是 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /home 底下的使用者家目录等等, 而由於 Linux 默认的重要参数档都在 /etc/ 底下,所以只要将这个目录备份下来的话, 那么几乎所有的配置档都可以被保存的!

至於 /home 目录是一般用户的家目录,自然也需要来备份一番!再来,由於使用者会有邮件吧!所以呢,这个 /var/spool/mail/ 内容也需要备份呦!另外,由於如果你曾经自行更动过核心,那么 /boot 里头的资讯也就很重要罗!所以罗,这方面的数据你必须要备份的文件为:

  • /etc/ 整个目录
  • /home 整个目录
  • /var/spool/mail
  • /boot
  • /root
  • 如果你自行安装过其他的套件,那么 /usr/local/ 或 /opt 也最好备份一下!


  • 网络服务的数据库方面:

这部份的数据可就多而且复杂了,首先是这些网络服务软件的配置档部分, 如果你的网络软件安装都是以原厂提供的为主,那么你的配置文件大多是在 /etc 底下,所以这个就没啥大问题!但若你的套件大多来自於自行的安装,那么 /usr/local 这个目录可就相当的重要了!

再来,每种服务提供的数据都不相同,这些数据很多都是人们提供的!举例来说,你的 WWW 服务器总是需要有人提供网页文件吧?否则浏览器来是要看啥咚咚?你的讨论区总是得要写入数据库系统吧? 否则讨论的数据如何升级与记载?所以,使用者主动提供的文件,以及服务运行过程会产生的数据, 都需要被考虑来备份。若我们假设我们提供的服务软件都是使用原厂的 RPM 安装的!所以要备份的数据文件有:

  • 软件本身的配置文件,例如:/etc/ 整个目录,/usr/local/ 整个目录
  • 软件服务提供的数据,以 WWW 及 MySQL 为例:
    WWW 数据:/var/www 整个目录或 /srv/www 整个目录,及系统的使用者家目录
    MySQL : /var/lib/mysql 整个目录
  • 其他在 Linux 主机上面提供的服务之数据库文件!


  • 推荐需要备份的目录:

由上面的介绍来看的话,如果你的硬件或者是由於经费的关系而无法全部的数据都予以备份时, 鸟哥建议你至少需要备份这些目录呦!

  • /boot
  • /etc
  • /home
  • /root
  • /usr/local(或者是 /opt 及 /srv 等)
  • /var(注:这个目录当中有些缓存目录则可以不备份!)


  • 不需要备份的目录:

有些数据是不需要备份的啦!例如我们在第六章文件权限与目录配置里头提到的 /proc 这个目录是在记录目前系统上面正在跑的程序,这个数据根本就不需要备份的呢!此外,外挂的机器,例如 /mnt 或 /media 里面都是挂载了其他的硬盘装置、光驱、软盘机等等,这些也不需要备份吧? 所以罗!底下有些目录可以不需要备份啦!

  • /dev :这个随便你要不要备份
  • /proc:这个真的不需要备份啦!
  • /mnt 与 /media:如果你没有在这个目录内放置你自己系统的东西,也不需要备份
  • /tmp :干嘛存缓存档!不需要备份!

备份用储存媒体的选择


用来储存备份数据的媒体非常的多样化,那该如何选择呢?在选择之前我们先来讲个小故事先!


  • 一个实际发生的故事

在备份的时候,选择一个『数据存放的地方』也是很需要考虑的一个因素! 什么叫做数据存放的地方呢?讲个最简单的例子好了,我们知道说,较为大型的机器都会使用 tape 这一种磁带机来备份数据,而如果是一般个人计算机的话,很可能是使用类似 Mo 这一种可读写式光盘片来存取数据!但是你不要忘记了几个重要的因素,那就是万一你的 Linux 主机被偷了呢?

这不是不可能的,之前鸟哥在成大念书时,隔壁校区的研究室曾经遭小偷, 里面所有的计算机都被偷走了!包括『Mo 片』,当他们发现的时候,一开始以为是硬件被偷走了,还好, 他们都有习惯进行备份,但是很不幸的,这一次连『备份的 MO 都被拿走了!』怎么办?!只能道德劝说小偷先生能够良心发现的将硬盘拿回来罗!唉~真惨....


  • 异地备援系统

这个时候,所谓的『异地备援系统』就显的相当的重要了! 什么是异地备援呀!说的太文言了!呵!简单的说,就是将你的系统数据『备份』到其他的地方去, 例如说我的机器在台南,但是我还有另一部机器在高雄老家,这样的话, 我可以将台南机器上面重要的数据都给他定期的自动的透过网络传输回去! 也可以将家里重要的数据给他丢到台南来!这样的最大优点是可以在台南的机器死掉的时候, 即使是遭小偷,也可以有一个『万一』的备份所在!

有没有缺点啊?有啊!缺点就是~频宽严重的不足! 在这种状态下,所能采取的策略大概就是『仅将最重要的数据给他传输回去罗!』 至於一些只要系统从新安装就可以回复的咚咚!那就没有这个必要了!当然罗,如果你的网络是属於 T1 专线的话,那么完整备份将数据丢到另一地去,也是很可行的啦!只是鸟哥没有那么好命...


  • 储存媒体的考量

在此同时,我们再来谈一谈,那么除了异地备援这个『相对较为安全的备份』方法之外, 还有没有其他的方法可以储存备份的呢?毕竟这种网络备援系统实在是太耗频宽了!如果像我们一般家用的 ADSL 根本就是吃不消!那么怎么办?喔~那就只好使用近端的装置来备份罗! 这也是目前我们最常见到的备份方法!例如一般我们使用的 Tape, Mo, Zip, CD-RW, DVD-RW 还有备份用抽取式硬盘与携带式硬盘等等! 那么在选择上需要注意些什么呢?需要注意的地方有几点:

  • 备份速度要求 -- 思考硬盘用途

    『备份』在 Linux 主机上面也是蛮耗系统资源的!因为需要将系统的数据拷贝到其他装置上面去,这个时候 I/O 与 CPU 的负载都会大!你总不希望系统就这样给他挂点吧!此外,有些系统的数据实在太多咯, 怎么样也备份不完!所以罗,越快的储存装置是越好的!如果你是个重视速度甚於一切的人, 那么我觉得抽取式硬盘是个不错的方式,只不过.....目前我知道的抽取式硬盘都需要冷启动才行,不太符合 Linux 主机 24 小时全年无休的状态....

    但是硬盘真的越来越大、越来越便宜了,不使用速度快的硬盘来备份实在很可惜~ 加上目前的火线 (IEEE 1394) 以及 U盘 2.0 外接式硬盘盒技术已经相当的成熟, 传输速度又快,又可以直接热拔插 (Plug and Play),接上 U盘 硬盘, 整个复制一下,传输速度理论上可达 480Mbps (约 60 MBytes/second) ,快的哩! 复制完毕,又可以将硬盘带走,不需要与主机放置在一起,还可以避免同时被偷,真是不错。

    但是,硬盘还是有一定的困扰,那就是『不接电源的硬盘需要很好很好的保养』。 我们知道计算机最好的保养就是常常启动去运行一下,免得长期不启动,造成受潮而损坏。 这个携带式硬盘只是偶而才会连上主机来进行备份的数据,除非你额外购买一部防潮箱来放置硬盘, 否则很容易损坏!所以,近年来速度越来越快的 DVD-RW 就变的很方便罗!至於磁带 (tape),在速度上完全是落后的.....

    至於使用直接安装在主机上的第二颗硬盘来备份,类似 RAID 或者是安装一颗备份的硬盘在 Linux 系统当中,这个方案也很好, 而且速度上绝对是最具优势的!但是就如同我们刚刚提到的,万一你的机器被偷了,连带的, 这颗备份的硬盘自然也就不见了.....

  • 储存容量 -- 磁带备份考量

    这也是一个需要考量的因素!而且常常是最大考量的因素呢!虽然目前硬盘越来越便宜, 但是毕竟就如同前面说的,抽取式硬盘需要将系统冷启动,而建构在系统内的硬盘又同时具有不安全的成分在, 携带式硬盘可能又有不容易保存的特性,这个时候一个大容量的替代方案就显的很重要了!虽然 CD-RW 与 DVD-RW 可以提供不错的速度,但是其容量毕竟不足 (虽然有高达几十 GB 的蓝光 DVD 可用,但目前 (2009) 尚未普及, 光盘片太贵了!) 所以说,具有大容量的 tape (磁带容量最小的一款也可以到达 8 GB 左右!) 就相当的具有这方面的优势了!而且携带方便,存放也容易!更可以带著走~~

  • 经费与数据可靠性 -- DVD 的使用,可保存 10 年左右

    在经费不短缺的情况下,我们当然会建议你上面的几个装置都买一买, 然后分别在不同的时间进行不同的备份作业 (底下我们有些建议的啦!^_^) !但是如果经费也是需要考量的话,那么磁带机这个目前还算贵重的物品可能暂时还动不到! 这个时候近来渐渐便宜的 DVD-RW 就显的活跃的多了!而且光盘片也可以保存很久的ㄋㄟ~ 当然,目前应该不会有人以软盘来备份了吧!呵呵!软盘可是相当不安全的。

无论如何,如果经费允许的话, Tape 备份数据真的是一个不错的点子!因为他的高容量让我好满意! 再来,如果经费稍微短缺的话,那么 DVD-RW 经常性的将数据烧录下来,这也是蛮好的,尤其 DVD 片又不占空间!再来,如果还是没有办法,那么一颗内建在 Linux 的硬盘用来备份也是不错的! 什么!连备份的硬盘都没有,唉!怎么跟我一样~这个时候没办法啦,用原来的安装系统的硬盘,多留一个 partition 用来当作备份之用吧 (这也是目前鸟哥常用的方法之一!)底下我们来看一看一些常见的装置代号!

  • 光驱: /dev/cdrom (其实应该是 /dev/sdX 或 /dev/hdX)
  • 磁带机: /dev/st0 (SCSI 介面), /dev/ht0 (IDE 介面)
  • 软盘机: /dev/fd0, /dev/fd1
  • 硬盘机: /dev/hd[a-d][1-63] (IDE), /dev/sd[a-p][1-16] (SCSI/SATA)
  • 外接式 U盘 硬盘机: /dev/sd[a-p][1-16] (与 SCSI 相同)
  • 打印机: /dev/lp[0-2]

特别留意的是磁带机呦!如果你有钱的话,那么买一部磁带机是相当不错的建议!没钱的话,买 IDE 或 SATA 介面的硬盘也很不错!! ^_^


备份的种类、频率与工具的选择


讲了好多口水了,还是没有讲到重点,真是的....好了,再来提到那个备份的种类,因为想要选择什么储存媒体与相关备份工具, 都与备份使用的方式有关!那么备份有哪些方式呢?一般可以粗略分为『累积备份』与『差异备份』这两种 (注1)。当然啦,如果你在系统出错时想要重新安装到升级的系统时,仅备份关键数据也就可以了!


完整备份之累积备份 (Incremental backup)

备份不就是将重要数据复制出来即可吗?干嘛需要完整备份 (Full backup) 呢?如果你的主机是负责相当重要的服务, 因此如果有不明原因的死机事件造成系统损毁时,你希望在最短的时间内复原系统。此时,如果仅备份关键数据时, 那么你得要在系统出错后,再去找新的 Linux distribution 来安装,安装完毕后还得要考虑到数据新旧版本的差异问题, 还得要进行数据的移植与系统服务的重新创建等等,等到创建妥当后,还得要进行相关测试! 这种种的工作可至少得要花上一个星期以上的工作天才能够处理妥当!所以,仅有关键数据是不够的!


  • 还原的考量

但反过来讲,如果是完整备份的话呢?若硬件出问题导致系统损毁时,只要将完整备份拿出来,整个给他倾倒回去硬盘, 所有事情就搞定了!有些时候 (例如使用 dd 命令) 甚至连系统都不需要重新安装!反正整个系统都给他倒回去,连同重要的 Linux 系统文件等,所以当然也就不需要重新安装啊!因此,很多企业用来提供重要服务的主机都会使用完整备份, 若所提供的服务真的非常重要时,甚至会再架设一部一模一样的机器呢!如此一来, 若是原本的机器出问题,那就立刻将备份的机器拿出来接管!以使企业的网络服务不会中断哩!

那你知道完整备份的定义了吧?没错!完整备份就是将根目录 (/) 整个系统通通备份下来的意思! 不过,在某些场合底下,完整备份也可以是备份一个文件系统 (filesystem)!例如 /dev/sda1 或 /dev/md0 或 /dev/myvg/mylv 之类的文件系统就是了。


  • 累积备份的原则

虽然完整备份在还原方面有相当良好的表现,但是我们都知道系统用的越久,数据量就会越大!如此一来, 完整备份所需要花费的时间与储存媒体的使用就会相当麻烦~所以,完整备份并不会也不太可能每天都进行的! 那你想要每天都备份数据该如何进行呢?有两种方式啦,一种是本小节会谈到的累积备份,一种则是下个小节谈到的差异备份。

所谓的累积备份,指的是在系统在进行完第一次完整备份后,经过一段时间的运行, 比较系统与备份档之间的差异,仅备份有差异的文件而已。而第二次累积备份则与第一次累积备份的数据比较, 也是仅备份有差异的数据而已。如此一来,由於仅备份有差异的数据,因此备份的数据量小且快速!备份也很有效率。 我们可以从下图来说明:

累积备份 (incremental backup) 操作示意图
图 2.1.1、 累积备份 (incremental backup) 操作示意图

假如我在星期一作好完整备份,则星期二的累积备份是系统与完整备份间的差异数据;星期三的备份是系统与星期二的差异数据, 星期四的备份则是系统与星期三的差异数据。那你得要注意的是,星期二的数据是完整备份加第一次累积备份, 星期三的数据是完整备份加第一次累积与第二次累积备份,星期四的数据则是星期一的完整备份加第一次加第二次加第三次累积备份。 由於每次都仅与前一次的备份数据比较而已,因此备份的数据量就会少很多!

那如何还原?经过上面的分析,我们也会知道累积备份的还原方面比较麻烦! 假设你的系统在星期五的时候挂点了!那你要如何还原?首先,你必须要还原星期一的完整备份,然后还原星期二的累积备份, 再依序还原星期三、星期四的累积备份才算完全复原!那如果你是经过了九次的累积备份,就得要还原到第九次的阶段, 才是最完整的还原程序!


  • 累积备份使用的备份软件

完整备份常用的工具有 dd, cpio, dump/restore 等等。因为这些工具都能够备份装置与特殊文件! dd 可以直接读取磁碟的磁区 (sector) 而不理会文件系统,是相当良好的备份工具!不过缺点就是慢很多! cpio 是能够备份所有档名,不过,得要配合 find 或其他找档名的命令才能够处理妥当。以上两个都能够进行完整备份, 但累积备份就得要额外使用脚本程序来处理。可以直接进行累积备份的就是 dump 这个命令罗!详细的命令与参数用法, 请前往第九章查阅,这里仅列出几个简单的范例而已。

# 1. 用 dd 来将 /dev/sda 备份到完全一模一样的 /dev/sdb 硬盘上:
[root@www ~]# dd if=/dev/sda of=/dev/sdb
# 由於 dd 是读取磁区,所以 /dev/sdb 这颗磁碟可以不必格式化!非常的方便!
# 只是你会等非常非常久!因为 dd 的速度比较慢!

# 2. 使用 cpio 来备份与还原整个系统,假设储存媒体为 SATA 磁带机:
[root@www ~]# find / -print | cpio -covB > /dev/st0  <==备份到磁带机
[root@www ~]# cpio -iduv < /dev/st0                  <==还原

假设 /home 为一个独立的文件系统,而 /backupdata 也是一个独立的用来备份的文件系统,那如何使用 dump 将 /home 完整的备份到 /backupdata 上呢?可以像底下这样进行看看:

# 1. 完整备份
[root@www ~]# dump -0u -f /backupdata/home.dump /home

# 2. 第一次进行累积备份
[root@www ~]# dump -1u -f /backupdata/home.dump.1 /home

除了这些命令之外,其实 tar 也可以用来进行完整备份啦!举例来说,/backupdata 是个独立的文件系统, 你想要将整个系统通通备份起来时,可以这样考虑:将不必要的 /proc, /mnt, /tmp 等目录不备份,其他的数据则予以备份:

[root@www ~]# tar --exclude /proc --exclude /mnt --exclude /tmp \
> --exclude /backupdata -jcvp -f /backupdata/system.tar.bz2 /

完整备份之差异备份 (Differential backup)

差异备份与累积备份有点类似,也是需要进行第一次的完整备份后才能够进行。只是差异备份指的是:每次的备份都是与原始的完整备份比较的结果。所以系统运行的越久,离完整备份时间越长, 那么该次的差异备份数据可能就会越大!差异备份的示意图如下所示:

差异备份 (differential backup) 操作示意图
图 2.2.1、 差异备份 (differential backup) 操作示意图

差异备份常用的工具与累积备份差不多!因为都需要完整备份嘛!如果使用 dump 来备份的话,那么每次备份的等级 (level) 就都会是 level 1 的意思啦!当然啦,你也可以透过 tar 的 -N 选项来备份喔!如下所示:

[root@www ~]# tar -N '2009-06-01' -jpcv -f /backupdata/home.tar.bz2 /home
# 只有在比 2009-06-01 还要新的文件,在 /home 底下的文件才会被打包进 home.bz2 中!
# 有点奇怪的是,目录还是会被记录下来,只是目录内的旧文件就不会备份。

此外,你也可以透过 rsync 来进行镜像备份喔! 这个 rsync 可以对两个目录进行镜像 (mirror) ,算是一个非常快速的备份工具!简单的命令语法为:

[root@www ~]# rsync -av 来源目录 目标目录

# 1. 将 /home/ 镜像到 /backupdata/home/ 去
[root@www ~]# rsync -av /home /backupdata/
# 此时会在 /backupdata 底下产生 home 这个目录来!
[root@www ~]# rsync -av /home /backupdata/
# 再次进行会快很多!如果数据没有更动,几乎不会进行任何动作!

根据分析 (注2) ,差异备份所使用的磁碟容量可能会比累积备份来的大,但是差异备份的还原较快, 因为只需要还原完整备份与最近一次的差异备份即可。无论如何,请依据你自己的喜好来选择备份的方式吧!


关键数据备份


完整备份虽然有许多好处,但就是需要花费很多时间!所以,如果在主机提供的服务并不是一定要 24 小时提供的前提下, 我们可以仅备份重要的关键数据即可。由於主机即使死机个一两天可能也不会影响到你的正常生活时, 仅备份关键数据就好啦!不需要整个系统都备份。仅备份关键数据是有许多好处的! 由於完整备份可能是在系统运行期间进行,不但会花费非常多时间,而且如果备份当时系统已经被攻破, 那你备份的数据是有问题的,那还原回去也是有问题的系统啊!

如果仅是备份关键数据而已,那么由於系统的绝大部分运行档都可以后来重新安装,因此若你的系统不是因为硬件问题, 而是因为软件问题而导致系统被攻破或损毁时,直接捉取最新的 Linux distribution ,然后重新安装, 然后再将系统数据 (如帐号/口令与家目录等等) 与服务数据 (如 www/email/crontab/ftp 等等) 一个一个的填回去! 那你的系统不但保持在最新的状态,同时也可以趁机处理一下与重新温习一下系统配置!是很不错的呦!

不过,备份关键数据最麻烦的地方其实就是在还原啦!上述的还原方式是你必须要很熟悉系统运行, 否则还原得要花费很多时间的!尤其近来的 Linux 强调安全性,所以加入 SELinux 了,你如果要从旧版的 Linux 升级到新版时, 原本若没有 SELinux 而换成新版则需要启动 SELinux 时,那个除错的时间会花很长一段日子哩! 鸟哥认为这是仅备份关键数据的一些优缺点啦~

备份关键数据鸟哥最爱使用 tar 来处理了!如果想要分门别类的将各种不同的服务在不同的时间备份使用不同档名, 配合 date 命令是非常好用的工具!例如底下的案例是依据日期来备份 mysql 的数据库喔!

[root@www ~]# tar -jpcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql

备份是非常重要的工作,你可不希望想到才进行吧?交给系统自动处理就对啦!请自己撰写 script , 配合 crontab 去运行吧!这样子,备份会很轻松喔!


鸟哥的备份策略


每部主机的任务都不相同,重要的数据也不相同,重要性也不一样,因此,每个人的备份思考角度都不一样! 有些备份策略是非常有趣的,包括使用多个磁带机与磁带来自动备份企业数据哩 (注3) 。

就鸟哥的想法来说,鸟哥并没有想要将整个系统完整的备份下来,因为太耗时间了!而且就鸟哥的立场而言,似乎也没有这个必要, 所以通常鸟哥只备份较为重要的文件而已!不过,由於鸟哥需要备份 /home 与网页数据,如果天天都备份,我想,系统迟早会受不了 (因为这两个部分就已经占去数 10 GB 的磁盘空间...),所以鸟哥就将我的备份分为两大部分,一个是每日备份经常性变动的重要数据, 一个则是每周备份就不常变动的资讯。这个时候我就写了两个简单的 scripts ,分别来储存这些数据。

所以针对鸟哥的『鸟站』来说,我的备份策略是这样的:

  1. 主机硬件:使用一个独立的 filesystem 来储存备份数据,此 filesystem 挂载到 /backup 当中;
  2. 每日进行:目前仅备份 MySQL 数据库;
  3. 每周进行:包括 /home, /var, /etc, /boot, /usr/local 等目录与特殊服务的目录;
  4. 自动处理:这方面利用 /etc/crontab 来自动提供备份的进行;
  5. 异地备援:每月定期的将数据分别 (a)烧录到光盘上面 (b)使用网络传输到另一部机器上面。

那就来看看鸟哥是怎么备份的吧! ^_^


每周系统备份的 script


底下提供鸟哥的备份的 scripts ,希望对大家有点帮助!鸟哥假设你已经知道如何挂载一个新的 filesystem 到 /backup 去,所以格式化与挂载这里就不再强调罗。

[root@www ~]# vi /backup/backupwk.sh
#!/bin/bash
# ====================================================================
# 使用者参数输入位置:
# basedir=你用来储存此脚本所预计备份的数据之目录(请独立文件系统)
basedir=/backup/weekly  <==您只要改这里就好了!

# ====================================================================
# 底下请不要修改了!用默认值即可!
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C

# 配置要备份的服务的配置档,以及备份的目录
named=$basedir/named
postfixd=$basedir/postfix
vsftpd=$basedir/vsftp
sshd=$basedir/ssh
sambad=$basedir/samba
wwwd=$basedir/www
others=$basedir/others
userinfod=$basedir/userinfo
# 判断目录是否存在,若不存在则予以创建。
for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod
do
	[ ! -d "$dirs" ] && mkdir -p $dirs
done

# 1. 将系统主要的服务之配置档分别备份下来,同时也备份 /etc 全部。
cp -a /var/named/chroot/{etc,var}	$named
cp -a /etc/postfix /etc/dovecot.conf	$postfixd
cp -a /etc/vsftpd/*			$vsftpd
cp -a /etc/ssh/*			$sshd
cp -a /etc/samba/*			$sambad
cp -a /etc/{my.cnf,php.ini,httpd}	$wwwd
cd /var/lib
  tar -jpc -f $wwwd/mysql.tar.bz2 	mysql
cd /var/www
  tar -jpc -f $wwwd/html.tar.bz2 	html cgi-bin
cd /
  tar -jpc -f $others/etc.tar.bz2	etc
cd /usr/
  tar -jpc -f $others/local.tar.bz2	local

# 2. 关於使用者参数方面
cp -a /etc/{passwd,shadow,group}	$userinfod
cd /var/spool
  tar -jpc -f $userinfod/mail.tar.bz2	mail
cd /
  tar -jpc -f $userinfod/home.tar.bz2	home
cd /var/spool
  tar -jpc -f $userinfod/cron.tar.bz2	cron at

[root@www ~]# chmod 700 /backup/backupwk.sh
[root@www ~]# /backup/backupwk.sh  <==记得自己试跑看看!

上面的 script 主要均使用 CentOS 5.x (理论上, Red Hat 系列的 Linux 都是用) 默认的服务与目录, 如果你有配置某些服务的数据在不同的目录时,那么上面的 script 是还需要修改的!不要只是拿来用而已喔! 上面 script 可以在底下的连结取得。


每日备份数据的 script


再来,继续提供一下每日备份数据的脚本程序!请注意,鸟哥这里仅有提供 MySQL 的数据库备份目录, 与 WWW 的类似留言版程序使用的 CGI 程序与写入的数据而已。 如果你还有其他的数据需要每日备份,请自行照样造句罗! ^_^

[root@www ~]# vi /backup/backupday.sh
#!/bin/bash
# =========================================================
# 请输入,你想让备份数据放置到那个独立的目录去
basedir=/backup/daily/  <==你只要改这里就可以了!

# =========================================================
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
basefile1=$basedir/mysql.$(date +%Y-%m-%d).tar.bz2
basefile2=$basedir/cgi-bin.$(date +%Y-%m-%d).tar.bz2
[ ! -d "$basedir" ] && mkdir $basedir

# 1. MysQL (数据库目录在 /var/lib/mysql)
cd /var/lib
  tar -jpc -f $basefile1 mysql

# 2. WWW 的 CGI 程序 (如果有使用 CGI 程序的话)
cd /var/www
  tar -jpc -f $basefile2 cgi-bin

[root@www ~]# chmod 700 /backup/backupday.sh
[root@www ~]# /backup/backupday.sh  <==记得自己试跑看看!

上面的脚本可以在底下的连结取得。这样一来每天的 MySQL 数据库就可以自动的被记录在 /backup/daily/ 目录里头啦!而且还是文件名称会自动改变的呦!呵呵!我很喜欢!OK!再来就是开始让系统自己跑啦! 怎么跑?就是 /etc/crontab 呀!提供一下我的相关配置呦!

[root@www ~]# vi /etc/crontab
# 加入这两行即可 (请注意你的文件目录!不要照抄呦!)
30 3 * * 0 root /backup/backupwk.sh
30 2 * * * root /backup/backupday.sh

这样系统就会自动的在每天的 2:30 进行 MySQL 的备份,而在每个星期日的 3:30 进行重要文件的备份!呵呵!你说,是不是很容易呢!但是请千万记得呦!还要将 /backup/ 当中的数据 copy 出来才行耶!否则整部系统死掉的时候...那可不是闹著玩的! 所以鸟哥大约一个月到两个月之间,会将 /backup 目录内的数据使用 DVD 复制一下,然后将 DVD 放置在家中保存!这个 DVD 很重要的喔!不可以遗失,否则系统的重要数据 (尤其是帐号资讯) 流出去可不是闹著玩的!

Tips:
有些时候,你在进行备份时,被备份的文件可能同时间被其他的网络服务所修改喔! 举例来说,当你备份 MySQL 数据库时,刚好有人利用你的数据库发表文章,此时, 可能会发生一些错误的信息。要避免这类的问题时,可以在备份前,将该服务先关掉, 备份完成后,再启动该服务即可!感谢讨论区 duncanlo 提供这个方法!
鸟哥的图示

远程备援的 script


如果你有控管两部以上的 Linux 主机时,那么互相将对方的重要数据保存一份在自己的系统中也是个不错的想法! 那怎么保存啊?使用 U盘 复制来去吗?当然不是啦!你可以透过网络来处置啦!我们假设你已经有一部主机, 这部主机的 IP 是 192.168.1.100 ,而且这部主机已经提供了 FTP 与 sshd 这两个网络服务, 同时你已经做好了 FTP 的帐号,sshd 帐号的免口令登陆功能等 (这部分请参考服务器篇的介绍),接下来你可以这样做:


  • 使用 FTP 上传备份数据

假设你要上传的数据是将 /backup/weekly/ 目录内的文件统整为一个 /backup/weekly.tar.bz2 , 并且上传到服务器端的 /home/backup/ 底下,使用的帐号是 dmtsai ,口令是 dmtsai.pass 。 那么你可以这样做看看:

[root@www ~]# vi /backup/ftp.sh
#!/bin/bash
# ===========================================
# 先输入系统所需要的数据
host="192.168.1.100"		# 远程主机
id="dmtsai"			# 远程主机的 FTP 帐号
pw='dmtsai.pass'		# 该帐号的口令
basedir="/backup/weekly"	# 本地端的欲被备份的目录
remotedir="/home/backup"	# 备份到远程的何处?

# ===========================================
backupfile=weekly.tar.bz2
cd $basedir/..
  tar -jpc -f $backupfile $(basename $basedir)

ftp -n "$host" > ${basedir}/../ftp.log 2>&1 <

  • 使用 rsync 上传备份数据

另一个更简单的方法就是透过 rsync ,但是你必须要在你的服务器上面取得某个帐号使用权后, 并让该帐号可以不用口令即可登陆才行!这部分得要先参考服务器篇的远程连线服务器才行! 假设你已经配置好 dmtsai 这个帐号可以不用口令即可登陆远程服务器,而同样的你要让 /backup/weekly/ 整个备份到 /home/backup/weekly 底下时,可以简单这样做:

[root@www ~]# vi /backup/rsync.sh
#!/bin/bash
remotedir=/home/backup/
basedir=/backup/weekly
host=127.0.0.1
id=dmtsai

# 底下为程序阶段!不需要修改喔!
rsync -av -e ssh $basedir ${id}@${host}:${remotedir}

由於 rsync 可以透过 ssh 来进行镜像备份,所以没有变更的文件将不需要上传的!相当的好用呢! 好了!大家赶紧写一个适合自己的备份 script 来进行备份的行为吧!重要重要喔!


灾难复原的考量


之所以要备份当然就是预防系统挂点啦!如果系统真的挂点的话,那么你该如何还原系统呢?


  • 硬件损毁,且具有完整备份的数据时

由於是硬件损毁,所以我们不需要考虑系统软件的不稳定问题,所以可以直接将完整的系统复原回去即可。 首先,你必须要先处理好你的硬件,举例来说,将你的硬盘作个适当的处理,譬如建置成为磁盘阵列之类的。 然后依据你的备份状态来复原。举例来说,如果是使用差异备份,那么将完整备份复原后, 将最后一次的差异备份复原回去,你的系统就恢复了!非常简单吧!


  • 由於软件的问题产生的被攻破资安事件

由於系统的损毁是因为被攻击,此时即使你恢复到正常的系统,那么这个系统既然会被攻破, 没道理你还原成旧系统就不会被再次攻破!所以,此时完整备份的复原可能不是个好方式喔!最好是需要这样进行啦:

  1. 先拔除网络线,最好将系统进行完整备份到其他媒体上,以备未来查验
  2. 开始查阅登录文件,尝试找出各种可能的问题
  3. 开始安装新系统 (最好找最新的 distribution)
  4. 进行系统的升级,与防火墙相关机制的制订
  5. 根据 2 的错误,在安装完成新系统后,将那些 bug 修复
  6. 进行各项服务与相关数据的恢复
  7. 正式上线提供服务,并且开始测试

软件资安事件造成的问题可大可小,一般来说,标准流程都是建议你将出问题的系统备份下来, 如果被追踪到你的主机曾经攻击过别人的话,那么你至少可以拿出备份数据来佐证说,你是被攻击者, 而不是主动攻击别人的坏人啊!然后,记得一定要找出问题点并予以克服,不然的话,你的系统将一再地被攻击啊! 那样可就伤脑筋罗~


重点回顾


  • 备份是系统损毁时等待救援的救星,但造成系统损毁的因素可能有硬件与软件等原因。
  • 由於主机的任务不同,备份的数据与频率等考量参数也不相同。
  • 常见的备份考虑因素有:关键文件、储存媒体、备份方式(完整/关键)、备份频率、使用的备份工具等。
  • 常见的关键数据有:/etc, /home, /var/spool/mail, /boot, /root 等等
  • 储存媒体的选择方式,需要考虑的地方有:备份速度、媒体的容量、经费与媒体的可靠性等。
  • 与完整备份有关的备份策略主要有:累积备份与差异备份。
  • 累积备份可具有较小的储存数据量、备份速度快速等。但是在还原方面则比差异备份的还原慢。
  • 完整备份的策略中,常用的工具有 dd, cpio, tar, dump 等等。

本章习题


( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
  • 挑战题:尝试将你在学习本书所进行的各项任务备份下来,然后删除你的系统,接下来重新安装最新的 CentOS 5.x , 再将你备份的数据复原回来,看看能否成功的让你的系统回复到之前的状态呢?

  • 挑战题:查询一下何谓企鹅龙软件,讨论一下该软件的还原机制是属於累积备份?还是完整备份?

  • 常用的完整备份 (full backup) 工具命令有哪些?
    dump + restore, dd, cpio 搭配 find 等软件。
  • 你所看到的常见的储存设备有哪些?
    Floppy, Mo, Zip, CD-RW, DVD-RW, 外接式 U盘 硬盘, Tape, 外接式储存阵列 (RAID),额外的储存架构,如 SAN, NAS 等。

参考数据与延伸阅读



2002/07/06:第一次完成
2003/02/12:重新编排与加入 FAQ
2005/10/25:旧版的数据已经移动到 此处
2005/10/25:主要是添加了一些简单的说明,以及将一些不合时宜的数据拿掉而已!
2009/07/15:将原本的基於 FC4 的文章移动到 此处
2009/09/18:加入简单的几个题目练习