하드웨어 리소스를 낭비하지 않고 동적 스트림 압축을 하시겠습니까?

하드웨어 리소스를 낭비하지 않고 동적 스트림 압축을 하시겠습니까?

200GB의 여유 디스크 공간, 16GB의 RAM(데스크톱과 커널이 약 1GB를 차지함), 6GB의 스왑 공간이 있습니다.

240GB 외장 SSD가 있는데 그 중 70GB를 사용하고 나머지는 무료이므로 디스크에 백업해야 합니다.

일반적으로 dd if=/dev/sdb of=Desktop/disk.img디스크를 먼저 생성한 다음 압축하지만 이미지를 먼저 생성하는 것은 선택 사항이 아닙니다. 그렇게 하면 압축 단계에서 여유 공간이 압축되어 최종 이미지가 압축되더라도 필요한 것보다 더 많은 디스크 공간이 필요하기 때문입니다. 아카이브는 내 디스크에 쉽게 들어갈 수 있습니다.

dd기본적으로 STDOUT에 쓰고 gzipSTDIN에서 읽을 수 있으므로 이론적으로는 쓸 수 있지만 dd if=/dev/sdb | gzip -9 -바이트 를 생성하는 것보다 gzip읽는 데 훨씬 더 오래 걸립니다.dd

~에서man pipe:

파이프의 쓰기 끝에 기록된 데이터는 파이프의 읽기 끝에서 읽을 때까지 커널에 의해 버퍼링됩니다.

저는 |파이프라인을 실제 파이프라인으로 상상합니다. 한 애플리케이션은 데이터를 파이프라인 큐에 푸시하고, 다른 애플리케이션은 가능한 한 빨리 파이프라인 큐에서 데이터를 가져옵니다.

파이프 반대편에서 처리할 수 있는 데이터보다 왼쪽에 있는 프로그램이 더 빠르게 데이터를 쓰면 어떻게 될까요? 과도한 메모리나 스왑 공간 사용이 발생합니까? 아니면 커널이 디스크에 FIFO를 생성하여 디스크를 채우려고 합니까? 아니면 SIGPIPE Broken pipe버퍼가 너무 크면 실패할까요?

기본적으로 이는 두 가지 질문으로 귀결됩니다.

  1. 한 번에 읽을 수 있는 것보다 더 많은 데이터가 파이프에 푸시되면 어떤 영향과 결과가 발생합니까?
  2. 압축되지 않은 전체 데이터 스트림을 디스크에 저장하지 않고 데이터 스트림을 디스크로 압축하는 안정적인 방법은 무엇입니까?

참고 1: 조각화 및 기타 요소로 인해 전체 콘텐츠가 손상되지 않아야 하기 때문에 사용된 처음 70GB의 정확한 복사본을 만들고 작동하는 시스템이나 파일 시스템을 얻을 것으로 기대할 수는 없습니다.

답변1

dd데이터 블록은 한 번에 하나씩 읽고 쓰며, 미해결 데이터 블록은 하나만 있습니다. 그래서

valgrind dd if=/dev/zero status=progress of=/dev/null bs=1M

dd1MB의 메모리가 사용됩니다. 청크의 크기를 조정한 다음 삭제하여 valgrind속도에 미치는 영향을 확인할 수 있습니다.dd

gzip입력 할 때 dd일치 속도를 늦추십시오 gzip. 메모리 사용량이 증가하지 않으며 커널이 디스크에 버퍼를 저장하도록 하지도 않습니다(커널은 이를 수행하는 방법을 모릅니다.통과하다교환). 튜브 파열 signal(7)은 튜브의 한쪽 끝이 죽을 때만 발생합니다 write(2).

그러므로

dd if=... iconv=fullblock bs=1M | gzip -9 > ...

원하는 것을 달성하는 안전한 방법입니다.

파이핑 시 읽기 프로세스가 유지되지 않으면 결국 쓰기 프로세스가 커널에 의해 차단됩니다. 이것을 실행하면 볼 수 있습니다

strace dd if=/dev/zero bs=1M | (sleep 60; cat > /dev/null)

1MB의 읽기가 표시 dd되면 a를 실행 write()하고 실행되는 동안 잠시 기다립니다 sleep. 이것이 파이프의 양쪽이 균형을 이루는 방식입니다. 쓰기 프로세스가 너무 빠르면 커널이 쓰기를 차단하고, 읽기 프로세스가 너무 빠르면 커널이 읽기를 차단합니다.

답변2

기술적으로는 다음이 필요하지도 않습니다 dd.

gzip < /dev/drive > drive.img.gz

이를 사용하는 경우 dd항상 기본값보다 큰 블록 크기를 사용해야 합니다 dd bs=1M. 그렇지 않으면 시스템 호출 지옥으로 고통받게 됩니다( dd기본 블록 크기는 512바이트이고 해당 read()s와 write()s는 4096시스템 호출마다 있으므로 MiB오버헤드가 너무 큽니다). 엄청난).

gzip -9더 많은 CPU가 사용되지만 표시할 내용은 거의 없습니다. 속도가 느려 지면 gzip압축 수준을 낮추거나 다른(빠른) 압축 방법을 사용하십시오.

이미지 가 아닌 파일 기반 백업을 수행하는 경우 dd압축할지 여부를 결정하는 몇 가지 논리가 있을 수 있습니다(다양한 파일 형식에 대해 이 작업을 수행하는 것은 의미가 없습니다). dar( taralternative`)는 이를 수행하는 옵션의 예입니다.

여유 공간이 0인 경우(TRIM 후 안정적으로 0을 반환하는 SSD이고 fstrim캐시를 실행 및 삭제하기 때문에) ddwith conv=sparse플래그를 사용하여 압축되지 않은 루프 마운트 가능한 희소 이미지를 생성할 수도 있습니다. 이 이미지는 0의 디스크 공간을 사용합니다. 제로 지역의 경우. 스파스 파일을 지원하는 파일 시스템에서 이미지 파일을 지원해야 합니다.

또는 일부 파일 시스템의 경우 사용된 영역만 이미지화할 수 있는 프로그램이 있습니다.

답변3

성능 외에는 부정적인 영향이 없습니다. 파이프에는 일반적으로 64K의 버퍼가 있으며, 그 이후에는 gzip더 많은 데이터를 읽을 때까지 파이프에 대한 쓰기가 차단됩니다.

답변4

어쩌면 파일이 필요하고 tar를 사용할 수도 있습니다. 누군가가 이미 요청한 대로 원하는 내용이 포함되지 않은 블록을 0으로 채울 수 있습니다.0으로 사용되지 않는 공간 지우기(ext3, ext4)

그러면 pigz일반적으로 gzip.

관련 정보