テープに複数のtarを順番に書き込むには?

テープに複数のtarを順番に書き込むには?

複数のディレクトリをテープに書き込もうとしています。各ディレクトリにはtarコマンドがあります。

したがって、次のサンプルファイル/ディレクトリ構造があります。

user@host1:~/temp/original % find .
.
./foo1
./foo1/foo1.a
./foo1/foo1.b
./foo1/foo1.c
./foo1/foo1.1
./foo2
./foo2/foo2.a
./foo2/foo2.b
./foo2/foo2.c
./foo2/foo2.2
./foo3
./foo3/foo3.a
./foo3/foo3.b
./foo3/foo3.c
./foo3/foo3.3

テープを巻き戻して消去し、空のテープを使用するかのようにしたいと思います。

user@host1:~/temp/original % mt -f /dev/sa0 rewind
user@host1:~/temp/original % mt -f /dev/sa0 erase
user@host1:~/temp/original % mt -f /dev/sa0 rewind
user@host1:~/temp/original % mt -f /dev/sa0 status
Drive: sa0: <SEAGATE DAT    9SP40-000 912L> Serial Number: HN0948V
---------------------------------
Mode      Density              Blocksize      bpi      Compression
Current:  0x24:DDS-2           variable       61000    enabled (DCLZ)
---------------------------------
Current Driver State: at rest.
---------------------------------
Partition:   0      Calc File Number:   0     Calc Record Number: 0
Residual:    0  Reported File Number:   0 Reported Record Number: 0
Flags: BOP

次に、3つのtarコマンドを使用して3つのtarファイル(テープに保存するときにファイルと呼ばれるようです)を作成しようとしています。ディレクトリごとに1つのコマンド(foo1、foo2、およびfoo3)なので、私はこれを行います:

user@host1:~/temp/original % tar cvf /dev/nsa0 foo1
a foo1
a foo1/foo1.a
a foo1/foo1.b
a foo1/foo1.c
a foo1/foo1.1
user@host1:~/temp/original % tar cvf /dev/nsa0 foo2
a foo2
a foo2/foo2.a
a foo2/foo2.b
a foo2/foo2.c
a foo2/foo2.2
user@host1:~/temp/original % tar cvf /dev/nsa0 foo3
a foo3
a foo3/foo3.a
a foo3/foo3.b
a foo3/foo3.c
a foo3/foo3.3

私が使ってきたので、/dev/nsa0テープに3つのtarファイルを保存したいと思います。

これで、テープ上の3つのファイルを別のディレクトリに復元しようとしています。

user@host1:~/temp/original % cd ../backup/
user@host1:~/temp/backup % mt -f /dev/sa0 rewind
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo1/
x foo1/foo1.a
x foo1/foo1.b
x foo1/foo1.c
x foo1/foo1.1
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo2/
x foo2/foo2.a
x foo2/foo2.b
x foo2/foo2.c
x foo2/foo2.2
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo3/
x foo3/foo3.a
x foo3/foo3.b
x foo3/foo3.c
x foo3/foo3.3
user@host1:~/temp/backup % mt -f /dev/nsa0 status
Drive: sa0: <SEAGATE DAT    9SP40-000 912L> Serial Number: HN0948V
---------------------------------
Mode      Density              Blocksize      bpi      Compression
Current:  0x24:DDS-2           variable       61000    enabled (DCLZ)
---------------------------------
Current Driver State: at rest.
---------------------------------
Partition:   0      Calc File Number:   2     Calc Record Number: 1
Residual:    0  Reported File Number:   2 Reported Record Number: 5
Flags: None

とをtar xvf /dev/nsa0抽出するには、なぜ2回入力する必要がありますか?foo2foo3

テープの末尾に別のディレクトリを追加しようとすると、次のようになります。

user@host1:~/temp/original % mt -f /dev/nsa0 eom
user@host1:~/temp/original % tar cvf /dev/nsa0 foo4
a foo4
a foo4/foo4.a
a foo4/foo4.b
a foo4/foo4.c
a foo4/foo4.4
user@host1:~/temp/original % cd ..
user@host1:~/temp % cd backup/
user@host1:~/temp/backup % mt -f /dev/nsa0 rewind
user@host1:~/temp/backup % mt -f /dev/nsa0 fsf 3
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % 

なぜfoo4抽出できないのですか?

追加のテストでテープを取り出し、再挿入した後、4つのディレクトリを抽出してみました。次のようにしました。

user@host1:~/temp/backup % mt -f /dev/nsa0 offline
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo1/
x foo1/foo1.a
x foo1/foo1.b
x foo1/foo1.c
x foo1/foo1.1
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo2/
x foo2/foo2.a
x foo2/foo2.b
x foo2/foo2.c
x foo2/foo2.2
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo3/
x foo3/foo3.a
x foo3/foo3.b
x foo3/foo3.c
x foo3/foo3.3
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo4/
x foo4/foo4.a
x foo4/foo4.b
x foo4/foo4.c
x foo4/foo4.4

foo2なぜtarコマンドをの場合は2回、foo3の場合は3回繰り返す必要がありますかfoo4

私はFreeBSD12.1とIBM DDS4(STD2401LW / Tc4200-236)SCSIテープドライブを使用しています。

