9.1. 介绍

虽然 Linux 是现有的最安全的操作系统之一,即使它被设计为持续运行,数据仍然可能会丢失。数据丢失通常是用户错误造成的,但偶尔系统故障,如电源或磁盘故障,也是原因。因此,始终保留敏感和/或重要数据的额外副本是一个好主意。

9.1.1. 准备您的数据

9.1.1.1. 使用 tar 归档

在大多数情况下,我们首先将所有要备份的数据收集到一个单独的归档文件中,稍后我们将对其进行压缩。归档过程包括连接所有列出的文件并删除不必要的空白。在 Linux 中,这通常使用 tar 命令完成。tar 最初设计用于在磁带上归档数据,但它也可以创建归档文件,称为tar 包

tar 有许多选项,最重要的选项如下

  • -v: 详细模式

  • -t: 测试,显示 tar 包的内容

  • -x: 解压归档

  • -c: 创建归档

  • -f archivedevice: 使用archivedevice作为 tar 包的源/目标,设备默认为第一个磁带设备(通常是/dev/st0或类似的设备)

  • -j: 通过 bzip2 过滤,请参阅 第 9.1.1.2 节

通常在使用 tar 选项时省略破折号前缀,如下面的示例所示。

Note使用 GNU tar 以获得兼容性
 

在一个系统上使用专有的 tar 版本制作的归档文件可能与另一个专有系统上的 tar 不兼容。 这可能会导致很多麻烦,例如如果需要在不再存在的系统上恢复归档文件。在所有系统上使用 GNU tar 版本,以防止您的系统管理员崩溃痛哭。Linux 始终使用 GNU tar。在其他 UNIX 机器上工作时,输入 tar --help 以查明您正在使用的版本。如果您没有看到 GNU 字样,请联系您的系统管理员。

在下面的示例中,创建并解压缩了一个归档文件。

gaby:~> ls images/
me+tux.jpg  nimf.jpg

gaby:~> tar cvf images-in-a-dir.tar images/
images/
images/nimf.jpg
images/me+tux.jpg

gaby:~> cd images

gaby:~/images> tar cvf images-without-a-dir.tar *.jpg
me+tux.jpg
nimf.jpg

gaby:~/images> cd

