Chinaunix首页 | 论坛 | 博客
  • 博客访问: 574577
  • 博文数量: 107
  • 博客积分: 4406
  • 博客等级: 上校
  • 技术积分: 1279
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-07 16:20
文章分类

全部博文(107)

文章存档

2014年(4)

2012年(4)

2011年(16)

2010年(7)

2009年(7)

2008年(11)

2007年(49)

2006年(9)

分类: LINUX

2007-12-13 22:06:27

linux下的数据备份
  • 制定备份策略
  • 将原始设备转储到文件,或从文件恢复原始设备
  • 执行部分备份和手工备份
  • 检验备份文件的完整性
  • 从备份部分地或完全恢复文件系统

完善的备份是系统管理的必要部分,但是决定对什么进行备份以及何时和如何备份可能很复杂。数据库(比如客户订单或库存)常常对企业非常重要,许多数据库包含专用的备份和恢复工具,这些工具超出了本教程的范围。在另一个极端,一些文件是临时的,根本不需要备份。在本节中,我们主要关注系统文件和用户数据,并讨论数据备份的一些考虑事项、方法和工具。

有三种备份方式:

  1. 全(full) 备份是整个文件系统、目录或相关文件组的完整备份。创建全备份花费的时间最长,所以常常与另外两种方式之一结合使用。

  2. 差异(differential)累计(cumulative) 备份是上一次全备份以来修改过的所有内容的备份。在进行恢复时,需要最近的全备份和最新的差异备份。

  3. 增量(incremental) 备份只备份上一次增量备份以来的修改。在进行恢复时,需要最近的全备份以及上一次全备份以来的所有增量备份(按次序)。

在决定对什么进行备份时,应该考虑数据变化的频繁程度。这会帮助您决定数据备份的频率。与不太重要的数据相比,重要的数据应该更频繁地备份。操作系统可能很容易重新构建,尤其是在为几个系统使用同一映像的情况下,而对系统进行定制的文件应该是备份的重点。

对于编程人员来说,保留存储库(比如 CVS 存储库)的备份可能就足够了,各个程序员的沙箱可能不太重要。根据邮件对操作的重要性,可能设置不太频繁的备份就够了,也可能需要能够将邮箱恢复到尽可能近的日期。可能希望备份系统 cron 文件,但是不太关心各个用户的调度作业。

Filesystem Hierarchy Standard 提供了一个数据分类方法,这可以帮助您做出备份选择。细节参见教程 “LPI 101 考试准备:设备、Linux 文件系统和文件系统层次标准”。

决定了对什么进行备份之后,就需要决定进行全备份的频率,以及在这些全备份之间是否进行差异备份或增量备份。做了这些决定之后,下面的建议将帮助您选择合适的工具。

在前一节中,您学习了如何调度作业,而 cron 设施很适合自动执行备份调度。但是,备份常常涉及可移除介质,尤其是磁带,所以可能需要操作员干预。应该创建并使用备份脚本,确保备份过程尽可能自动化且可重复。





回页首


对文件系统进行全备份的一种方法是,制作它所在的分区的映像。可以作为一个顺序文件打开并读取原始设备(raw device),比如 /dev/hda1 或 /dev/sda2。同样,可以作为一个顺序文件从备份写原始设备。这不要求备份工具了解文件系统的布局,但是要求恢复到的空间至少与原来的空间一样大。一些处理原始设备的工具是文件系统感知的(filesystem aware),这意味着它们能够理解一个或多个 Linux 文件系统。这些实用程序可以转储原始设备,但是不转储分区中未使用的部分。它们可能要求恢复到相同或更大的分区,也可能不这么要求。dd 命令属于第一类备份工具,dump 命令属于第二类备份工具,它专门针对 ext2 和 ext3 文件系统。

