표준 출력을 여러 테이프에 보관

표준 출력을 여러 테이프에 보관

24시간마다 하나씩 stdout에 동적으로 생성되는 대용량 파일이 있습니다. 이러한 파일을 테이프에 점진적으로 보관하고 싶습니다. 가급적이면 여러 테이프에 걸쳐 있을 수 있는 단일 아카이브에 보관하고 싶습니다.

Tar는 아카이브에 추가하고 다음 테이프를 로드하는 기능이 내장되어 있으므로 테이프 관리에 적합합니다. 그러나 표준 입력에서 데이터를 받아들이는 데는 매우 열악합니다. 내가 무엇을 하든 결국 아카이브의 내용 대신 특수 파일(링크 또는 명명된 파이프)이 아카이브에 기록됩니다.

다음은 제가 시도한 샘플 명령입니다. 첫째 날에는 새 아카이브를 생성합니다.

ln -s /dev/stdin day1 # or use the --transform option of tar
data_generator | tar -c -h -M -f /dev/nst0 -H posix -F 'mtx -f /dev/sch0 next' day1

다음 날 -c를 -A로 변경하고 새 스트림을 tar 아카이브에 추가된 새 파일에 저장하고 필요한 경우 새 테이프를 로드하려고 합니다.

data_generator | tar -A -h -M -f /dev/nst0 -H posix -F 'mtx -f /dev/sch0 next' day2

내가 말했듯이, 내가 아카이브에서 찾은 모든 것은 명명된 파이프(-h 포함) 또는 기호 링크(-h 제외)였습니다.

내가 시도한 아이디어 중 일부는 잘 작동하지 않았습니다.

  1. split대신 사용하는 tar것은 너무 기본적이기 때문에 불가능합니다. 미리 정의된 차원으로만 분할할 수 있으며(테이프의 처음부터 시작하지 않으면 좋지 않음), 압축할 수 없는 아카이브에 다른 날짜를 결합할 수 없습니다. Tar는 데이터나 테이프 크기를 알 필요가 없으며 쓰기 오류가 발생한 경우에만 새 테이프로 전환합니다.
  2. 나는 cpio, star 및 dar에 대한 매뉴얼을 읽었습니다. 나는 그들이 타르보다 파이프를 더 잘 처리한다고 생각하지 않습니다.

어떤 팁이라도 주셔서 감사합니다.

편집: 쓰기를 시작하기 전에 파일 크기를 알아야 하기 때문에 tar는 불가능하다고 생각하기 시작했습니다. 사실 확장이 가능한 아카이브의 경우, 내용 앞에 크기를 적어주면 추가가 매우 까다롭습니다.

답변1

하룻밤을 쉬고 난 후, 읽고 싶은 데이터의 양을 미리 안다면(나도 알고 있습니다) 약간의 Python만 있으면 이 작업을 수행할 수 있다는 사실을 발견했습니다. 이 간단한 프로그램은 stdin에서 1MB의 데이터를 읽고 "filename.dat"에 캡슐화된 tar 아카이브로 stdout에 데이터를 씁니다.

#!/usr/bin/env python3
import tarfile
with open("/dev/stdout", "ab") as outf:
  tar = tarfile.open(fileobj=outf, mode="w")
  with open("/dev/stdin", "rb") as inf:
    filesize=1048576 # 1MB
    tarinfo = tarfile.TarInfo(name="filename.dat")
    tarinfo.size=filesize
    tar.addfile(tarinfo, fileobj=inf)
# -- end program tarpipe.py ---

예를 들어, 다음 프로그램을 사용하면 1MB의 무작위 데이터를 가져와 tar 아카이브로 전송할 수 있습니다.

cat /dev/urandom |./tarpipe.py > daily.tar

결과 아카이브에는 "filename.dat"라는 1MB 파일이 포함되어 있습니다.

tar 아카이브의 작동 방식 때문에 매번 파일 이름을 수정하는 한 계속 추가(>>)하여 확장할 수 있습니다(그렇지 않으면 압축을 풀 때 파일이 서로 덮어쓰게 됩니다).

테이프 변경 사항을 관리하기 위해 로컬에서 이 작업을 수행할 수 있는 mbbuffer를 통해 출력을 파이프할 수 있습니다.

관련 정보