매우 큰 하드 드라이브를 사용하여 생성된 압축된 원시 이미지가 있습니다 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 등을 추가할 수도 있습니다.