在最简单的形式下,dd 命令将一个输入文件复制到一个输出文件,这两个文件都可以是原始设备。在备份原始设备时,比如 /dev/hda1 或 /dev/sda2,输入文件就是原始设备。在理想情况下,设备上的文件系统应该是未挂装的,至少应该是只读挂装的,从而确保在备份期间数据不会改变。清单 39 给出一个示例。



                    
[root@lyrebird ~]# dd if=/dev/sda3 of=backup-1
2040255+0 records in
2040255+0 records out
1044610560 bytes (1.0 GB) copied, 49.3103 s, 21.2 MB/s

ifof 参数分别指定输入和输出文件。在这个示例中,输入文件是一个原始设备 dev/sda3,输出文件是根用户的主目录中的一个文件 backup-1。要将文件转储到磁带或软盘,应该指定 of=/dev/fd0of=/dev/st0 这样的设置。

注意,这里复制了 1,044,610,560 字节的数据,而且输出文件确实是这么大,但是这个分区中只有大约 3% 的空间实际使用了。除非要通过硬件压缩复制到磁带,否则很可能希望执行数据压缩。清单 40 给出一种数据压缩方法,并显示 lsdf 命令的输出,这些输出显示 /dev/sda3 上的文件大小和文件系统利用率。



                    
[root@lyrebird ~]# dd if=/dev/sda3 | gzip > backup-2
2040255+0 records in
2040255+0 records out
1044610560 bytes (1.0 GB) copied, 117.723 s, 8.9 MB/s
[root@lyrebird ~]# ls -l backup-[12]
-rw-r--r-- 1 root root 1044610560 2007-07-08 15:17 backup-1
-rw-r--r-- 1 root root  266932272 2007-07-08 15:56 backup-2
[root@lyrebird ~]# df -h /dev/sda3
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             972M   28M  944M   3% /grubfile

gzip 压缩将文件大小减小到未压缩文件的大约 20%。但是,未使用的块可能包含任意数据,所以压缩的备份仍然比分区上的数据总量大得多。

如果将大小除以 dd 处理的记录数,就会发现 dd 按照 512 字节的块大小写数据。在复制到磁带这样的原始设备时,这会导致操作效率很低,所以 dd 可以按照更大的块大小读写数据。指定 obs 选项来改变输出块大小,使用 ibs 选项指定输入块大小。还可以指定 bs,将输入和输出块大小设置为相同的值。

如果需要多个磁带或其他可移除存储介质来存储备份,那么需要用 split 这样的实用程序将备份分割为比较小的文件。

如果需要跳过磁盘或磁带标签等块,可以使用 dd 来设置。参见手册页中的示例。

除了复制数据之外,dd 命令还可以执行几种转换,比如 ASCII 和 EBCDIC 之间、big-endian 和 little-endian 之间或可变长度数据记录和固定长度数据记录之间的转换。显然,在复制真实文件(而不是原始设备)时,这些转换可能有用。细节参见手册页。

可以使用 dump 命令在 ext2 或 ext3 文件系统上执行全备份、差异备份或增量备份。清单 41 给出一个示例。



                    
[root@lyrebird ~]# dump -0 -f backup-4 -j -u /dev/sda3
  DUMP: Date of this level 0 dump: Sun Jul  8 16:47:47 2007
  DUMP: Dumping /dev/sda3 (/grubfile) to backup-4
  DUMP: Label: GRUB
  DUMP: Writing 10 Kilobyte records
  DUMP: Compressing output at compression level 2 (bzlib)
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 12285 blocks.
  DUMP: Volume 1 started with block 1 at: Sun Jul  8 16:47:48 2007
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing backup-4
  DUMP: Volume 1 completed at: Sun Jul  8 16:47:57 2007
  DUMP: Volume 1 took 0:00:09
  DUMP: Volume 1 transfer rate: 819 kB/s
  DUMP: Volume 1 12260kB uncompressed, 7377kB compressed, 1.662:1
  DUMP: 12260 blocks (11.97MB) on 1 volume(s)
  DUMP: finished in 9 seconds, throughput 1362 kBytes/sec
  DUMP: Date of this level 0 dump: Sun Jul  8 16:47:47 2007
  DUMP: Date this dump completed:  Sun Jul  8 16:47:57 2007
  DUMP: Average transfer rate: 819 kB/s
  DUMP: Wrote 12260kB uncompressed, 7377kB compressed, 1.662:1
  DUMP: DUMP IS DONE
