已经确定这个问题无法tar
从 读取输入stdin
。
如果不进行任何压缩,如何才能dd
直接存档输出?将所有操作都放在一个任务中的目的是避免将输出写入dd
目标磁盘两次(一次作为原始文件,一次作为存档),并避免执行两个不同的任务,这很浪费时间(因为必须读取和写入输入文件,然后再次读取、处理和写入输出),如果目标驱动器几乎已满,则不可能执行这两个任务。
我计划对驱动器、分区和文件夹进行多次备份,并且希望能够轻松地将所有内容存储到单个文件中,并加快每次备份/潜在恢复任务的速度。
答案1
如果你想将整个块设备转储到一个文件,tar
这将毫无用处,因为它不适用于块设备。相反,你需要使用dd
或类似的东西:
dd if=/dev/sdX of=/path/to/backup bs=16m
即使这样,最好至少使用一点压缩,只要它不会减慢传输速度太多。简而言之,您需要一种吞吐量不低于最慢存储介质的压缩算法。有几种这样的压缩算法。最臭名昭著的是伦佩尔–齐夫–奥伯胡默,其导数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 示例,因为它在 Canonical 的存储库中以以下形式随时可用:伊佐普但最终所有这些流压缩器都有从标准输入读取并写入标准输出的前端。
dd if=/dev/sdX bs=16m | lzop > /path/to/backup.lzo
如果您想在备份期间在同一台机器上工作,您可能需要使用ionice
and/或nice
/ schedtool
:
ionice -c 3 dd if=/dev/sdX bs=16m | ionice -c 3 schedtool -B -n 10 -e lzop > /path/to/backup.lzo