web-dev-qa-db-ja.com

テープにいくつかのタールを順番に書き込むにはどうすればよいですか?

複数のディレクトリをテープに書き込もうとしています。 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/nsa0foo2を抽出するために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

なぜfoo2foo3の場合は2回、foo4の場合は3回、tarコマンドを繰り返す必要があるのですか?

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

編集> schilyの答えに従って、tarファイルを順番に抽出できます。残っている唯一の問題は、後でmt eomfoo4 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 % 
4
M.E.

この動作は、テープドライバの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
5
schily