[root@lyrebird ~]# ls -l backup-[2-4]
-rw-r--r-- 1 root root 266932272 2007-07-08 15:56 backup-2
-rw-r--r-- 1 root root 266932272 2007-07-08 15:44 backup-3
-rw-r--r-- 1 root root   7554939 2007-07-08 16:47 backup-4

在这个示例中,-0 指定转储级别(dump level),这是一个 0 到 9 之间的整数,0 表示全转储。-f 选项指定输出文件,这可以是原始设备。指定 - 将输出定向到 stdout。-j 选项指定压缩,默认的压缩级别是 2,使用 bzlib 压缩。如果愿意,也可以使用 -z 选项指定 zlib 压缩。-u 选项更新转储信息的记录(通常是 /etc/dumpdates)。选项后面的参数表示一个文件或文件列表,文件也可以是原始设备。注意,如果备份程序能够感知文件系统结构,备份就会小很多,因为可以避免保存设备上未使用的块。

如果输出到磁带这样的设备,当每个卷写满时,dump 命令会提示您提供另一个卷。也可以提供逗号分隔的多个文件名。例如,如果要进行一次无人值守的转储,它需要两个磁带,那么可以将磁带装在 /dev/st0 和 /dev/st1 上,调度转储命令并指定这两个磁带作为输出,然后您就可以回家睡觉了。

如果指定大于 0 的转储级别,那么会对最近一次低级别转储之后新增或修改过的所有文件执行增量转储。所以 1 级转储是差异转储,即使在这段时间内执行了 2 级或更高级别的转储。清单 42 更新 /dev/sda3 上一个现有文件的时间戳并创建一个新文件,然后执行 2 级转储。在此之后,创建另一个新文件并执行 1 级转储。还显示了来自 /etc/dumpdates 的信息。为了简单,省略了第二个转储输出的部分内容。



                    
[root@lyrebird ~]# dump -2 -f backup-5 -j -u /dev/sda3
  DUMP: Date of this level 2 dump: Sun Jul  8 16:55:46 2007
  DUMP: Date of last level 0 dump: Sun Jul  8 16:47:47 2007
  DUMP: Dumping /dev/sda3 (/grubfile) to backup-5
  DUMP: Label: GRUB
  DUMP: Writing 10 Kilobyte records
  DUMP: Compressing output at compression level 2 (bzlib)
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 91 blocks.
  DUMP: Volume 1 started with block 1 at: Sun Jul  8 16:55:47 2007
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing backup-5
  DUMP: Volume 1 completed at: Sun Jul  8 16:55:47 2007
  DUMP: 90 blocks (0.09MB) on 1 volume(s)
  DUMP: finished in less than a second
  DUMP: Date of this level 2 dump: Sun Jul  8 16:55:46 2007
  DUMP: Date this dump completed:  Sun Jul  8 16:55:47 2007
  DUMP: Average transfer rate: 0 kB/s
  DUMP: Wrote 90kB uncompressed, 15kB compressed, 6.000:1
  DUMP: DUMP IS DONE
[root@lyrebird ~]# echo "This data is even newer" >/grubfile/newerfile
[root@lyrebird ~]# dump -1 -f backup-6 -j -u -A backup-6-toc /dev/sda3
  DUMP: Date of this level 1 dump: Sun Jul  8 17:08:18 2007
  DUMP: Date of last level 0 dump: Sun Jul  8 16:47:47 2007
  DUMP: Dumping /dev/sda3 (/grubfile) to backup-6
   ...
  DUMP: Wrote 100kB uncompressed, 16kB compressed, 6.250:1
  DUMP: Archiving dump to backup-6-toc
  DUMP: DUMP IS DONE
