동일한 출력을 두 드라이브에 모두 지정함으로써 단일 명령을 사용하여 두 개의 테이프 드라이브에 tar 아카이브를 동시에 쓸 수 있습니까?
작업을 병렬로 실행하여 시간을 절약하고 싶습니다. 또한 두 아카이브가 모두 동일한 바이너리인지 확인하고 싶으므로 체크섬만 저장하면 됩니다. (tar에 대해서는 모르지만 일부 아카이브 형식은 생성 시 생성된 헤더에 타임스탬프를 저장할 수 있으므로 실제로는 두 아카이브의 파일이 동일하지만 체크섬이 다를 수 있습니다.)
답변1
불행하게도 가지고 놀 수 있는 테이프 드라이브가 없기 때문에 이 대답은 본질적으로 이론적인 것입니다.
테이프 드라이브가 파이프 데이터 스트림을 허용하거나 블록 크기가 고정된 경우 체크섬 계산을 위해 추가 데이터 스트림을 dd
사용할 수 있습니다 .tee
FIFO 사용:
# make fifos
mkfifo tape.0.fifo tape.1.fifo tape.sha384sum.fifo tape.sha512sum.fifo
# start fifo readers
dd iflag=fullblock bs=256K if=tape.0.fifo of=/dev/tape0 &
dd iflag=fullblock bs=256K if=tape.1.fifo of=/dev/tape1 &
sha384sum < tape.sha384sum.fifo > tape.sha384sum &
sha512sum < tape.sha512sum.fifo > tape.sha512sum &
# start fifo writer
tar -cz some/stuff/ | tee > *.fifo
Bash 프로세스 교체를 사용하십시오.
tar -cz some/stuff/ | \
tee > >(dd iflag=fullblock bs=256K of=/dev/tape0) \
>(dd iflag=fullblock bs=256K of=/dev/tape1) \
>(sha384sum > tape.sha384sum) \
>(sha512sum > tape.sha512sum)
stdout과 파일이 동시에 기록되기 >
때문에 추가 섹션이 존재합니다. 이로 인해 인수 중 하나는 stdout 리디렉션이 되고 다른 인수는 직접 쓰기를 위한 파일 인수가 됩니다. 또 다른 접근 방식은 표준 출력을 .tee
>
tee
> /dev/null
원하는 파이프 버퍼를 사용하거나 dd
사용 가능한 파이프 버퍼가 없는 경우 추가 버퍼링을 수행할 수 있습니다. 예를 들어:
dd iflag=fullblock bs=128M | dd iflag=fullblock bs=128M obs=256K of=/dev/tape0
이 dd | dd
구조를 사용하면 첫 번째가 dd
데이터 덩어리를 직접 수신하여 두 번째로 전달할 수 있습니다 dd
. 이를 통해 두 번째 데이터 블록이 쓰기 작업을 하는 동안 첫 번째 dd
여유 데이터 블록이 다음 데이터 블록을 버퍼링 할 수 있습니다.dd
이는 단일 프로세스 특성 dd
(이전 블록 쓰기가 완료될 때까지 다음 블록을 읽지 않음)을 중심으로 진행되며 이 후프를 점프하기 위해 전용 버퍼 프로그램을 사용할 필요는 없을 것입니다.
사실상 이는 최소 채우기 특성이 128M인 256M 버퍼입니다.
이러한 버퍼링이 긍정적인 영향을 미치는지 여부는 테이프 드라이브의 속도와 동작에 따라 달라집니다. 또한 효과가 없을 수도 있고(드라이브가 효과가 없을 정도로 빠르거나) 부정적인 효과가 있을 수도 있습니다(버퍼가 채워질 때까지 드라이브가 멈추거나 드라이브 자체 버퍼링 메커니즘과 충돌함).