linux系统备份(服务器开发思路)详解


 

一、前提说明

做linux服务器开发时,一个很重要的思想是:“备份”。当我们的数据非常重要时,更是需要多处备份。但是,并不仅仅局限于数据备份,系统备份也非常重要。比如说手机SDK开发厂商,一个非常重要的工作是:给用户提供系统升级功能。这就要求工程师经常性对同一个SDK修改、编译、做差异包,最后才发布给用户升级。但是,假如在这过程中发生了一些事故:系统环境改变了,SDK包结构改变了、或者整个系统崩溃了,这将导致工程师要重新全编译整个SDK包。虽然可以编译通过,但是将不能使用系统升级功能,给商家带来重大的售后问题。所以,作为服务器开发者,我们该如何做好系统与数据的备份工作才能做到百分之百不会出错呢?下面我将分为两个方面谈,如果说得不好还请谅解 。

二、备份思路

做服务器开发时,我们最好系统跟数据分开保存。什么意思呢?我们需要至少三个硬盘,一个专门用来安装系统,一个盘来装数据,比如SDK编译包,一个盘做系统备份盘,这样三个盘如果有的挂掉了我们还能找回数据。系统盘所要做的工作是提供编译环境,一旦编译环境装好之后我们就不要去动它,以防环境变化导致SDK全编译。数据盘的工作是让你做编译数据存储测试,是你的主要工作盘。备份盘当然是数据盘的数据备份的地方啦~至于三个盘要怎么联系起来的,当然是挂载了。我们备份系统时分为两种情况,一种是在系统没有挂掉的情况下可以像window中恢复备份点的形式做系统恢复,一种是当系统完全找不回来时重装系统设置完全一样的系统环境保证SDK不用全编译。

三、数据备份

这里我们备份的是整个SDK编译包,为了保证恢复备份时数据环境完全一样,即不需要全编译整个SDK,执行:

 

    tar cvpzf sdk_backup.tgz 资源包

 

    tar xvpfz sdk_backup.tgz -C /目标目录

第一个是将整个包压缩成一个压缩包,第二个是将压缩包解压出来,这样解压出来的SDK包将不会重新全编译。具体命令参数的意义参考第四步解释。数据记得备份到备份盘哦。

四、系统备份(在系统可以拯救的情况下)

在使用linux之前,相信很多人都有过使用Windows系统的经历。如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工具(通常都是私有软件),然后重启电脑进入备份工具提供的软件环境,在这里备份或者恢复Windows系统。Norton Ghost是备份Windows系统时经常使用的备份工具。在备份Windows系统的时候你可能想过,我能不能把整个C盘都放到一个ZIP文件里去呢。这在Windows下是不可能的,因为在Windows中有很多文件在它们运行时是不允许拷贝或覆盖的,因此你需要专门的备份工具对Windows系统进行特殊处理。和备份Windows系统不同,如果你要备份Ubuntu系统(或者其它任何Linux系统),你不再需要像Ghost这类备份工具。事实上,Ghost 这类备份工具对于Linux文件系统的支持很糟糕,例如一些Ghost版本只能完善地支持Ext2文件系统,如果你用它来备份Ext3文件系统,你可能会丢失一些宝贵的数据。如果我们是在编译类似手机SDK开发时,系统环境一定不能改变,我们可以将整个操作系统备份起来,当发生问题时再像window一样恢复备份即可。

1. 备份系统
我该如何备份我的linux系统呢?很简单,就像你备份或压缩其它东西一样,使用TAR。和Windows不同,Linux不会限制root访问任何东西,你可以把分区上的所有东西都扔到一个TAR文件里去!
首先成为root用户:

     sudo su
然后进入文件系统的根目录(当然,如果你不想备份整个文件系统,你也可以进入你想要备份的目录,包括远程目录或者移动硬盘上的目录):
     cd /
下面是我用来备份系统的完整命令:
    tar cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --e  xclude=/sys /
