![테이프에 여러 개의 tar를 차례로 쓰는 방법은 무엇입니까?](https://linux55.com/image/174046/%ED%85%8C%EC%9D%B4%ED%94%84%EC%97%90%20%EC%97%AC%EB%9F%AC%20%EA%B0%9C%EC%9D%98%20tar%EB%A5%BC%20%EC%B0%A8%EB%A1%80%EB%A1%9C%20%EC%93%B0%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
여러 디렉터리를 테이프에 쓰려고 합니다. 각 디렉토리마다 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
추출하려면 왜 두 번 입력해야 합니까 ?foo2
foo3
테이프 끝에 다른 디렉터리를 추가하려고 하면 다음과 같이 합니다.
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를 발생시키는 일반 파일에도 동일하게 적용됩니다.