200GB의 여유 디스크 공간, 16GB의 RAM(데스크톱과 커널이 약 1GB를 차지함), 6GB의 스왑 공간이 있습니다.
240GB 외장 SSD가 있는데 그 중 70GB를 사용하고 나머지는 무료이므로 디스크에 백업해야 합니다.
일반적으로 dd if=/dev/sdb of=Desktop/disk.img
디스크를 먼저 생성한 다음 압축하지만 이미지를 먼저 생성하는 것은 선택 사항이 아닙니다. 그렇게 하면 압축 단계에서 여유 공간이 압축되어 최종 이미지가 압축되더라도 필요한 것보다 더 많은 디스크 공간이 필요하기 때문입니다. 아카이브는 내 디스크에 쉽게 들어갈 수 있습니다.
dd
기본적으로 STDOUT에 쓰고 gzip
STDIN에서 읽을 수 있으므로 이론적으로는 쓸 수 있지만 dd if=/dev/sdb | gzip -9 -
바이트 를 생성하는 것보다 gzip
읽는 데 훨씬 더 오래 걸립니다.dd
~에서man pipe
:
파이프의 쓰기 끝에 기록된 데이터는 파이프의 읽기 끝에서 읽을 때까지 커널에 의해 버퍼링됩니다.
저는 |
파이프라인을 실제 파이프라인으로 상상합니다. 한 애플리케이션은 데이터를 파이프라인 큐에 푸시하고, 다른 애플리케이션은 가능한 한 빨리 파이프라인 큐에서 데이터를 가져옵니다.
파이프 반대편에서 처리할 수 있는 데이터보다 왼쪽에 있는 프로그램이 더 빠르게 데이터를 쓰면 어떻게 될까요? 과도한 메모리나 스왑 공간 사용이 발생합니까? 아니면 커널이 디스크에 FIFO를 생성하여 디스크를 채우려고 합니까? 아니면 SIGPIPE Broken pipe
버퍼가 너무 크면 실패할까요?
기본적으로 이는 두 가지 질문으로 귀결됩니다.
- 한 번에 읽을 수 있는 것보다 더 많은 데이터가 파이프에 푸시되면 어떤 영향과 결과가 발생합니까?
- 압축되지 않은 전체 데이터 스트림을 디스크에 저장하지 않고 데이터 스트림을 디스크로 압축하는 안정적인 방법은 무엇입니까?
참고 1: 조각화 및 기타 요소로 인해 전체 콘텐츠가 손상되지 않아야 하기 때문에 사용된 처음 70GB의 정확한 복사본을 만들고 작동하는 시스템이나 파일 시스템을 얻을 것으로 기대할 수는 없습니다.
답변1
dd
데이터 블록은 한 번에 하나씩 읽고 쓰며, 미해결 데이터 블록은 하나만 있습니다. 그래서
valgrind dd if=/dev/zero status=progress of=/dev/null bs=1M
약 dd
1MB의 메모리가 사용됩니다. 청크의 크기를 조정한 다음 삭제하여 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
( tar
alternative`)는 이를 수행하는 옵션의 예입니다.
여유 공간이 0인 경우(TRIM 후 안정적으로 0을 반환하는 SSD이고 fstrim
캐시를 실행 및 삭제하기 때문에) dd
with conv=sparse
플래그를 사용하여 압축되지 않은 루프 마운트 가능한 희소 이미지를 생성할 수도 있습니다. 이 이미지는 0의 디스크 공간을 사용합니다. 제로 지역의 경우. 스파스 파일을 지원하는 파일 시스템에서 이미지 파일을 지원해야 합니다.
또는 일부 파일 시스템의 경우 사용된 영역만 이미지화할 수 있는 프로그램이 있습니다.
답변3
성능 외에는 부정적인 영향이 없습니다. 파이프에는 일반적으로 64K의 버퍼가 있으며, 그 이후에는 gzip
더 많은 데이터를 읽을 때까지 파이프에 대한 쓰기가 차단됩니다.
답변4
어쩌면 파일이 필요하고 tar를 사용할 수도 있습니다. 누군가가 이미 요청한 대로 원하는 내용이 포함되지 않은 블록을 0으로 채울 수 있습니다.0으로 사용되지 않는 공간 지우기(ext3, ext4)
그러면 pigz
일반적으로 gzip
.