[root@lyrebird ~]# ls -l backup-[4-6]
-rw-r--r-- 1 root root 7554939 2007-07-08 16:47 backup-4
-rw-r--r-- 1 root root   16198 2007-07-08 16:55 backup-5
-rw-r--r-- 1 root root   16560 2007-07-08 17:08 backup-6
[root@lyrebird ~]# cat /etc/dumpdates
/dev/sda3 0 Sun Jul  8 16:47:47 2007 -0400
/dev/sda3 2 Sun Jul  8 16:55:46 2007 -0400
/dev/sda3 1 Sun Jul  8 17:08:18 2007 -0400

注意,backup-6 确实比 backup-5 大。1 级转储使用 -A 选项创建一个内容目录,可以用它判断一个存档中是否包含某个文件,而不需要实际挂装这个存档。这对于磁带或其他可移除存档卷尤其有意义。在本节后面讨论数据恢复时,将看到一些示例。

dump 命令可以转储文件或子目录,但是不能更新 /etc/dumpdates,而且只支持 0 级全转储。

清单 43 使用 dump 命令将一个目录(/usr/include/bits)及其内容转储到软盘上。在这个示例中,一张软盘装不下整个转储,所以需要一个新卷。提示和响应用粗体显示。



                    
[root@lyrebird ~]# dump -0 -f /dev/fd0 /usr/include/bits
  DUMP: Date of this level 0 dump: Mon Jul  9 16:03:23 2007
  DUMP: Dumping /dev/sdb9 (/ (dir usr/include/bits)) to /dev/fd0
  DUMP: Label: /
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 2790 blocks.
  DUMP: Volume 1 started with block 1 at: Mon Jul  9 16:03:30 2007
  DUMP: dumping (Pass III) [directories]
  DUMP: End of tape detected
  DUMP: Closing /dev/fd0
  DUMP: Volume 1 completed at: Mon Jul  9 16:04:49 2007
  DUMP: Volume 1 1470 blocks (1.44MB)
  DUMP: Volume 1 took 0:01:19
  DUMP: Volume 1 transfer rate: 18 kB/s
  DUMP: Change Volumes: Mount volume #2
  DUMP: Is the new volume mounted and ready to go?: ("yes" or "no") y
  DUMP: Volume 2 started with block 1441 at: Mon Jul  9 16:05:10 2007
  DUMP: Volume 2 begins with blocks from inode 2
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Closing /dev/fd0
  DUMP: Volume 2 completed at: Mon Jul  9 16:06:28 2007
  DUMP: Volume 2 1410 blocks (1.38MB)
  DUMP: Volume 2 took 0:01:18
  DUMP: Volume 2 transfer rate: 18 kB/s
  DUMP: 2850 blocks (2.78MB) on 2 volume(s)
  DUMP: finished in 109 seconds, throughput 26 kBytes/sec
  DUMP: Date of this level 0 dump: Mon Jul  9 16:03:23 2007
  DUMP: Date this dump completed:  Mon Jul  9 16:06:28 2007
  DUMP: Average transfer rate: 18 kB/s
  DUMP: DUMP IS DONE

如果备份到磁带,那么要记住磁带常常在每个操作之后回卷(rewind)。使用 /dev/st0 或 /dev/st1 这样的名称的设备会自动回卷。对应的非回卷设备是 /dev/nst0 和 /dev/nst1。在任何时候,都可以使用 mt 命令执行磁带操作,比如前进、后退、回卷和写 EOF 标志。关于 mtst 的更多信息参见手册页。

如果恰当地选择了转储级别,就可以尽可能减少恢复到任何级别所需的存档数量。在 dump 手册页中提供了一种基于 Towers of Hanoi 迷题的建议。

