複数のディレクトリをテープに書き込もうとしています。 1つの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
とfoo2
を抽出するためにfoo3
を2回入力する必要があるのはなぜですか?
テープの最後に別のディレクトリを追加しようとすると、次のようになります。
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
memmanuel@venera:~/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
とfoo3
の場合は2回、foo4
の場合は3回、tarコマンドを繰り返す必要があるのですか?
FreeBSD12.1とIBM DDS4(STD2401LW/Tc4200-236)SCSIテープドライブを使用しています。
編集> schilyの答えに従って、tarファイルを順番に抽出できます。残っている唯一の問題は、後でmt eom
にfoo4
tarファイルを追加する理由が、1つではなく2つの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 %
この動作は、テープドライバのEOF処理に関連しています。
この処理はオペレーティングシステムによって異なり、関連するSolarisのマニュアルページを読むと役立つ場合があります。
http://schillix.sourceforge.net/man/man7i/mtio.7i.html
これは、Solarisの処理と古いBSDの動作の違いを説明しています。
この説明から、私はEOFシチュエーション後にファイルマークをスキップし、テープ上の次のファイルから最初のレコードを返すために、古いBSDの動作によって読み取りが発生することを期待します。これはあなたが期待するもの。
BSDで観察された動作は、ドキュメントに記載されているSVr4の動作と古いBSDの動作の間にあるようですが、Solarisと現在のBSDの両方で動作するようにする方法があると思います。
tarを呼び出して最初のテープファイルを読み取る
その後、テープは最初のテープファイルの最後、つまりファイルマークの直前に配置されます...
ファイルマークをスキップするにはmt fsf
を呼び出します
tarを呼び出して、テープ上の次のファイルを読み取ります。
残りの議論から、書き込み操作が適用された後にmt rewind
が呼び出されると、FreeBSDは追加のファイルマークを書き込むようです。
コマンドmt eom
は、最後のダブルファイルマークの後にテープを配置します。別の書き込み操作が行われると、これは、最終書き込み前にダブルファイルマークが空のテープファイルになった後に発生します。
3つのファイルを含むテープは次のようになります。
data1 FILEMARK data2 FILEMARK data3 FILEMARK FILEMARK
4番目のテープファイルを追加する場合は、次を呼び出す必要があります。
mt fsf 3
thirfファイルマークの後にテープを配置します。その後、書き込みを開始すると、4番目のファイルマークが上書きされ、再度巻き戻すと、次のテープレイアウトになります。
data1 FILEMARK data2 FILEMARK data3 FILEMARK data4 FILEMARK FILEMARK