虽然 Linux 是现有的最安全的操作系统之一,即使它被设计为持续运行,数据仍然可能会丢失。数据丢失通常是用户错误造成的,但偶尔系统故障,如电源或磁盘故障,也是原因。因此,始终保留敏感和/或重要数据的额外副本是一个好主意。
在大多数情况下,我们首先将所有要备份的数据收集到一个单独的归档文件中,稍后我们将对其进行压缩。归档过程包括连接所有列出的文件并删除不必要的空白。在 Linux 中,这通常使用 tar 命令完成。tar 最初设计用于在磁带上归档数据,但它也可以创建归档文件,称为tar 包。
tar 有许多选项,最重要的选项如下
-v: 详细模式
-t: 测试,显示 tar 包的内容
-x: 解压归档
-c: 创建归档
-f archivedevice: 使用archivedevice作为 tar 包的源/目标,设备默认为第一个磁带设备(通常是/dev/st0或类似的设备)
-j: 通过 bzip2 过滤,请参阅 第 9.1.1.2 节
通常在使用 tar 选项时省略破折号前缀,如下面的示例所示。
![]() | 使用 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 选项,因此会显示内容列表。
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 |
第二天,用户 jimmy 在file3上工作了一会儿,并创建了file4。在一天结束时,他进行了新的备份
jimmy:~> tar cvpf work-20030122.tar -g snapshot-20030121 work/ work/ work/file3 work/file4 |
这些是一些非常简单的示例,但是您也可以在 cronjob 中使用这种命令(请参阅 第 4.4.4 节),它指定例如每周备份的快照文件和每日备份的快照文件。在这种情况下,在进行完整备份时应替换快照文件。
更多信息可以在 tar 文档中找到。
![]() | 真正的内容 |
---|---|
正如您可能注意到的,当我们谈论一个简单的目录、一组属于一起的文件时,tar 还可以。但是,当您要归档整个分区或磁盘或更大的项目时,有一些更容易管理的工具。我们在这里解释 tar 只是因为它是一种非常流行的用于分发归档文件的工具。您经常需要安装以所谓的 “压缩 tar 包” 形式提供的软件。有关执行定期备份的更简单方法,请参阅 第 9.3 节。 |
数据,包括 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 归档文件。
GNU 项目为我们提供了 jar 工具,用于创建 Java 归档文件。它是一个 Java 应用程序,可将多个文件组合成单个 JAR 归档文件。虽然它也是一种通用的归档和压缩工具,基于 ZIP 和 ZLIB 压缩格式,但 jar 主要设计用于方便地将 Java 代码、applets 和/或应用程序打包到单个文件中。当组合在单个归档文件中时,Java 应用程序的组件可以更快地下载。
与 tar 不同,jar 默认情况下会进行压缩,独立于其他工具 - 因为它基本上是 Java 版本的 zip。此外,它允许归档文件中的单个条目由作者签名,以便可以验证来源。
语法几乎与 tar 命令相同,有关具体差异,请参阅 info jar。
![]() | tar、jar 和符号链接 |
---|---|
一个标准文档中没有真正提及的值得注意的功能是 jar 将跟随符号链接。这些链接指向的数据将包含在归档文件中。tar 中的默认设置是仅备份符号链接,但可以使用-h来更改 tar 的行为。 |