dd 命令一样,还有许多选项没有在这里讨论。更多细节参见手册页。





回页首


到目前为止,已经学习了用来备份整个文件系统的工具。有时候,需要备份选择的文件或子目录,而不是备份整个文件系统。例如,可能需要每周备份系统的大多数部分,但是每天备份邮件文件。通常使用另两个程序 cpiotar 执行这样的操作。这两个程序可以将存档写到文件或设备(比如磁带或软盘),它们还可以从这些存档执行恢复。在这两个程序之中,tar 更常用,这可能是因为它能够更好地处理完整的目录,而且 GNU tar 支持 gzip 和 bzip 压缩。

cpio 命令采用 copy-out 模式创建存档,用 copy-in 模式恢复存档,用 copy-pass 模式将一组文件从一个位置复制到另一个位置。对于 copy-out 模式使用 -o--create 选项,对于 copy-in 模式使用 -i--extract 选项,对于 copy-pass 模式使用 -p--pass-through 选项。输入是通过 stdin 提供的一系列文件。输出发送到 stdout,或者发送到 -f--file 选项指定的设备或文件。

清单 44 演示如何使用 find 命令生成一个文件列表。注意,在 find 中使用 -print0 选项生成 null 结尾的文件名字符串,在 cpio 上使用 --null 选项读取这种格式。这样就可以正确地处理包含空格或换行符的文件名。



                    
[root@lyrebird ~]#  find ~ian -depth -print0 | cpio --null -o >backup-cpio-1
18855 blocks

如果希望在文件存档时列出文件,可以在 cpio 中添加 -v 选项。

与可以存档到磁带的其他命令一样,可以指定块大小。其他选项的细节参见手册页。

tar(这个名称源自 Tape ARchive)从一组输入文件或目录创建一个存档文件,也称为 tarfiletarball;它还可以从这样的存档恢复文件。如果提供一个目录作为 tar 的输入,那么会自动包含其中的所有文件和子目录,所以使用 tar 存档目录结构的子树是非常方便的。

与前面讨论的其他存档命令一样,输出可以发送到文件、磁带或磁盘等设备或 stdout。输出位置用 -f 选项指定。常用的其他选项包括:-c 用于创建存档,-x 用于提取存档,-v 提供详细输出,它会列出正在处理的文件,-z 执行 gzip 压缩,-j 执行 bzip2 压缩。大多数 tar 选项有短格式(使用一个连字符)和长格式(使用两个连字符)。这里解释短格式。关于长格式和其他选项的信息参见手册页。