让我们来简单看一下这个命令:
“tar”当然就是我们备份系统所使用的程序了。
“cvpfz”是tar的选项,意思是“创建档案文件”、“保持权限”(保留所有东西原来的权限)、“使用gzip来减小文件尺寸”。
“backup.gz”是我们将要得到的档案文件的文件名。
“/”是我们要备份的目录,在这里是整个文件系统。
在档案文件名“backup.gz”和要备份的目录名“/”之间给出了备份时必须排除在外的目录。有些目录是无用的,例如“/proc”、“ /lost+found”、“/sys”。当然,“backup.gz”这个档案文件本身必须排除在外,否则你可能会得到一些超出常理的结果。如果不把“ /mnt”排除在外,那么挂载在“/mnt”上的其它分区也会被备份。另外需要确认一下“/media”上没有挂载任何东西(例如光盘、移动硬盘),如果有挂载东西,必须把“/media”也排除在外。
有人可能会建议你把“/dev”目录排除在外,但是我认为这样做很不妥,具体原因这里就不讨论了。
执行备份命令之前请再确认一下你所键入的命令是不是你想要的。执行备份命令可能需要一段不短的时间。
备份完成后,在文件系统的根目录将生成一个名为“backup.tgz”的文件,它的尺寸有可能非常大。现在你可以把它烧录到DVD上或者放到你认为安全的地方去。
在备份命令结束时你可能会看到这样一个提示:'tar: Error exit delayed from previous errors',多数情况下你可以忽略它。
你还可以用Bzip2来压缩文件,Bzip2比gzip的压缩率高,但是速度慢一些。如果压缩率对你来说很重要,那么你应该使用Bzip2,用“j”代替命令中的“z”,并且给档案文件一个正确的扩展名“bz2”。完整的命令如下:
    tar cvpjf backup.tar.bz2 --exclude=/proc --exclude=/lost+found --exclude=/backup.tar.bz2 --exclude=/mnt --exclude=/sys /
2. 恢复系统
在进行恢复系统的操作时一定要小心!如果你不清楚自己在做什么,那么你有可能把重要的数据弄丢,请务必小心!
接着上面的例子。切换到root用户,并把文件“backup.tgz”拷贝到分区的根目录下。
在Linux中有一件很美妙的事情,就是你可以在一个运行的系统中恢复系统,而不需要用boot-cd来专门引导。当然,如果你的系统已经挂掉不能启动了,你可以用Live CD来启动(不明白这个概念的可以点击这里),效果是一样的。你还可以用一个命令把Linux系统中的所有文件干掉,当然在这里我不打算给出这个命令!
使用下面的命令来恢复系统:
    tar xvpfz backup.tgz -C /

如果你的档案文件是使用Bzip2压缩的,应该用:

    tar xvpfj backup.tar.bz2 -C /
注意:上面的命令会用档案文件中的文件覆盖分区上的所有文件。
执行恢复命令之前请再确认一下你所键入的命令是不是你想要的,执行恢复命令可能需要一段不短的时间。
恢复命令结束时,如果一下目录不存在,别忘了重新创建那些在备份时被排除在外的目录:
    mkdir proc
    mkdir lost+found
    mkdir mnt
    mkdir sys</span>
当你重启电脑,你会发现一切东西恢复到你创建备份时的样子了!

五、重装系统(当系统无论如何也救不了的情况下)

当我们系统完全崩溃了,比如说整个硬盘坏了怎么办?不要急,只要你按照我第三部的方式将SDK包压缩保存好,你就能恢复以前的编译环境。整体思路就是搞一个完全一模一样的系统出来!

1、重装系统

使用与原来系统一样的镜像文件重装好整个系统(不一样的镜像没测试过,一样的镜像测试通过)。

2、安装编译环境

使用与原来一样的环境包配好编译环境,当然以前的环境包你要做好备份咯~

3、建立一样的目录结构

将备份好的压缩包解压到完全一样的包目录中。

只要你做好了以上三步,你可以大胆到新的系统中编译刚解压出来的SDK包,将不会重新编译,你的工作将会继续进行,但是前提是你以前装系统的镜像与环境包要有备份哦!

六、磁盘的挂载与卸载

第二步备份思路中指出,系统盘、数据盘、备份盘是独立分开的,要想操作的话必须要挂载,具体怎么挂载?

1、新建需要挂载的目录

   mkdir /mnt/data_dardisk
   mkdir /mnt/backup_dardisk
2、查看所有磁盘

 

  fdisk -l
3、挂载磁盘
  mount /dev/sdb1  /mnt/data_dardisk
  mount /dev/sdb1  /mnt/backup_dardisk
第一个参数是是你的磁盘号,第二个参数是你要挂载的目录

4、如果你的磁盘号找不到可以尝试执行:

  parted /dev/sdb print

第二个参数是你要查看的磁盘号。或者:

   /proc/partitions
5、查看是否挂在成功
   df -k
6、如果你不想手动挂载,希望开机自动挂载的话,执行:
   vi /etc/fstab
在最后一样加上
   /dev/sdb1    /mnt/data_dardisk      ext4    defaults        0      0
   /dev/sdc1    /mnt/backup_dardisk    ext4    defaults        0      0
第一个参数是磁盘符号,第二个是要挂在的目录,第三个是彼得磁盘格式,其他默认以上即可。

到此,整个博客就写完了。这是我的个人理解,如果对你有帮助的话更好,如果你有更好的思路的话请指正。





 

相关内容