鸟哥的 Linux 私房菜
Linux 基础篇 | Linux 服务器篇 | Linux 企业应用篇 | 安全管理
     
 
第二十五章、 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) 以及 USB 2.0 外接式硬碟盒技术已经相当的成熟, 传输速度又快,又可以直接热拔插 (Plug and Play),接上 USB 硬碟, 整个复制一下,传输速度理论上可达 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-16] (IDE), /dev/sd[a-p][1-16] (SCSI/SATA)
  • 外接式 USB 硬碟机: /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 主机时,那么互相将对方的重要资料保存一份在自己的系统中也是个不错的想法! 那怎么保存啊?使用 USB 复制来去吗?当然不是啦!你可以透过网络来处置啦!我们假设你已经有一台主机, 这部主机的 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 <<EOF
user $id $pw
binary
cd $remotedir
put $backupfile
bye
EOF

  • 使用 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, 外接式 USB 硬碟, Tape, 外接式储存阵列 (RAID),额外的储存架构,如 SAN, NAS 等。

大标题的图示参考资料与延伸阅读

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



 
     
中国存储网 ChinaStor.com排版整理
原文作者鸟哥,主页,更多Linux学习资料在线看:Linux系统管理员手册 - Linux命令大全 - Linux调用大全- Linux专栏 - 国产Linux