이미지를 디스크에 기록하지만 소스 이미지의 섹터에는 모두 0이 포함되어 있지 않습니까?

이미지를 디스크에 기록하지만 소스 이미지의 섹터에는 모두 0이 포함되어 있지 않습니까?

128GB 디스크가 있다고 가정 해 보겠습니다. 디스크는 12GB만 사용합니다. 116GB의 디스크는 모두 0(0x00)을 포함하는 빈 공간입니다.

디스크의 정확한 스냅샷을 찍어 나중에 현재와 똑같이 재구성할 수 있도록 하고 싶습니다. 압축된 이미지의 공간을 절약하기 위해 또는 와 같은 빠른 압축 알고리즘을 통해 lz4이미지를 전달 하겠습니다 zstd.

다음과 같은 유사한 도구를 사용하여 이 작업을 수행할 수 있습니다 dd.pv

pv /dev/sdb | lz4 > disk.image.lz4

이제 크기가 약 10GB이지만 실제로는 0이 포함된 전체 128GB 이미지를 포함하는 디스크 이미지 파일이 있습니다. 0은 압축된 것입니다.

이제 이 이미지를 디스크에 다시 쓰고 싶습니다. 당연히 나는 이것을 할 수 있습니다 :

lz4 -d -c disk.image.lz4 > /dev/sdb

그러나 여기서 문제는 이미지를 디스크에 다시 쓰는 작업은 모든 것, 심지어 0까지도 디스크에 다시 쓰기 때문에 시간이 오래 걸릴 수 있다는 것입니다.

두 가지 중 하나를 가정합니다. 복제본에서 한때 0이었던 블록이 여전히 0인지 상관하지 않거나 SSD인 경우 blkdiscard말 그대로 몇 초 안에 이미지를 쓰기 전에 SSD의 모든 블록을 삭제할 수 있습니다. 몇 분 안에 디스크를 지웁니다.

질문: 소스 이미지를 블록별로 읽고, 영점을 감지하고, 간단히뛰어 넘다출력 장치에 이 블록을 쓰시겠습니까?

예를 들어, 1MB 청크를 사용하는 경우 이상적인 도구는 1MB의 데이터를 읽고 모두 0x00인지 확인한 다음, 그렇지 않은 경우 대상의 동일한 위치에 씁니다. 블록이 실제로 모두 0x00이면 쓰기가 완전히 건너뜁니다.

이것이 장점이 되는 이유는 다음과 같습니다.

  • 모든 블록을 대상 디스크에 쓰는 데 시간이 오래 걸릴 수 있습니다. 특히 크기가 2TB가 넘지만 상대적으로 적은 양의 실제 데이터만 포함하는 회전식 하드 드라이브를 사용하는 경우에는 더욱 그렇습니다.
  • 드라이브의 상대적으로 작은 부분에만 우리가 관심을 갖는 데이터가 포함될 수 있는데 SSD 쓰기 주기를 전체 드라이브에 0x00을 쓰는 데 소비하는 것은 상당히 낭비입니다.
  • 이미지가 기록될 때 압축이 풀리므로 소스 장치에 추가 읽기 I/O가 적용되지 않습니다.

이 작업을 수행하기 위한 간단한 도구가 아직 존재하지 않는다면 작성하려고 합니다. 하지만 이를 수행할 수 있는 방법이 이미 있다면 무엇입니까?

편집: 더 자세한 내용을 제공하기 위해 활성화된 소프트웨어 라이센스가 포함된 하드 드라이브 파티션을 백업하는 사용 사례를 예로 들겠습니다. 활성화 구성표에 따라 단순 파일 복사 또는 파일 시스템 인식 파티션 이미지도 올바르게 복원되지 않을 수 있습니다. (예를 들어 인증 체계가 할당되지 않은 공간에 데이터를 저장하는 경우 파일 테이블의 섹터는 불량 섹터가 아니더라도 의도적으로 불량으로 표시되거나 NTFS의 MFT 자체 등이 표시됩니다.) 따라서 복구 파티션이 여전히 유효한 라이센스를 생성하도록 하려면 모두 0이 아닌 모든 항목을 비트 단위로 복사해야 합니다.

답변1

압축되지 않은(희소할 수 있는) 소스 파일의 경우 (GNU)만 사용하면 cp --sparse=always sourcefile /dev/sdX충분합니다.

--sparse=WHEN

스파스 파일 생성을 제어합니다. 아래를 참조하세요

기본적으로 희소 소스 파일은 대략적인 휴리스틱을 통해 감지되며 해당 대상 파일도 희소화됩니다. 이것은 선택된 동작입니다 --sparse=auto. --sparse=alwaysSOURCE 파일에 0바이트의 긴 시퀀스가 ​​포함될 때마다 스파스 DEST 파일이 생성되도록 지정합니다 . --sparse=never스파스 파일 생성을 비활성화 하는 데 사용됩니다 .

희소 파일 생성은 쓰기보다는 검색을 통해 간단히 수행됩니다. 블록 장치에서는 이것이 바로 OP가 찾고 있는 것입니다(말장난 의도).

lz4희박한 지원 도 있습니다.

--[no-]sparse

스파스 모드 지원(기본값: 파일에서는 활성화되고 stdout에서는 비활성화됨)

lz4 -d -c --sparse disk.image.lz4 > /dev/sdX

이 방법도 작동하지만(지정할 필요조차 없음 --sparse) 먼저 파일 덮어쓰기에 대해 경고합니다.

lz4 -d --sparse /tmp/src.img.lz4 /dev/sdX

마지막으로 다른 경우(GNU?)의 경우 ddsparse가 기본적으로 지원됩니다.

sparse모두 NUL 출력 블록을 작성하는 대신 검색해 보세요.

lz4 -d -c disk.image.lz4 | dd conv=sparse of=/dev/sdX

(아마도 SSD 삭제 블록 크기와 비슷한 크기를 설정할 것입니다. bs=기본 512바이트를 그대로 두는 대신 약 1M 정도일 것입니다.)

답변2

예 - Clonezilla를 보세요.

파일 시스템의 사용되지 않은 부분은 백업 이미지(또는 디스크의 할당되지 않은 부분)에 복사되지 않습니다. 하지만 데이터가 희박하다면 문서파일 시스템은 이를 하나의 큰 할당으로 처리한 다음 내용에 관계없이 하나의 큰 할당으로 처리합니다.

Clonezilla는 또한 병렬 gzip을 포함하여 선택할 수 있는 압축기를 통해 선택한 출력을 전달합니다.

일종의 "원시" 디스크 액세스 권한이 있는 경우 원하는 것을 읽거나 쓸 수 있지만 누락된 0 블록이 어디에 있는지 나타내는 방법을 고안해야 합니다. 파일을 압축 형식으로 저장하고 "즉시" 압축을 풀 수 있습니다. 나는 20여년 전에 이 작업을 수행한 DOS 제품이 있었다고 생각합니다. 이 제품은 오류를 잘 처리하지 못했습니다.

관련 정보