- 第25章 Linux备份策略
- 1. 用 dd 来将 /dev/sda 备份到完全一模一样的 /dev/sdb 硬盘上:
- 由于 dd 是读取扇区,所以 /dev/sdb 这块磁盘可以不必格式化,非常方便!
- 只是你会等非常非常久,因为 dd 的速度比较慢!
- 2. 使用 cpio 来备份与还原整个系统,假设存储设备为 SATA 磁带机:
- 1. 完整备份
- 2. 第一次进行增量备份
- 只有在比 2009-06-01 还要新的文件,在 /home 下面的文件才会被打包进 home.bz2 中!
- 有点奇怪的是,目录还是会被记录下来,只是目录内的旧文件就不会备份。
- 1. 将 /home/ 镜像到 /backupdata/home/ 去
- 此时会在 /backupdata 下面产生 home 这个目录!
- 再次进行会快很多。如果数据没有改动,几乎不会进行任何操作!
- 25.3 鸟哥的备份策略
- !/bin/bash
- ====================================================================
- 用户参数输入位置:
- basedir=你用来存储此脚本所预计备份的数据的目录(请独立文件系统)
- ====================================================================
- 下面请不要修改了!用默认值即可
- 设置要备份的服务的配置文件,以及备份的目录
- 判断目录是否存在,若不存在则予以建立。
- 1. 将系统主要服务的配置文件分别备份下来,同时也全部备份 /etc。
- 2. 关于用户参数方面
- !/bin/bash
- =========================================================
- 请输入,你想让备份数据放置到哪个独立的目录去
- =========================================================
- 1. MysQL (数据库目录在 /var/lib/mysql)
- 2. WWW 的 CGI 程序 (如果有使用 CGI 程序的话)
- 加入这两行即可 (请注意你的文件目录!不要照抄呦)
- !/bin/bash
- ===========================================
- 先输入系统所需要的数据
- ===========================================
- !/bin/bash
- 下面为程序阶段。不需要修改。
第25章 Linux备份策略
一旦Linux系统被黑客入侵了,或Linux系统由于硬件关系而死机,如何快速恢复系统呢?当然,如果有备份数据的话,那么恢复系统所花费的时间与成本将会很少。平时最好就养成备份的习惯,可以避免遇到突发事件时束手无策。此外,哪些文件最需要备份呢?是需要完整备份还是仅备份重要数据?这些都是本章要讨论的内容。
25.1 备份要点
备份是个很重要的工作,很多人总是在系统损毁的时候才会发现备份资料的重要性。但是备份其实也非常可怕!因为你的重要数据都在备份文件里面,如果这个备份被窃取或遗失,对系统安全的影响也非常大!同时,备份使用的设备选择也非常多样,但是各种存储设备各有其功能与优劣,所以得要慎重选择!
25.1.1 备份资料的考虑
老实说,备份是系统损毁时等待救援的救星。因为你需要重新安装系统时,备份的好坏会影响到你系统恢复的进度。不过,我们想先知道的是,系统为什么会损毁啊?是人为的还是怎样产生的?事实上,系统有可能由于不预期的伤害而导致系统发生错误。什么是不预期的伤害呢?这是由于系统可能因为不预期的硬件损坏,例如硬盘坏掉等或者是软件问题导致系统出错,包括人为的操作不当或是其他不明因素等所致。下面我们就来谈谈系统损坏的情况与为何需要备份吧!
造成系统损毁的问题:硬件问题
基本上,“计算机是一个相当不可靠的机器”这句话在大部分的时间内还是成立的!在当前一些计算机外部硬件的生产成品率(就是将硬件产生出来之后,经过测试,发现可正常工作的与不能正常工作的硬件总数之比值)越来越差的情况之下,计算机的不稳定状态实在是越来越严重了!
举个例子来说,鸟哥曾经同时买过同一品牌的 30GB 硬盘三个,买回来之后用了一个星期,其中两个就坏了!其中一个是有坏道,另外一个是完全坏了,拿去公司要求修理,结果店家直接拿了一个新的给我,害我吓一跳,店家的工程师说“唉呀!目前这个牌子的成品率太差了,所以代理商为了怕麻烦,都会直接拿新的替换给我们!”要知道,当初那一个完全坏掉的硬盘是我用来备份我的主机数据的,好在当时我将备份的数据放在三四个地方,还好。
一般来说,会造成系统损毁的硬件组件应该要算硬盘。因为其他的组件坏掉时,虽然会影响到系统的运行,不过至少我们的数据还是存在硬盘当中的啊!为了避免这个困扰,于是乎有可备份用的RAID1,RAID5等磁盘阵列的应用。但是如果是RAID控制芯片坏掉呢?这就麻烦了,所以说,如果有RAID系统时,鸟哥个人还是觉得需要保存额外的备份才好的,如果数据够重要的话。
造成系统损毁的问题:软件问题
根据分析,其实系统的软件伤害最严重的就属于用户的操作不当。像最近这几天才在鸟园讨论区发现,有网友失误,结果在命令行输入了“rm -rf/home”,这造成什么后果呢?就造成用户目录被删除了。因为当时执行命令的身份是 root 啊,会欲哭无泪喔!为了避免这方面的“失误”问题,备份是重要的!
软件伤害除了来自主机上的用户操作不当之外,最常见的可能是安全攻击事件了。假如你的Linux系统上面某些Internet的服务软件是最新的!这也意味着可能是相对最安全的,但是,这个世界目前的闲人是相当多的,你不知道什么时候会有所谓的“黑客软件”被提供出来,万一你在Internet上面的服务程序被攻击,导致你的Linux系统全毁,这个时候怎么办?当然是要恢复系统吧?
那如何恢复被伤害的系统呢?“重新安装就好啦!”或许你会这么说,但是,像鸟哥管理的几个网站的数据,尤其是MySQL数据库的数据,这些都是弥足珍贵的经验数据,万一被损毁而救不回来的时候,不是很可惜吗?这个还好了,万一你是某家银行的话,那么数据的损毁可就不是能够等闲视之的。关系的可是数千甚至上万人的身家财产!这就是备份的重要性了!它可以最起码地稍微保障我们的数据有另外一份copy的备份以达到“安全恢复”的基本要求!
主机角色不同,备份任务也不同
由于软硬件的问题都可能造成系统的损毁,所以备份当然就很重要啦!问题是,每一台主机都需要备份吗?多久备份一次呢?要备份什么数据呢?
如果是个人数据,那么,在一般的台式计算机中,可以利用Norton的Ghost来做备份。最主要的是,Ghost可以针对整个分区进行备份,所以,我们可以将Windows系统中的整个C驱或 D 驱完整地备份下来,还原也非常快,而且操作简便。由于个人计算机所用的数据量通常不大,所以,当 Ghost 完成之后,通常只要将数据刻录到光盘中即可。将光盘保存好,这就是最简单的数据备份模式。此外,由于个人的数据变动通常不大,所以数据的备份频率也不会很高。
如果主机提供 Internet 方面的服务,该如何备份呢?举个例子来说,Study Area 团队的论坛网站http://phorum.study-area.org提供BBS讨论文章,虽然数据量不大,但由于论坛的文件天天增加,每天都有相当多的信息流入,而且一些信息还是重要信息,这个时候,我们能让机器死机吗?
2002年,鸟哥的论坛曾经出过问题,2003年初,Study-Area论坛也出过问题,数据库内容如果损坏,无法挽回,那么,诸多朋友长期交流的经验将付诸东流了。所以,新建备份策略相当重要。
备份因素考虑
由于计算机(尤其是当前的计算机,操作频率太高,硬件质量太差,用户操作习惯不良,某些操作系统的死机率太高)的稳定性较差,所以备份的工作就越来越重要了。
备份哪些文件
我们知道,主机的账号信息在/etc/ 和/home/等文件中,这些都是很重要的。
选择什么备份的设备
用可擦写光盘、另一个硬盘、同一个硬盘的不同分区,还是使用网络备份系统?哪一种速度最快,最便宜,可将数据保存最久?
考虑备份的方式
是完整备份(类似Ghost)还是部分备份?
备份的频率
例如MySQL数据库是否天天备份,若完整备份,需要多久进行一次?
备份使用的工具
利用tar、cpio、dd还是dump等的备份工具。
下面我们就来谈一谈这些问题的解决之道吧!^_^
25.1.2 备份哪些 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(注:若这个目录当中有些临时目录则可以不备份)。
不需要备份的目录
有些数据是不需要备份的。例如我们在第6章文件权限与目录配置里头提到的/proc这个目录是记录目前系统上面正在运行的程序,这个数据根本就不需要备份的呢!此外,外挂的机器,例如/mnt或/media里面都是挂载了其他的硬盘设备、光驱、软盘驱动器等,这些也不需要备份吧?所以。下面有些目录可以不需要备份。
/dev:备份与否均可;
/proc:真的不需要备份;
/mnt与/media:如果你没有在这个目录内放置你自己系统的东西,也不需要备份;
/tmp:临时文件,不需要备份。
25.1.3 选择备份设备
用来存储备份数据的设备非常多样化,那该如何选择呢?在选择之前我们先来讲个小故事先!
一个实际发生的故事
在备份的时候,选择一个数据存放的地方也是很需要考虑的一个因素!什么叫做数据存放的地方呢?讲个最简单的例子好了,我们知道说,较为大型的机器都会使用tape这一种磁带机来备份数据,而如果是一般个人计算机的话,很可能是使用类似Mo这一种可擦写式光盘片来访问数据!但是你不要忘记了几个重要的因素,那就是万一你的Linux主机被偷了呢?
这不是不可能的,之前鸟哥念书时,隔壁校区的研究室曾经遭遇小偷,里面所有的计算机都被偷走了!包括“Mo 盘”,当他们发现的时候,一开始以为是硬件被偷走了,还好,他们都有习惯进行备份,但是很不幸的,这一次连备份的 MO 都被拿走了!怎么办?!只能道德劝说小偷先生能够良心发现将硬盘拿回来!
远程备份系统
这个时候,所谓的“远程备份系统”就显得相当重要了!什么是远程备份呀!说得太文言了!呵!简单地说,就是将你的系统数据“备份”到其他地方去,例如说我的机器在北京,但是我还有另一部机器在上海,这样的话,我可以将北京机器上面重要的数据都定期自动通过网络传输回去!也可以将家里重要的数据丢到北京来!这样的最大优点是可以在北京的机器死掉的时候,即使是遭遇小偷,也可以有一个“万一”的备份所在!
有没有缺点啊?有啊!缺点就是,带宽严重的不足!在这种状态下,所能采取的策略大概就是仅将最重要的数据传输回去!至于一些只要系统重新安装就可以恢复的,那就没有这个必要了!当然,如果你的网络是属于T1专线的话,那么完整备份将数据丢到另一地去,也是很可行的,只是鸟哥没有那么好命。
存储设备的考虑
在此同时,我们再来谈一谈,那么除了远程备份这个相对较为安全的备份方法之外,还有没有其他的方法可以存储备份的呢?毕竟这种网络备份系统实在是太耗带宽了!如果像我们一般家用的ADSL 根本就是吃不消!那么怎么办?那就只好使用近端的设备来备份。这也是目前我们最常见到的备份方法。例如一般我们使用的 Tape,Mo,Zip,CD-RW,DVD-RW,还有备份用抽取式硬盘与移动硬盘等。那么在选择上需要注意些什么呢?需要注意的地方有几点:
备份速度要求:思考硬盘用途
“备份”在Linux主机上面也是很耗系统资源的!因为需要将系统的数据拷贝到其他设备上面去,这个时候I/O与CPU的负载都会大。你总不希望系统就这样挂点吧!此外,有些系统的数据实在太多了,怎么样也备份不完。所以,越快的存储设备是越好的。如果你是个重视速度甚于一切的人,那么我觉得抽取式硬盘是个不错的方式,只不过目前我知道的抽取式硬盘都需要冷启动才行,不太符合Linux主机24小时全年无休的状态。
但是硬盘真的越来越大、越来越便宜了,不使用速度快的硬盘来备份实在很可惜。加上目前的 IEEE 1394 以及移动硬盘技术已经相当成熟,传输速度又快,又可以直接热拔插(Plug and Play),接上移动硬盘,整个复制一下,传输速度理论上可达 480Mbit/s(约60MB/s)。复制完毕,又可以将硬盘带走,不需要与主机放置在一起,还可以避免同时被偷,真是不错。
但是,硬盘还是有一定的困扰,那就是不接电源的硬盘需要很好很好地保养。我们知道计算机最好的保养就是常常开机去运行一下,免得长期不开机造成受潮而损坏。这个移动硬盘只是偶而才会连上主机来进行备份的数据,除非你额外购买一部防潮箱来放置硬盘,否则很容易被损坏。所以,近年来速度越来越快的 DVD-RW就变得很方便。至于磁带(tape),在速度上完全是落后的。
至于使用直接安装在主机上的第二块硬盘来备份,类似 RAID 或者是安装一块备份的硬盘在Linux系统当中,这个方案也很好,而且速度上绝对是最具优势的。但是就如同我们刚才提到的,万一你的机器被偷了,连带的,这块备份的硬盘自然也就不见了。
存储容量:磁带备份考虑
这也是一个需要考虑的因素,而且常常是最大考虑的因素呢!虽然目前硬盘越来越便宜,但是毕竟就如同前面说的,抽取式硬盘需要将系统冷启动,而构建在系统内的硬盘又同时具有不安全的成分在,移动硬盘可能又有不容易保存的特性,这个时候一个大容量的替代方案就显得很重要了!虽然CD-RW与DVD-RW可以提供不错的速度,但是其容量毕竟不足(虽然有高达几十 GB 的蓝光 DVD 可用,但目前尚未普及,光盘太贵了)!所以说,具有大容量的tape(磁带容量最小的一款也可以到达 8GB 左右!)就相当具有这方面的优势,而且携带方便,存放也容易,更可以带走。
经费与数据可靠性:DVD的使用,可保存10年左右
在经费不短缺的情况下,我们当然会建议你上面的几个设备都买一买,然后分别在不同的时间进行不同的备份操作(下面我们有些建议的啦)!但是如果经费也是需要考虑的话,那么磁带机这个目前还算贵重的物品可能暂时还动不到。这个时候近来渐渐便宜的DVD-RW就显得活跃多了,而且光盘片也可以保存很久的,当然,目前应该不会有人以软盘来备份了吧!软盘可是相当不安全的。
无论如何,如果经费允许的话,Tape备份数据真的是一个不错的点子!因为它的高容量让我好满意。再来,如果经费稍微短缺的话,那么DVD-RW经常性地将数据刻录下来,这也是蛮好的,尤其DVD又不占空间。再来,如果还是没有办法,那么一块内置在Linux的硬盘用来备份也是不错的!什么?连备份的硬盘都没有,唉!怎么跟我一样?这个时候没办法啦,用原来的安装系统的硬盘,多留一个分区用来当作备份之用吧(这也是目前鸟哥常用的方法之一)!下面我们来看一看一些常见的设备代号!
光驱:/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)
移动硬盘:/dev/sd[a-p][1-16](与SCSI相同)
打印机:/dev/lp[0-2]
特别要留意的是磁带机!如果你有钱的话,那么买一部磁带机是相当不错的建议!没钱的话,买IDE或SATA接口的硬盘也很不错。
25.2 备份的种类、频率与工具的选择
再来提到备份的种类,因为想要选择什么存储设备与相关备份工具,都与备份使用的方式有关。那么备份有哪些方式呢?一般可以粗略分为“增量备份”与“差异备份”这两种 [16]。当然啦,如果你在系统出错时想要重新安装到更新的系统时,仅备份关键数据也就可以了!
25.2.1 完整备份的增量备份(Incremental backup)
备份不就是将重要数据复制出来即可吗?干嘛需要完整备份(Full backup)呢?如果你的主机是负责相当重要的服务,因此如果有不明原因的死机事件造成系统损毁时,你希望在最短的时间内恢复系统。此时,如果仅备份关键数据时,那么你得要在系统出错后再去找新的 Linux distribution 来安装,安装完毕后还得要考虑到数据新旧版本的差异问题,还得要进行数据的移植与系统服务的重新建立等,等到建立妥当后,还得要进行相关测试。这种种的工作可至少得要花上一个星期以上的时间才能够处理妥当。所以,仅有关键数据是不够的。
还原的考虑
但反过来讲,如果是完整备份的话呢?若硬件出问题导致系统损毁时,只要将完整备份拿出来,整个给他倒回硬盘去,所有事情就搞定了!有些时候(例如使用dd命令)甚至连系统都不需要重新安装。反正整个系统都给他倒回去,连同重要的Linux系统文件等,所以当然也就不需要重新安装。因此,很多企业用来提供重要服务的主机都会使用完整备份,若所提供的服务真的非常重要时,甚至会再架设一部一模一样的机器呢!如此一来,若是原本的机器出问题,那就立刻将备份的机器拿出来接管,以使企业的网络服务不会中断。
那你知道完整备份的定义了吧?没错!完整备份就是将根目录(/)整个系统全部备份下来的意思。不过,在某些场合下面,完整备份也可以是备份一个文件系统,例如/dev/sda1 或/dev/md0或/dev/myvg/mylv之类的文件系统就是了。
增量备份的原则
虽然完整备份在还原方面有相当良好的表现,但是我们都知道系统用得越久,数据量就会越大。如此一来,完整备份所需要花费的时间与存储设备的使用就会相当麻烦。所以,完整备份并不会也不太可能每天都进行的。那你想要每天都备份数据该如何进行呢?有两种方式,一种是本小节会谈到的增量备份,一种则是下个小节谈到的差异备份。
所谓的增量备份,指的是在系统进行完第一次完整备份后,经过一段时间的运行,比较系统与备份文件之间的差异,仅备份有差异的文件而已。而第二次增量备份则与第一次增量备份的数据比较,也是仅备份有差异的数据而已。如此一来,由于仅备份有差异的数据,因此备份的数据量小且快速,备份也很有效率。我们可以从图25-1来说明。
图25-1 增量备份(incremental backup)操作示意图
假如我在星期一做好完整备份,则星期二的增量备份是系统与完整备份间的差异数据;星期三的备份是系统与星期二的差异数据,星期四的备份则是系统与星期三的差异数据。那你得要注意的是,星期二的数据是完整备份加第一次增量备份,星期三的数据是完整备份加第一次增量与第二次增量备份,星期四的数据则是星期一的完整备份加第一次加第二次加第三次增量备份。由于每次都仅与前一次的备份数据比较而已,因此备份的数据量就会少很多。
那如何还原?经过上面的分析,我们也会知道增量备份的还原方面比较麻烦。假设你的系统在星期五的时候挂点了,那你要如何还原?首先,你必须要还原星期一的完整备份,然后还原星期二的增量备份,再依序还原星期三、星期四的增量备份才算完全恢复。那如果你是经过了九次的增量备份,就得要还原到第九次的阶段,才是最完整的还原程序。
增量备份使用的备份软件
完整备份常用的工具有dd,cpio,dump/restore等,因为这些工具都能够备份设备与特殊文件。dd 可以直接读取磁盘的扇区(sector)而不理会文件系统,是相当良好的备份工具,不过缺点就是慢很多。cpio是能够备份所有文件名,不过,得要配合find或其他找文件名的命令才能够处理妥当。以上两个都能够进行完整备份,但增量备份就得要额外使用脚本程序来处理。可以直接进行增量备份的就是dump 嗌这个命令 !详细的命令与参数用法,请前往第9章查阅,这里仅列出几个简单的范例而已。
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 /
25.2.2 完整备份的差异备份(differential backup)
差异备份与增量备份有点类似,也是需要进行第一次的完整备份后才能够进行。只是差异备份指的是:每次的备份都是与原始的完整备份比较的结果。所以系统运行越久,离完整备份时间越长,那么该次的差异备份数据可能就会越大!差异备份的示意图如图25-2所示。
图25-2 差异备份(differential backup)操作示意图
差异备份常用的工具与增量备份差不多,因为都需要完整备份。如果使用dump来备份的话,那么每次备份的等级(level)就都会是level1的意思。当然,你也可以通过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/
再次进行会快很多。如果数据没有改动,几乎不会进行任何操作!
根据分析 [17],差异备份所使用的磁盘容量可能会比增量备份来得大,但是差异备份的还原较快,因为只需要还原完整备份与最近一次的差异备份即可。无论如何,请依据你自己的喜好来选择备份的方式吧!
25.2.3 关键数据备份
完整备份虽然有许多好处,但就是需要花费很多时间!所以,如果在主机提供的服务并不是一定要 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去执行吧!这样子,备份会很轻松。
25.3 鸟哥的备份策略
每台主机的任务都不相同,重要的数据也不相同,重要性也不一样,因此,每个人的备份思考角度都不一样。有些备份策略是非常有趣的,包括使用多个磁带机与磁带来自动备份企业数据 [18]。
就鸟哥的想法来说,鸟哥并没有想要将整个系统完整备份下来,因为太耗时间了。而且就鸟哥的立场而言,似乎也没有这个必要,所以通常鸟哥只备份较为重要的文件而已。不过,由于鸟哥需要备份/home与网页数据,如果天天都备份,我想,系统迟早会受不了(因为这两个部分就已经占去数10GB的硬盘空间),所以鸟哥就将我的备份分为两大部分,一个是每日备份经常性变动的重要数据,一个则是每周备份就不常变动的信息。这个时候我就写了两个简单的script,分别来存储这些数据。
所以针对鸟哥的网站来说,我的备份策略是这样的:
1.主机硬件:使用一个独立的文件系统来存储备份数据,此文件系统挂载到/backup当中;
2.每日进行:目前仅备份MySQL数据库;
3.每周进行:包括/home,/var,/etc,/boot,/usr/local等目录与特殊服务的目录;
4.自动处理:这方面利用/etc/crontab来自动提供备份的进行;
5.远程备份:每月定期将数据分别刻录到光盘上面和使用网络传输到另一台机器上面。
那就来看看鸟哥是怎么备份的吧!
25.3.1 每周系统备份的script
下面提供鸟哥的备份的 script,希望对大家有点帮助。鸟哥假设你已经知道如何挂载一个新的文件系统到/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(理论上,RedHat 系列的 Linux 都适用)默认的服务与目录,如果你有设置某些服务的数据在不同的目录时,那么上面的script是还需要修改的,不要只是拿来用而已。上面script可以在下面的链接取得。
http://linux.vbird.org/linux_basic/0580backup/backupwk-0.1.sh
25.3.2 每日备份数据的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!提供一下我的相关设置!
http://linux.vbird.org/linux_basic/0580backup/backupday.sh
[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很重要的喔!不可以遗失,否则系统的重要数据(尤其是账户信息)流出去可不是闹着玩的!
有些时候,你在进行备份时,被备份的文件可能同时被其他的网络服务所修改喔! 举例来说,当你备份 MySQL 数据库时,刚好有人利用你的数据库发表文章,此时,可能会发生一些错误的信息。要避免这类的问题时,可以在备份前将该服务先关掉,备份完成后,再启动该服务即可。感谢讨论区 duncanlo 提供这个方法!
25.3.3 远程备份的 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 <<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来进行备份的行为吧!重要重要喔!
25.4 灾难恢复的考虑
之所以要备份当然就是预防系统损毁。如果系统真的挂掉的话,那么你该如何还原系统呢?
硬件损毁且具有完整备份的数据时
由于是硬件损毁,所以我们不需要考虑系统软件的不稳定问题,所以可以直接将完整的系统恢复回去即可。首先,你必须要先处理好你的硬件,举例来说,将你的硬盘做个适当的处理,譬如建立成为磁盘阵列之类的,然后依据你的备份状态来恢复。举例来说,如果是使用差异备份,那么将完整备份恢复后,将最后一次的差异备份恢复回去,你的系统就恢复了。非常简单吧!
由于软件的问题产生的被攻破安全事件
由于系统的损毁是因为被攻击,此时即使你恢复到正常的系统,那么这个系统既然会被攻破,没道理你还原成旧系统就不会被再次攻破。所以,此时完整备份的恢复可能不是个好方式。最好是需要这样进行:
1.先拔除网线,最好将系统进行完整备份到其他设备上,以备未来查验;
2.开始查阅日志文件,尝试找出各种可能的问题;
3.开始安装新系统(最好找最新的distribution);
4.进行系统的升级与防火墙相关机制的制订;
5.根据上面找到的错误,安装完成新系统后,将那些bug修复;
6.进行各项服务与相关数据的恢复;
7.正式上线提供服务,并且开始测试。
软件安全事件造成的问题可大可小,一般来说,标准流程都是建议你将出问题的系统备份下来,如果被追踪到你的主机曾经攻击过别人的话,那么你至少可以拿出备份数据来证明你是被攻击者,而不是主动攻击别人的坏人。然后,记得一定要找出问题并予以解决,不然的话,你的系统将一再地被攻击啊!
25.5 重点回顾
备份是系统损毁时等待救援的救星,但造成系统损毁的因素可能有硬件与软件等原因。
由于主机的任务不同,备份的数据与频率等考虑参数也不相同。
常见的备份考虑因素有关键文件、存储设备、备份方式(完整/关键)、备份频率、使用的备份工具等。
常见的关键数据有/etc、/home、/var/spool/mail、/boot、/root等。
存储设备的选择方式需要考虑的地方有备份速度、设备的容量、经费与设备的可靠性等。
与完整备份有关的备份策略主要有增量备份与差异备份。
增量备份可具有较小的存储数据量、备份速度快速等,但是在还原方面则比差异备份的还原慢。
完整备份的策略中,常用的工具有dd、cpio、tar、dump等。
25.6 本章习题
(挑战题)尝试将你在学习本书所进行的各项任务备份下来,然后删除你的系统,接下来重新安装最新的CentOS 5.x,再将你备份的数据恢复回来,看看能否成功地让你的系统恢复到之前的状态。
(挑战题)查询一下何谓企鹅软件,讨论一下该软件的还原机制是属于增量备份还是完整备份。
常用的完整备份(full backup)工具命令有哪些?
你所看到的常见的存储设备有哪些?