web-dev-qa-db-ja.com

同じtarアーカイブを2つのテープに同時に書き込むことはできますか?

同じ出力を両方のドライブに送信することで、1つのコマンドを使用して2つのテープドライブに同時にtarアーカイブを書き込むことは可能ですか?

並行して操作することで時間を節約したい。また、両方のアーカイブがバイナリで同一であることを確認したいので、1つのチェックサムのみを保存する必要があります。 (tarについてはわかりませんが、一部のアーカイブ形式では、作成時に生成されるヘッダーにタイムスタンプが格納されるため、実際には両方のアーカイブ内のファイルが同一である場合でも、チェックサムが異なります)

1
swami

残念ながら、私は遊ぶテープドライブを持っていないので、この答えは本質的に理論的なものです。

テープドライブがパイプデータストリームまたは固定ブロックサイズの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とファイルの両方に書き込むため、余分な>が存在することに注意してください。 >により、引数の1つがstdoutリダイレクトになり、他の引数はteeが直接書き込むためのファイルパラメーターになります。別の方法では、stdoutを> /dev/nullとして破棄します。

追加のバッファリングは、任意のパイプバッファリングプログラムを使用して実装できます。使用可能なものがない場合は、ddを使用して実装できます。例えば:

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

dd | dd構文を使用すると、最初のddがデータのチャンクを直接受信し、それを2番目のddに渡すことができます。これにより、最初のddはデータの次のブロックをバッファリングできるようになり、2番目のddは書き込みに忙しくなります。

これは、ddの単一プロセスの性質(前のブロックの書き込みが完了するまで次のブロックを読み取らない)を回避します。これは、専用のバッファリングプログラムでジャンプする必要がない場合があります。

事実上、これは128Mの最小充填特性を持つ256Mのバッファーです。

このようなバッファリングがプラスの効果をもたらすかどうかは、テープドライブの速度と動作に依存します。影響がない(違いが生じないほど高速にドライブする)、または悪影響がある(バッファがいっぱいになるのを待っている間にドライブが停止する、またはドライブ自体のバッファリングメカニズムと競合する)可能性もあります。

2
frostschutz