同じ出力を両方のドライブに割り当てることで、単一のコマンドを使用して2つのテープドライブにtarアーカイブを同時に書き込むことはできますか?
ジョブを並列に実行して時間を節約したいと思います。また、両方のアーカイブが同じバイナリであることを確認したいので、チェックサムを保存するだけです。 (tarについてはわかりませんが、一部のアーカイブ形式では、生成時に生成されたヘッダーにタイムスタンプを格納できるため、実際には2つのアーカイブのファイルは同じですが、チェックサムは異なる場合があります。)
ベストアンサー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)
stdoutとファイルが同時に書き込まれる>
ため、追加のセクションが存在します。これにより、引数の1つはstdoutリダイレクトになり、もう1つは直接書き込み用のファイル引数になります。別のアプローチは、標準出力を 。tee
>
tee
> /dev/null
必要なパイプバッファを使用するdd
か、利用可能なパイプバッファがない場合は、追加のバッファリングを実行できます。たとえば、
dd iflag=fullblock bs=128M | dd iflag=fullblock bs=128M obs=256K of=/dev/tape0
このdd | dd
構造を使用すると、最初のものはdd
データの塊を直接受け取り、2番目に転送できますdd
。これにより、2番目のデータブロックが書き込み操作中に、最初の空きdd
データブロックが次のデータブロックをバッファリングできます。dd
これは単一のプロセス特性dd
(前のブロックの書き込みが完了するまで次のブロックを読み取らない)を中心に進み、このフープをジャンプするために専用のバッファプログラムを使用する必要はありません。
実際、これは最小充填特性が128Mの256Mバッファです。
これらのバッファリングがプラスの影響を与えるかどうかは、テープドライブの速度と動作によって異なります。また、効果がない可能性があり(ドライブが効果がないほど速い)、マイナスの効果があるかもしれません(バッファがいっぱいになるまでドライブがフリーズするか、ドライブ自体のバッファリングメカニズムと衝突します)。