我可以将相同的 tar 存档同时写入两个磁带吗?

我可以将相同的 tar 存档同时写入两个磁带吗?

通过将相同的输出定向到两个驱动器,是否可以使用单个命令将 tar 存档同时写入两个磁带驱动器?

我想通过并行执行操作来节省时间。另外,我想确保两个档案都是二进制相同的,因此我只需要存储一个校验和。 (我不知道 tar,但某些存档格式可能会在创建时生成的标头中存储时间戳,从而导致校验和不同,而实际上两个存档中的文件是相同的)

答案1

不幸的是,我没有任何磁带驱动器可以玩,所以这个答案本质上是理论上的。

如果您的磁带机接受管道数据流或dd具有固定块大小,您可以使用tee附加数据流来进行校验和计算。

使用 FIFO:

# make fifos
mkfifo tape.0.fifo tape.1.fifo tape.sha384sum.fifo tape.sha512sum.fifo

# start fifo readers
dd iflag=fullblock bs=256K if=tape.0.fifo of=/dev/tape0 &
dd iflag=fullblock bs=256K if=tape.1.fifo of=/dev/tape1 &
sha384sum < tape.sha384sum.fifo > tape.sha384sum &
sha512sum < tape.sha512sum.fifo > tape.sha512sum &

# start fifo writer
tar -cz some/stuff/ | tee > *.fifo

使用 bash 进程替换:

tar -cz some/stuff/ | \
    tee > >(dd iflag=fullblock bs=256K of=/dev/tape0) \
          >(dd iflag=fullblock bs=256K of=/dev/tape1) \
          >(sha384sum > tape.sha384sum) \
          >(sha512sum > tape.sha512sum)

请注意,额外的部分>存在是因为tee同时写入标准输出和文件;这>导致参数之一是 stdout 重定向,而其他参数是用于tee直接写入的文件参数。另一种方法是将标准输出丢弃为> /dev/null.

额外的缓冲可以使用您选择的任何管道缓冲程序来实现,或者dd如果您没有任何可用的管道缓冲程序,也可以使用它来实现。例如:

dd iflag=fullblock bs=128M | dd iflag=fullblock bs=128M obs=256K of=/dev/tape0

dd | dd构造允许第一个dd直接接收数据块,并将其传递给第二个dd。这使得第一个dd空闲的数据块可以缓冲下一个数据块,而第二个数据块dd则忙于写入它。

这围绕着单进程性质dd(在完成前一个块的写入之前不读取下一个块),您可能不需要使用专用的缓冲程序来跳过这个环。

实际上,这是一个具有 128M 最小填充特性的 256M 缓冲区。

此类缓冲是否具有任何积极作用取决于磁带驱动器的速度和行为。也可能没有效果(驱动器速度足够快而不会产生影响),或产生负面影响(驱动器在等待缓冲区填满时停止或与驱动器自身的缓冲机制冲突)。

相关内容