Linux 디스크 이미지를 스파 스 파일로 어떻게 변환합니까?


12

EXT 파티션에 ddrescue로 만든 많은 디스크 이미지가 있으며 여전히 마운트 가능한 상태에서 데이터를 잃지 않고 크기를 줄이고 싶습니다.

이미지 파일 시스템의 빈 공간을 0으로 채우고 빈 공간이 실제로 디스크에 저장되지 않도록 스파 스 파일 로 변환하는 방법 은 무엇입니까?

예를 들면 다음과 같습니다.

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image

그러나 실제로 실제 데이터는 50G에 불과하므로 두 번째 측정은 훨씬 작아야합니다.

이것은 아마도 빈 공간을 0으로 채울 것입니다 :

cat /dev/zero > zero.file
rm zero.file

그러나 스파 스 파일이 투명하게 처리 되면 실제로 가상 디스크에 아무것도 쓰지 않고 스파 스 파일을 생성하여 가상 디스크 이미지를 스파 스 파일 자체로 변환하는 것을 역설적으로 방해 할 수 있습니다. :) 그렇습니까?

참고 : 어떤 이유로 마운트 된 디스크 이미지에없는 sudo dd if=/dev/zero of=./zero.file경우 작동 cat합니다.


2
파일에 0을 쓰면 스파 스 파일이 생성되지 않습니다. 다른 개념입니다. OS에서 데이터 블록이 실제로 존재하지 않음 (해당 지역의 데이터에 대해 블록 목록이 비어 있음)을 발견하면 스파 스 파일을 찾거나 읽을 때 자동으로 읽기 버퍼를 0 바이트로 채 웁니다.
hotei

참고 : sudo cat /dev/zero > zero.filebash (루트가 아닌 실행)는 sudo명령을 실행하기 전에 리디렉션을 수행하므로 작동하지 않습니다 . 참조 unix.stackexchange.com/questions/1416/...
프리츠

답변:


19

우선, 스파 스 파일은 0을 쓰지 않고 원하는 경우에만 투명하게 처리됩니다.

더 명확하게하기 위해 Wikipedia의 예

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

0을 쓰지 않으면 출력 파일을 열고 5MB를 찾고 (점프) 0 을 쓰십시오 (즉, 아무것도 아님). 이 명령 ( 하지 위키 백과)

dd if=/dev/zero of=sparse-file bs=1k count=5120

5MB의 0을 쓰고 희소 파일을 만들지 않습니다!

결과적으로 이미 스파 스가 아닌 파일은 나중에 마술처럼 희소 해지지 않습니다.

둘째, 제로가 많지 않은 파일을 만들려면 CP를 사용해야 합니다.

cp --sparse=always original sparsefile

또는 tar 또는 rsync 의 --sparse 옵션을 사용할 수도 있습니다.


1
Wikipedia에 따르면 dd로 0을 쓰면 스파 스 파일이 생성됩니다. "찾는"의 의미를 설명 할 수 있습니까?
endolith

1
그럼 고양이는 어때? 맨 페이지에는 스파 스 파일에 대한 내용이 없으므로 cat /dev/zero > zero.file빈 공간을 0으로 채우는 것이 좋습니다.
Ludwig Weinzierl

2
@endolith : dd0을 쓰거나 찾는 데 차이점이 무엇인지 명확히하기 위해 내 대답을 업데이트했습니다 .
mihi

2
@Ludwig Weinzierl : 예,이 cat명령은 전체 디스크 (또는 적어도 루트 나 할당량으로 예약되지 않은 양)를 "실제"0으로 채우고 스파 스 파일을 만들지 않습니다.
mihi

1
@endolith 당신은 여분의 공간이 필요합니다. tarball을 압축 할 수 있기 때문에 원본 파일과 압축 된 버전의 스파 스 파일을위한 공간 만 있으면됩니다.
mihi

12

아마도 파일을 올바른 위치에 저장하는 가장 쉬운 방법 fallocate은 다음과 같이 유틸리티 를 사용하는 것입니다 .

fallocate -v --dig-holes {file_name}

fallocate (1)Debian의 util-linux 패키지에서 제공됩니다 .


1
어떤 이유로, fallocate --dig-holes동안, 299GiB의 원본 103GiB 파일에 결과 cp --sparse=always같은 SHA1 합계 모든 (크기를 통해 확인 - 나에게 93GiB을 준 du -B1Gdu --apparent-size -B1G). 그래서 fallocate열등한 결과를 보인다.
Ruslan

3

완성도에 대한 내 답변 편집 :

  1. 0으로 빈 FS 공간을 벌리십시오 (경고 : 디스크 이미지가 변경됨).

losetup --partscan --find --show disk.img

디스크로 / dev / loop1을 제공하고 파티션이 하나만 있다고 가정하면 마운트 가능한 FS가있는 모든 파티션에 대해 이것을 반복해야합니다 (스왑 파티션 등 무시).

mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile

ENOSPC로 실패를 끝내십시오.

/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1

  1. 스파 스 이미지로 복사 :