清单 45 演示如何使用 tar 创建系统 cron 作业的备份。



                    
[root@lyrebird ~]# tar -czvf backup-tar-1 /etc/*crontab /etc/cron.d
tar: Removing leading `/' from member names
/etc/anacrontab
/etc/crontab
/etc/cron.d/
/etc/cron.d/sa-update
/etc/cron.d/smolt

在输出的第一行上指出,tar 将删除成员名中的前导斜线(/)。这允许在替换系统文件之前将文件恢复到其他位置进行检查。在创建存档时,最好避免混合使用绝对路径名和相对路径名,因为从存档恢复文件时所有路径都是相对的。

tar 命令可以使用 -r--append 选项在存档中追加文件。这可能导致一个存档中出现一个文件的多个副本。在这种情况下,在恢复操作期间将恢复最近的 副本。可以使用 --occurrence 选项在多个副本中选择特定的文件。如果存档在常规文件系统而不是磁带上,那么可以使用 -u--update 选项更新存档。这与在存档中追加文件相似,不同之处在于,会对存档中文件的时间戳和文件系统中的时间戳进行比较,并只追加那些在存档版本之后修改过的文件。正如前面提到的,这不适用于磁带存档。

与前面讨论的其他命令一样,还有许多选项没有在这里讨论。更多细节参见手册页。





回页首


备份文件的完整性极其重要。如果备份文件是坏的,备份就没有意义了。良好的备份策略应该检查备份。

确保备份完整性的第一步是,确保正确地捕捉了要备份的数据。如果文件系统未挂装或采用只读挂装,这往往很容易,因为在备份期间要备份的数据不会发生变化。如果在进行备份时要备份的文件系统、目录或文件可能发生修改,那么应该确认在备份期间没有发生修改。如果发生了修改,就需要捕捉这些修改的策略,可以重复执行备份,也可以替换备份中受影响的文件。无论如何,这也会影响恢复过程。

为了确保备份是良好的,需要定期检查备份。一种方法是,将备份恢复到空闲的卷并检查其内容。最好先进行这样的检查,然后再在备份的文件系统上允许更新。如果备份到 CD 或 DVD 这样的介质,那么可以在备份过程中使用 diff 命令来确保备份是良好的。请记住,良好的备份在存储中也可能损坏,所以即使在备份时做了检查,也应该定期进行检查。使用 md5sumsha1sum 等程序生成摘要也有助于检查备份文件的完整性。





回页首


与文件备份功能相对的功能就是在需要时恢复它们。有时候希望恢复整个文件系统,但更常见的情况是只需要恢复特定的文件或目录。在一般情况下,会先将文件恢复到某个临时空间,确认恢复的内容确实是您需要的,而且与系统的当前状态一致,然后再将恢复的文件放到正确的位置。

一个相关问题是,需要确认您需要的文件版本确实包含在某个备份文件中,因为用户常常需要访问 “在过去一两周内” 修改过或删除的一个文件版本。考虑到这些问题,我们来介绍一些恢复选项。

dd 命令不是文件系统感知的,所以需要先恢复一个分区的转储,然后才能了解其中的内容。清单 46 将前面清单 39 转储的分区恢复到分区 /dev/sdc7,这个分区是在一个可移除的 USB 驱动器上专门为此创建的。



                    
[root@lyrebird ~]# dd if=backup-1 of=/dev/sdc7
2040255+0 records in
2040255+0 records out
1044610560 bytes (1.0 GB) copied, 44.0084 s, 23.7 MB/s

在建立这个备份之后,我们在 /dev/sda3 上的文件系统中添加了一些文件。如果挂装刚恢复的分区并与原来的分区进行比较,就会发现它们确实有差异,见清单 47。注意,用 touch 更新了时间戳的文件没有在这里出现。



                    
[root@lyrebird ~]# mount /dev/sdc7 /mnt/temp-dd/
[root@lyrebird ~]# diff -rq /grubfile/ /mnt/temp-dd/
Only in /grubfile/: newerfile
Only in /grubfile/: newfile

我们在前面使用 dump 做了一次差异备份,还创建了一个内容目录。清单 48 使用 restore 检查 dump 创建的存档中的文件,并且是通过使用存档本身(backup-5)和内容目录(backup-6-toc)两种方式。



                    
[root@lyrebird ~]# restore -t -f backup-5
Dump tape is compressed.
Dump   date: Sun Jul  8 16:55:46 2007
Dumped from: Sun Jul  8 16:47:47 2007
Level 2 dump of /grubfile on lyrebird.raleigh.ibm.com:/dev/sda3
Label: GRUB
         2      .
    100481      ./ibshome
    100482      ./ibshome/index.html
        16      ./newfile
[root@lyrebird ~]# restore -t -A backup-6-toc
Dump   date: Sun Jul  8 17:08:18 2007
Dumped from: Sun Jul  8 16:47:47 2007
Level 1 dump of /grubfile on lyrebird.raleigh.ibm.com:/dev/sda3
Label: GRUB
Starting inode numbers by volume:
        Volume 1: 2
         2      .
    100481      ./ibshome
    100482      ./ibshome/index.html
        16      ./newfile
        17      ./newerfile

restore 命令还可以使用 -C 选项比较存档的内容和文件系统的内容。在清单 49 中,我们更新了 newerfile,然后比较备份和文件系统。



                    
[root@lyrebird ~]# echo "something different" >/grubfile/newerfile
[root@lyrebird ~]# restore -C -f backup-6
Dump tape is compressed.
Dump   date: Sun Jul  8 17:08:18 2007
Dumped from: Sun Jul  8 16:47:47 2007
Level 1 dump of /grubfile on lyrebird.raleigh.ibm.com:/dev/sda3
Label: GRUB
filesys = /grubfile
./newerfile: size has changed.
Some files were modified!  1 compare errors

restore 命令可以执行交互式恢复或自动恢复。清单 50 将 newerfile 恢复到根用户的主目录(这样就可以在用它替换更新的文件之前检查它),然后用备份副本替换更新的文件。这个示例演示交互式恢复。



                    
[root@lyrebird ~]# restore -i -f backup-6
Dump tape is compressed.
restore > ?
Available commands are:
        ls [arg] - list directory
        cd arg - change directory
        pwd - print current directory
        add [arg] - add `arg' to list of files to be extracted
        delete [arg] - delete `arg' from list of files to be extracted
        extract - extract requested files
        setmodes - set modes of requested directories
        quit - immediately exit program
        what - list dump header information
        verbose - toggle verbose flag (useful with ``ls'')
        prompt - toggle the prompt display
        help or `?' - print this list
