通过将相同的输出定向到两个驱动器,是否可以使用单个命令将 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 缓冲区。
此类缓冲是否具有任何积极作用取决于磁带驱动器的速度和行为。也可能没有效果(驱动器速度足够快而不会产生影响),或产生负面影响(驱动器在等待缓冲区填满时停止或与驱动器自身的缓冲机制冲突)。