Pipe

我可以一次將同一個 tar 存檔寫入兩個磁帶嗎?

  • May 31, 2020

通過將相同的輸出定向到兩個驅動器,是否可以使用單個命令同時將 tar 存檔寫入兩個磁帶驅動器?

我想通過並行執行操作來節省時間。另外我想確保兩個檔案是二進制相同的,所以我只需要儲存一個校驗和。(我不知道 tar,但某些存檔格式可能會在創建時生成的標頭中儲存時間戳,從而導致校驗和不同,而實際上兩個存檔中的文件是相同的)

不幸的是,我沒有任何磁帶機可以玩,所以這個答案本質上是理論上的。

如果您的磁帶驅動器接受管道數據流或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寫入標準輸出和文件;導致>參數之一是標準輸出重定向,而其他參數是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 緩衝區。

這種緩衝是否有任何積極影響取決於磁帶驅動器的速度和行為。也可能沒有效果(驅動速度足夠快,不會產生影響)或負面效果(驅動器在等待緩衝區填滿時停止或與驅動器自身的緩衝機制發生衝突)。

引用自:https://unix.stackexchange.com/questions/589911