編集> schilyの答えに従って、tarファイルを順次抽出できます。残りの唯一の問題は、mt eom後でtarファイルを追加するためにまだ1つではなくfoo42つが必要な理由を理解することです。mt fsf

テープを再挿入した後:

user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo1/
x foo1/foo1.a
x foo1/foo1.b
x foo1/foo1.c
x foo1/foo1.1
user@host1:~/temp/backup % mt fsf
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo2/
x foo2/foo2.a
x foo2/foo2.b
x foo2/foo2.c
x foo2/foo2.2
user@host1:~/temp/backup % mt fsf
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo3/
x foo3/foo3.a
x foo3/foo3.b
x foo3/foo3.c
x foo3/foo3.3
user@host1:~/temp/backup % mt fsf
user@host1:~/temp/backup % tar xvf /dev/nsa0
user@host1:~/temp/backup % tar xvf /dev/nsa0
x foo4/
x foo4/foo4.a
x foo4/foo4.b
x foo4/foo4.c
x foo4/foo4.4
user@host1:~/temp/backup %

編集>mt status抽出が許可されている場合に返される内容ですfoo4。テープを挿入したら、すぐにコマンドを実行してください。

user@host1:~/temp/backup % rm -rf *
user@host1:~/temp/backup % mt status
Drive: sa0: <SEAGATE DAT    9SP40-000 912L> Serial Number: HN0948V
---------------------------------
Mode      Density              Blocksize      bpi      Compression
Current:  0x24:DDS-2           variable       61000    enabled (DCLZ)
---------------------------------
Current Driver State: at rest.
---------------------------------
Partition:   0      Calc File Number:   0     Calc Record Number: 0
Residual:    0  Reported File Number:   0 Reported Record Number: 0
Flags: BOP
user@host1:~/temp/backup % echo $TAPE
/dev/nsa0
user@host1:~/temp/backup % mt fsf 4
user@host1:~/temp/backup % mt status
Drive: sa0: <SEAGATE DAT    9SP40-000 912L> Serial Number: HN0948V
---------------------------------
Mode      Density              Blocksize      bpi      Compression
Current:  0x24:DDS-2           variable       61000    enabled (DCLZ)
---------------------------------
Current Driver State: at rest.
---------------------------------
Partition:   0      Calc File Number:   4     Calc Record Number: 0
Residual:    0  Reported File Number:   4 Reported Record Number: 7
Flags: None
user@host1:~/temp/backup % tar xv
x foo4/
x foo4/foo4.a
x foo4/foo4.b
x foo4/foo4.c
x foo4/foo4.4
user@host1:~/temp/backup % 

答え1

この動作は、テープドライバのEOF処理に関連しています。

このプロセスはオペレーティングシステムによって異なりますので、関連するSolarisのマニュアルページを読むことが役に立ちます。

http://schillix.sourceforge.net/man/man7i/mtio.7i.html

これは、Solaris 処理と既存の BSD 動作の違いを説明します。

この説明によれば、前のBSD動作のために、EOF条件の後の読み取りはファイル表示をスキップし、テープの次のファイルから最初のレコードを返すことが予想される。これがまさにあなたが期待しているようです。

BSDで観察された動作は、文書化されたSVr4動作と以前のBSD動作の間のどこかにあるように見えますが、Solarisと現在のBSDの両方で動作させる方法があると思います。

  • 最初のテープ・ファイルを読み取るには、tar を呼び出します。

  • その後、テープは最初のテープファイルの終わり、ファイルマークの前にあります。

  • 呼び出しmt fsfスキップファイルの表示

  • テープの次のファイルを読み取るには、tar を呼び出します。

残りの議論によると、FreeBSDはmt rewind書き込み操作を適用した後に呼び出して追加のファイル表示を書き込むようです。

このコマンドは、mt eom最後の二重ファイルマークの後にテープの場所を指定します。別の書き込み操作が発生すると、ダブルファイルマークの後にこれが発生し、最後の書き込み前に空のテープファイルが生成されます。

3つのファイルを含むテープは次のとおりです。

data1 FILEMARK data2 FILEMARK data3 FILEMARK FILEMARK

4番目のテープファイルを追加するには、次を呼び出す必要があります。

mt fsf 3

3番目のファイルマークの後にテープを置きます。その後、書き込みを開始すると4番目のファイル表示が上書きされ、もう一度巻き戻すと次のテープレイアウトが表示されます。

data1 FILEMARK data2 FILEMARK data3 FILEMARK data4 FILEMARK FILEMARK

答え2

私はテープとtarで作業したことがありませんが、tarアーカイブtarに追加するには、0バイトを含む最後のレコードを書き換える必要があります。これは、アーカイブの終わりと次のアーカイブヘッダーを表します。したがって、テープを検索できない場合は、毎回テープを巻き戻し、tarにレコードを読み取ってから上書きする必要があります。

また、GNU tarでは追加のスイッチ-r-c

tarファイルを1つずつ連結すると、GNU tarにもスイッチ-i(抽出時)があり、EOF(テープ装置の場合)までアーカイブの終わりを読み取ることができます。はいまたはいいえこれは合理的なアイデアです。 tarが最後のアーカイブの終わりに古いデータを見つけたら、それを抽出しようとすることができます。

私はこの-iスイッチを使って複数のtarアーカイブをパイプするので問題ありません。最後にEOFを生成する通常のファイルにも同じことが当てはまります。

関連情報