如何在不使用任何压缩的情况下直接归档dd的输出?

已经在这个问题中已经确定tar不能从stdin读取输入。

如何在不使用任何压缩的情况下直接存档dd输出? 在单个任务中执行所有操作的目的是避免将dd输出写入目标磁盘两次(一次作为原始文件,一次作为存档),并避免执行两个不同的任务,这是浪费时间(因为必须读取和写入输入文件并再次读取,处理和写入输出),并且如果目标驱动器几乎已满,则可能无法进行。

我打算对驱动器,分区和文件夹进行多次备份,我希望将所有内容存储到单个文件中,以及每个备份/潜在恢复任务的速度都很有用。

如果要将整个块设备转储到文件中, tar将没有任何用处,因为它不适用于块设备。 相反,你需要使用dd或类似的:

 dd if=/dev/sdX of=/path/to/backup bs=16m 

即使这样,最好使用至少一点点压缩,只要它不会减慢传输速度太多。 简而言之,您需要一种压缩算法,其吞吐量不会低于最慢的存储介质。 有几种这样的压缩算法。 最臭名昭着的是Lempel-Ziv-Oberhumer ,它的衍生物L4Z和Snappy 。 各种压缩算法的比较包括L4Z项目页面上的那三个:

 Name Ratio C.speed D.speed MB/s MB/s LZ4 (r101) 2.084 422 1820 LZO 2.06 2.106 414 600 QuickLZ 1.5.1b6 2.237 373 420 Snappy 1.1.0 2.091 323 1070 LZF 2.077 270 570 zlib 1.2.8 -1 2.730 65 280 LZ4 HC (r101) 2.720 25 2080 zlib 1.2.8 -6 3.099 21 300 

为了这个答案,我将选择LZO的一个例子,因为它可以在lzopforms的Canonical存储库中随时可用,但最终所有这些流压缩器都有从标准输入读取并写入标准输出的前端。

 dd if=/dev/sdX bs=16m | lzop > /path/to/backup.lzo 

如果你想在备份期间在同一台机器上工作,你可能想要使用ionice和/或nice / schedtool

 ionice -c 3 dd if=/dev/sdX bs=16m | ionice -c 3 schedtool -B -n 10 -e lzop > /path/to/backup.lzo