我很好奇,读了一些资料,但仍然有一些疑问。
CPIO 与 TAR 有何不同?我在另一个问题中被告知,tar 用于将许多文件集中到一个存档中,然后通常进行 gzip 或 bzip 压缩。
另外,有人告诉我 TAR 无法从 STDOUT 进行压缩。我想存档/压缩 ZFS 快照以进行备份。我想知道我是否可以将 CPIO 与 bzip2 结合起来以获得这种效果。
或者我的想法完全错误?这不正是 CPIO 的目的吗?
这是我在阅读有关备份 ZFS 快照的 Oracle 文档后想到的命令。
# Backup snapshot to cpio and bzip2 archive
zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2
# Restore snapshot from cpio and bzip2 archive
zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2
答案1
tar
和都cpio
只有一个目的:将多个单独的文件连接到单个流。它们不压缩数据。(如今,由于其相对简单,它更受欢迎 - 它可以将输入文件作为参数,而不必与as hastar
结合使用。)find
cpio
就你的情况而言,不需要这两种工具都不会对你产生任何有用的效果,因为你没有许多单独的文件。zfs send
已经做了同样的事情tar
。所以你不需要任何文件,仅是无名的流。
要压缩快照,您只需将输出zfs
通过压缩程序传输:
zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz
gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607
(如果您愿意,您可以gzip
用xz
或bzip2
或任何其他流压缩工具替代。)
答案2
除了之前所说的重力和保罗:
历史
古时候”,太平洋保险协会(-c
使用选项)是这在将文件移动到其他 UNIX 衍生产品时使用的工具,因为它比柏油.但是柏油可移植性问题可能被认为自20世纪80年代末以来已经得到解决。
不幸的是,就在那个时候,不同的供应商弄乱-c
了太平洋保险协会(只需查看手册页即可GNU cpio和选项-H
)。 当时柏油变得比以前更便携太平洋保险协会... 不同的 UNIX 供应商花了近十年的时间才解决这个问题。GNU tar和GNU cpio对于当时(我猜想即使是现在)必须处理来自不同来源的磁带的所有管理员来说,安装是必须的。
用户界面
柏油可以使用磁带配置文件,管理员可以在其中配置连接到系统的磁带驱动器。然后用户只需说“好吧,我将使用磁带驱动器 1”,而不必记住磁带的确切设备节点(这可能会非常混乱,而且在不同的 UNIX 平台上也没有标准化)。
但主要的区别是:
柏油能够自行搜索目录并从命令行参数获取要备份的文件或目录列表。
太平洋保险协会仅存档所要求的文件或目录,但不会自行递归搜索子目录。此外太平洋保险协会获取要归档的项目列表标准输入- 这就是为什么它几乎总是与寻找。
A太平洋保险协会与柏油:
$ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
$ tar czvf myfiles.tar.gz myfiles
我认为这是大多数人使用的主要原因柏油创建存档文件:对于捆绑完整目录等简单任务,它更容易使用。
还GNU tar-z
提供了导致档案被压缩的选项GNU 压缩文件使事情变得更加简单。
另一方面,人们可以用寻找&太平洋保险协会。事实上,这是一种更像 UNIX 的方法:为什么要将目录树搜索纳入太平洋保险协会如果已经有一个工具可以解决几乎所有人们能想到的问题:寻找。想到的事情是仅备份晚于某个日期的文件、将文件限制为位于同一文件系统中的文件或使用 find-output 进行过滤以grep -v
排除某些文件...
人民GNU tar花费了大量精力来实现很多以前只能通过太平洋保险协会。事实上,这两种工具都是互相学习的——但只有太平洋保险协会可以读取以下格式柏油——而不是相反。
柏油和输出处理
最后再补充一点你所说的内容:
另外,有人告诉我 TAR 无法从 STDOUT 进行压缩。我想存档/压缩 ZFS 快照以进行备份。我想知道我是否可以将 CPIO 与 bzip2 结合起来以获得这种效果。
嗯,每个版本的柏油(GNU 或非 GNU)可以在管道中使用。只需使用减号 ( -
) 作为档案名称:
$ tar cvf - myfiles | bzip > myfiles.tar.bz
还GNU tar提供了指定后处理器命令的选项--to-command
- 尽管我还是更喜欢管道。也许在写入某些硬件设备时有用。
答案3
tar 和 cpio 本质上具有相同的功能,即从多个文件和目录的输入中创建一个连续的文件。最初,这是将结果放到磁带上,但现在它通常用于输入到压缩实用程序中,如上所示。这是因为压缩单个大文件比压缩大量小文件更节省时间和空间。您应该注意到,许多图像格式(png、jpg 等)已经高度压缩,如果通过压缩实用程序,它们实际上可能会变得更大一些。
tar 和 cpio 本身都不进行任何压缩。Tar 有效地“赢得”了“我们该用什么来制作聚合文件”之争,但 cpio 在各个地方都备受瞩目。我不知道其中一个比另一个有什么优势,tar 胜出,因为它更常用。
tar 确实可以从 stdin 接收输入并输出到 stdout - 然后将其通过管道传输到 bzip2 或类似程序中。如果使用“z”选项调用,它将自动在输出上调用 gzip。
答案4
还值得注意的是:在(至少)FreeBSD 和 Mac OS X 上,您可以使用 tar 操作 cpio 文件。BSD tar 在底层使用 libarchive,因此它可以处理 cpio、pax、shar...
这意味着cpio
命令的可用性问题不会阻止您与 cpio 文件交互。