'dd'에는 0이있는 파일을 스파 스 파일로 변환하는 옵션이 있습니다.

dd if=disk.img of=disk-sparse.img conv=sparse



1
예,이 옵션은 OP가 요청한 시점이 아닙니다. 이것은 "다른 수색자를위한 빵 부스러기를 남겨 두는 것"에 관한 것이 었습니다 ... :-)
Lam Das

1
파일 시스템 유형에 따라 파일 시스템에 zerofree0을 마운트하고 쓰는 것보다 빠를 수 있으며 디스크 이미지에 이미 0이 많이 포함되어 있으면 디스크 이미지가 줄어 듭니다.
mihi

2

ddrescue에서 생성 한 이미지가 50GB이고 실제로는 훨씬 적은 양으로 충분하다는 것을 의미합니까?

이 경우 먼저 dd로 새 이미지를 만들 수 없었습니다.

dd if=/dev/zero of=some_image.img bs=1M count=20000

그런 다음 파일 시스템을 작성하십시오.

mkfsofyourchoice some_image.img

그런 다음 이미지를 마운트하고 이전 이미지에서 새 이미지로 모든 것을 복사합니까? 그게 당신을 위해 일할 것입니까?


2

PartImage 는 파일 시스템의 사용 된 블록 만 저장하는 디스크 이미지를 생성 할 수 있으므로 사용되지 않는 블록을 무시하여 필요한 공간을 크게 줄입니다. 결과 이미지를 직접 마운트 할 수는 없지만 다음과 같이 진행합니다.

image -> partimage -> image -> cp --sparse=alway

원하는 것을 생산해야합니다 (마지막 단계를 고수 할 수도 있고 시도하지 않았을 수도 있음).


1
불행하게도 partimage로 만든 이미지는 다시 확장하지 않고 마운트 할 수 없으므로 보관 목적으로 만 적합합니다.
퍼킨스

0

이제 virt-sparsify 라는 도구가 있습니다 . 빈 공간을 0으로 채우고 이미지를 스파 스 파일로 복사합니다. 그러나 많은 종속성을 설치해야합니다.


-2

정말 당신이하고 싶은 일이라면 해당 사양으로 작성된 사용자 정의 프로그램이 필요하다고 생각합니다. 근데 ...?

실제로 제로 영역이 많이 있다면 좋은 압축 도구를 사용하면 크게 줄어 듭니다. 스파 스 파일을 작성하는 것은 모든 경우에 작동하지 않습니다. 올바르게 기억한다면, 희소 파일조차도 입력 블록에 0이 아닌 모든 비트가 포함되는 최소 1 블록의 출력 스토리지를 차지합니다. 예를 들어, 512 바이트 블록 당 평균 0이 아닌 비트를 가진 파일이 있다고 가정합니다. "작게"쓸 수는 없습니다. 그런데 zip, bzip, bzip2 또는 p7zip으로 파일을 압축하면 데이터가 손실되지 않습니다. 그들은 손실이있는 mpeg 또는 jpeg 압축을 좋아하지 않습니다.

다른 한편으로, 파일에 대한 임의 탐색 읽기를 수행해야 할 경우 압축이 가치보다 더 어려울 수 있으며 스파 스 쓰기로 돌아갑니다. 유능한 C 또는 C ++ 프로그래머는 1 시간 이내에 이와 같은 것을 작성할 수 있어야합니다.


흥미 롭다 – 공감대이지만 나는 내가 쓴 것에 대한 반박이 없다는 것을 알았다. 정확하지만 도움이되지 않는 경우에는 다운 투트 할 이유가 없습니다. 정확하지 않고 도움이되지 않으면 가치가 있습니다.
hotei

OP가 압축 이미지 마운트와 관련하여 질문을 한 다른 곳을 봅니다. 나는 이것이 그 스레드의 연속이라고 가정합니다. 압축에 대한 제안이 왜 받아 들여지지 않았는지 알 수 있습니다. 간단한 C 프로그램은 스파 스 파일을 만드는 쉬운 방법입니다. 그러나 (지정되지 않은) OS를 통해 스파 스 ISO를 마운트 할 수 있습니까? 우분투 ISO 마운터만큼 까다 롭습니다 .100 % 확실하지는 않지만 어떤 경우에도 행운을 빕니다.
hotei

4
왜 바퀴를 재발 명합니까? cp --sparse=always잘 작동
합니까

@mihi : 좋은 생각입니다. 스파 스 옵션에 대해서는 BSD 버전 ( freebsd.org/cgi/… ) 에서 사용할 수 없으므로 스파 스 옵션에 대해 몰랐 으며 cp에 대한 Linux 매뉴얼 페이지를 볼 필요가 없었습니다 (오늘날까지).
hotei

압축 이미지를 가져 와서 마운트하는 한 가지 방법은 기본 압축을 지원하는 파일 시스템에 간단히 저장하는 것입니다. 드라이브 충돌이 발생하면 데이터 복구가 끔찍하지만 백업이 바로 그런 것입니까?
퍼킨스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.