If no `arg' is supplied, the current directory is used
restore > ls new*
newerfile
newfile
restore > add newerfile
restore > extract
You have not read any volumes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume # (none if no more volumes): 1
set owner/mode for '.'? [yn] y
restore > q
[root@lyrebird ~]# mv -f newerfile /grubfile

采用 copy-in 模式的 cpio 命令(-i--extract 选项)可以列出存档的内容或者恢复选择的文件。在列出文件时,指定 --absolute-filenames 选项就会去掉每个路径开头的前导 / 字符,可以减少 cpio 产生的无关消息量。清单 51 给出一个存档的部分输出。



                    
[root@lyrebird ~]# cpio  -id --list --absolute-filenames 

清单 52 演示如何恢复所有在路径名或文件名中包含 “samp” 的文件。输出经过 uniq 的处理,减少了 “Removing leading '/' ...” 消息的数量。必须指定 -d 选项来创建目录;否则,会在当前目录中创建所有文件。另外,除非指定了 -u--unconditional 选项,否则 cpio 不会用存档副本替换文件系统中任何更新的文件。



                    
[root@lyrebird ~]# cpio  -ivd "*samp*" < backup-cpio-1 2>&1 |uniq
cpio: Removing leading `/' from member names
home/ian/crontab.samp
cpio: Removing leading `/' from member names
home/ian/sample.file
cpio: Removing leading `/' from member names
18855 blocks

tar 也可以比较存档和当前的文件系统,以及从存档恢复文件。使用 -d--compare--diff 选项执行比较。输出会显示内容不同的文件和时间戳不同的文件。清单 53 用 touch 命令改变 /etc 中一个文件的时间戳,然后比较存档和文件系统,并提供详细输出(使用 -v 选项)。directory / 选项让 tar 从根目录开始执行比较,而不是从当前目录。



                    
[root@lyrebird ~]# touch /etc/crontab
[root@lyrebird ~]# tar --diff -vf backup-tar-1 --directory /
etc/anacrontab
etc/crontab
etc/crontab: Mod time differs
etc/cron.d/
etc/cron.d/sa-update
etc/cron.d/smolt

清单 54 演示如何只将 /etc/crontab 和 /etc/anacrontab 两个文件提取到当前目录中。



                    
[root@lyrebird ~]# tar -xzvf backup-tar-1 "*tab"
etc/anacrontab
etc/crontab

注意,tarcpio 正好相反,它会自动创建目录层次结构。

阅读(1543) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~