gaby:~> ls */*.tar
images/images-without-a-dir.tar

gaby:~> ls *.tar
images-in-a-dir.tar 

gaby:~> tar xvf images-in-a-dir.tar 
images/
images/nimf.jpg
images/me+tux.jpg

gaby:~> tar tvf images/images-without-dir.tar 
-rw-r--r-- gaby/gaby  42888 1999-06-30 20:52:25 me+tux.jpg
-rw-r--r-- gaby/gaby   7578 2000-01-26 12:58:46 nimf.jpg

gaby:~> tar xvf images/images-without-a-dir.tar 
me+tux.jpg
nimf.jpg

gaby:~> ls *.jpg
me+tux.jpg  nimf.jpg

此示例还说明了 tar 压缩目录和 tar 压缩文件束之间的区别。建议仅压缩目录,这样文件在解压缩 tar 包时不会散布得到处(tar 包可能在另一个系统上,您可能不知道哪些文件已经存在,哪些是来自归档文件的)。

当磁带驱动器连接到您的机器并由您的系统管理员配置时,以.tar结尾的文件名将替换为磁带设备名称,例如

tarcvf /dev/tape mail/

目录mail以及它包含的所有文件都将被压缩到一个立即写入磁带的文件中。由于我们使用了 verbose 选项,因此会显示内容列表。

9.1.1.2. 使用 tar 进行增量备份

tar 工具支持使用-N选项创建增量备份。使用此选项,您可以指定一个日期,tar 将检查所有指定文件的修改时间与此日期进行比较。如果文件更改时间比日期更新,则它们将被包含在备份中。下面的示例使用先前归档文件上的时间戳作为日期值。首先,创建初始归档文件并显示初始备份文件上的时间戳。然后创建一个新文件,在此基础上我们进行新的备份,仅包含此新文件

jimmy:~> tar cvpf /var/tmp/javaproggies.tar java/*.java
java/btw.java
java/error.java
java/hello.java
java/income2.java
java/income.java
java/inputdevice.java
java/input.java
java/master.java
java/method1.java
java/mood.java
java/moodywaitress.java
java/test3.java
java/TestOne.java
java/TestTwo.java
java/Vehicle.java

jimmy:~> ls -l /var/tmp/javaproggies.tar
-rw-rw-r-- 1 jimmy   jimmy   10240 Jan 21 11:58 /var/tmp/javaproggies.tar

jimmy:~> touch java/newprog.java

jimmy:~> tar -N /var/tmp/javaproggies.tar \
-cvp /var/tmp/incremental1-javaproggies.tar java/*.java 2> /dev/null
java/newprog.java

jimmy:~> cd /var/tmp/

jimmy:~> tar xvf incremental1-javaproggies.tar
java/newprog.java

标准错误被重定向到/dev/null。如果您不这样做,tar 将为每个未更改的文件打印一条消息,告诉您它不会被转储。

这种工作方式的缺点是它查看文件上的时间戳。假设您将一个归档文件下载到包含备份的目录中,并且该归档文件包含两年前创建的文件。当将这些文件的时间戳与初始归档文件上的时间戳进行比较时,新文件实际上对于 tar 来说似乎很旧,并且不会包含在使用-N选项进行的增量备份中。

更好的选择是-g选项,它将创建一个要备份的文件列表。在进行增量备份时,文件将根据此列表进行检查。它是这样工作的

jimmy:~> tar cvpf work-20030121.tar -g snapshot-20030121 work/
work/
work/file1
work/file2
work/file3

jimmy:~> file snapshot-20030121
snapshot-20030121: ASCII text

第二天,用户 jimmyfile3上工作了一会儿,并创建了file4。在一天结束时,他进行了新的备份

jimmy:~> tar cvpf work-20030122.tar -g snapshot-20030121 work/
work/
work/file3
work/file4

这些是一些非常简单的示例,但是您也可以在 cronjob 中使用这种命令(请参阅 第 4.4.4 节),它指定例如每周备份的快照文件和每日备份的快照文件。在这种情况下,在进行完整备份时应替换快照文件。

更多信息可以在 tar 文档中找到。

Tip真正的内容
 

正如您可能注意到的,当我们谈论一个简单的目录、一组属于一起的文件时,tar 还可以。但是,当您要归档整个分区或磁盘或更大的项目时,有一些更容易管理的工具。我们在这里解释 tar 只是因为它是一种非常流行的用于分发归档文件的工具。您经常需要安装以所谓的 “压缩 tar 包” 形式提供的软件。有关执行定期备份的更简单方法,请参阅 第 9.3 节

9.1.1.3. 使用 gzipbzip2 压缩和解压缩

数据,包括 tar 包,可以使用 zip 工具进行压缩。gzip 命令将为文件名添加后缀 .gz 并删除原始文件。

jimmy:~> ls -la | grep tar
-rw-rw-r-- 1 jimmy  jimmy    61440 Jun  6 14:08 images-without-dir.tar

jimmy:~> gzip images-without-dir.tar 

jimmy:~> ls -la images-without-dir.tar.gz 
-rw-rw-r-- 1 jimmy  jimmy    50562 Jun  6 14:08 images-without-dir.tar.gz

使用-d选项进行的增量备份中。

解压缩 gzipped 文件。bzip2 的工作方式类似,但使用改进的压缩算法,从而创建更小的文件。有关更多信息,请参阅 bzip2 信息页。

Linux 软件包通常以 gzipped tar 包的形式分发。解压缩此类归档文件后,明智的做法是找到README并阅读它。它通常包含安装软件包的指南。

GNU tar 命令可以识别 gzipped 文件。使用命令

tarzxvf file.tar.gz

用于解压缩和解 tar.tar.gz.tgz文件。使用

tarjxvf file.tar.bz2

用于解压缩使用 bzip2 压缩的 tar 归档文件。

9.1.1.4. Java 归档文件

GNU 项目为我们提供了 jar 工具,用于创建 Java 归档文件。它是一个 Java 应用程序,可将多个文件组合成单个 JAR 归档文件。虽然它也是一种通用的归档和压缩工具,基于 ZIP 和 ZLIB 压缩格式,但 jar 主要设计用于方便地将 Java 代码、applets 和/或应用程序打包到单个文件中。当组合在单个归档文件中时,Java 应用程序的组件可以更快地下载。

tar 不同,jar 默认情况下会进行压缩,独立于其他工具 - 因为它基本上是 Java 版本的 zip。此外,它允许归档文件中的单个条目由作者签名,以便可以验证来源。

语法几乎与 tar 命令相同,有关具体差异,请参阅 info jar

Notetar、jar 和符号链接
 

一个标准文档中没有真正提及的值得注意的功能是 jar 将跟随符号链接。这些链接指向的数据将包含在归档文件中。tar 中的默认设置是仅备份符号链接,但可以使用-h来更改 tar 的行为。

9.1.1.5. 传输您的数据

将数据的副本保存在另一台主机上是一种简单但准确的备份方法。有关 scpftp 等的更多信息,请参阅 第 10 章

在下一节中,我们将讨论本地备份设备。