0이 많이 포함된 파일을 희소 파일로 압축 해제하는 방법은 무엇입니까?

0이 많이 포함된 파일을 희소 파일로 압축 해제하는 방법은 무엇입니까?

매우 큰 하드 드라이브를 사용하여 생성된 압축된 원시 이미지가 있습니다 cat /dev/sdx | xz > image.xz. 그러나 이 작업을 수행하기 전에 드라이브의 여유 공간이 지워지고 이미지는 대부분 0바이트로 구성됩니다. 제로 블록이 공간을 차지하지 않도록 이 이미지를 희소 파일로 추출하는 가장 쉬운 방법은 무엇입니까?

답변1

맨페이지(이런 종류의 질문은 꼭 물어봐야 합니다)를 인용하여 xz빠르게 검색해 보았습니다 sparse.

--no-sparse
스파스 파일 생성을 비활성화합니다. 기본적으로 일반 파일로 압축을 풀 때 압축이 풀린 데이터에 긴 이진 0 시퀀스가 ​​포함되어 있으면 xz는 파일을 희박하게 만들려고 시도합니다.. stdout이 일반 파일에 연결되어 있고 안전을 위해 특정 추가 조건이 충족되는 한 stdout에 쓸 때도 작동합니다. 스파스 파일을 생성하면 디스크 I/O 양이 줄어들어 디스크 공간이 절약되고 압축 해제 속도가 빨라집니다.

(강조는 내 것)

따라서 아무것도 할 필요가 없으며 xz기본 도구를 사용하여 압축을 풀기만 하면 됩니다.

답변2

dd이 명령에는 최소한 하나의 GNU, NetBSD 및 FreeBSD 구현이 있습니다 conv=sparse. GNU dd매뉴얼을 인용하려면:

sparse
NUL 출력 블록을 작성하는 대신 찾아보십시오. 스파스 파일을 지원하는 파일 시스템에서는 출력 파일을 확장할 때 스파스 출력이 생성됩니다. 또는 와 함께 이 변환을 conv=notrunc사용할 때는 주의하십시오 oflag=append. 를 사용하면 conv=notrunc입력의 NUL 블록에 해당하는 출력 파일의 기존 데이터가 변경되지 않고 유지됩니다. 수행된 검색이 oflag=append유효하지 않습니다. 마찬가지로 출력이 파일이 아닌 장치인 경우 NUL 입력 블록은 복사되지 않으므로 이 변환은 가상 또는 프로비저닝된 제로 장치에 가장 유용합니다.

그래서 내가 노력할게

xz -dc < image.xz | dd of=image conv=sparse

이런 방식으로 사용하면 dd모든 형태의 입력에서 작동합니다(첫 번째 명령 자체가 스파스 파일을 생성할 수 있는지 여부에 관계없이).

답변3

내 경험에 따르면 SSD 및 NVME와 같은 최신 하드웨어를 사용할 때 dd -conv=sparse 및/또는 gzip/pbzip/xz 등을 사용하면 할당되지 않은 블록이 임의의 데이터를 반환하고 이러한 데이터와 함께 사용할 수 없기 때문에 좋은 결과를 얻을 수 없습니다. 압축되거나 드물게 변환됩니다. 나는 다음을 사용하는 것이 좋습니다:

partclone.<fstype> -c -d -s /dev/<input> -o /path/to/<output>

이렇게 하면 항상 가장 작은 파일이 생성되고 생성/복원 속도가 가장 빨라집니다. 원하는 경우 압축, CRC 등을 추가할 수도 있습니다.

관련 정보