테이프에 여러 개의 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

그런 다음 세 개의 tar 명령을 사용하여 세 개의 tar 파일(테이프에 저장할 때 파일이라고 하는 것 같습니다)을 작성하려고 합니다. 디렉터리당 하나의 명령(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테이프에 세 개의 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추출하려면 왜 두 번 입력해야 합니까 ?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 명령을 의 경우 두 번, foo3의 경우 세 번 반복해야 합니까 foo4?

저는 FreeBSD12.1과 IBM DDS4(STD2401LW/Tc4200-236) SCSI 테이프 드라이브를 사용하고 있습니다.

편집> schily의 답변에 따라 tar 파일을 순차적으로 추출할 수 있습니다. 남은 유일한 문제는 mt eom나중에 tar 파일을 추가하는 데 여전히 하나가 아닌 foo4두 개가 필요한 이유를 이해하는 것입니다.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최종 이중 파일 표시 뒤에 테이프의 위치를 ​​지정하며, 또 다른 쓰기 작업이 발생하면 이중 파일 표시 뒤에 이 작업이 발생하여 최종 쓰기 전에 빈 테이프 파일이 생성됩니다.

세 개의 파일이 포함된 테이프는 다음과 같습니다.

data1 FILEMARK data2 FILEMARK data3 FILEMARK FILEMARK

네 번째 테이프 파일을 추가하려면 다음을 호출해야 합니다.

mt fsf 3

세 번째 파일 표시 뒤에 테이프를 놓습니다. 그런 다음 쓰기를 시작하면 네 번째 파일 표시를 덮어쓰게 되고, 다시 되감으면 다음과 같은 테이프 레이아웃이 나타납니다.

data1 FILEMARK data2 FILEMARK data3 FILEMARK data4 FILEMARK FILEMARK

답변2

나는 테이프와 tar로 작업한 적이 없지만 tar 아카이브 tar에 추가하려면 0 바이트가 포함된 마지막 레코드를 다시 작성해야 하며 이는 아카이브의 끝과 다음 아카이브 헤더를 나타냅니다. 따라서 테이프를 검색할 수 없는 경우 매번 테이프를 되감고 tar가 레코드를 읽도록 한 다음 덮어써야 할 수도 있습니다.

또한 GNU tar에서는 추가 스위치 -r-c.

tar 파일을 하나씩 연결하면 GNU tar에도 스위치 -i(추출 시)가 있어 EOF(테이프 장치의 경우)까지 아카이브의 끝을 읽을 수 있습니다.예 혹은 아니오이는 합리적인 아이디어입니다. tar가 마지막 아카이브의 끝에서 오래된 데이터를 발견하면 이를 추출하려고 시도할 수도 있고, 운이 좋아서 완벽하게 정렬된 오래된 아카이브를 찾을 수도 있습니다...)

저는 이 -i스위치를 사용하여 여러 tar 아카이브를 파이프하므로 문제가 되지 않습니다. 마지막에 EOF를 발생시키는 일반 파일에도 동일하게 적용됩니다.

관련 정보