원래 희박한 파일이 나중에 확장되면 다시 희박해질 수 있습니까?

원래 희박한 파일이 나중에 확장되면 다시 희박해질 수 있습니까?

나는 희소 파일을 이해하는 유틸리티를 사용하지 않고 원래 희소 파일의 내용을 복사하거나 전송하면 "구멍"이 채워지는 것을 알고 있습니다. 스파스 파일을 스파스 파일로 복원하는 방법이나 유틸리티가 있습니까?

예:
스파스 파일을 생성합니다.

% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

다음과 같은 방법이 있습니까?

% resparse TEST2
to get:
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
  0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

답변1

2015년에 편집됨

util-linux 2.25부터,fallocateLinux의 유틸리티에는 -d/ --dig-hole옵션이 있습니다.

fallocate -d the-file

채워진 블록마다 구멍이 파집니다.영점파일에


이전 시스템에서는 수동으로 수행할 수 있습니다.

Linux에는 이를 수행할 수 있는 FALLOC_FL_PUNCH_HOLE옵션이 있습니다 fallocate. 예제가 포함된 스크립트를 github에서 찾았습니다.

Python에서 FALLOC_FL_PUNCH_HOLE 사용

귀하의 요구 사항에 맞게 약간 수정했습니다. 0으로 채워진 파일 영역에 구멍을 만들었습니다. 여기있어:

Python에서 FALLOC_FL_PUNCH_HOLE을 사용하여 파일에 구멍을 뚫습니다.

usage: punch.py [-h] [-v VERBOSE] FILE [FILE ...]

Punch out the empty areas in a file, making it sparse

positional arguments:
  FILE                  file(s) to modify in-place

optional arguments:
  -h, --help            show this help message and exit
  -v VERBOSE, --verbose VERBOSE
                        be verbose

예:

# create a file with some data, a hole, and some more data
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=0
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=2

# see that it has holes
$ du --block-size=1 --apparent-size test1
12288   test1
$ du --block-size=1 test1
8192    test1

# copy it, ignoring the hole
$ cat test1 > test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
12288    test2

# punch holes again
$ ./punch.py test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
8192    test2

# verify
$ cmp test1 test2 && echo "files are the same"
files are the same

펑처링할 4096바이트 블록만 검색 하므로 punch.py파일이 시작될 때만큼 희박해지지 않을 수 있습니다. 물론 더 똑똑해질 수도 있다. 반품,가볍게 테스트한 결과, 그러니까 조심해서 놔두세요지원믿기 ​​전에!

답변2

파일을 희박하게 만들고 싶다면 를 사용할 수 있습니다 dd.

dd if=./zeropadded.iso of=./isnowsparse.iso conv=sparse

dd(1)매뉴얼 에서 :

          sparse   If one or more output blocks would consist solely of
                   NUL bytes, try to seek the output file by the required
                   space instead of filling them with NULs, resulting in a
                   sparse file.

따라서 전체 블록이 비어 있는 경우에만 앞으로 검색한다는 점에 유의하세요. 희소성을 최대화하려면 를 사용하십시오 bs=1.

답변3

tar플래그를 사용하여 누락하고 ( -SGNU tar로 가정) 다시 실행하면 scp... 그렇지 않습니다. 내가 아는 한, "구멍"이 어디에 있는지 아는 유틸리티는 없습니다.

답변4

나는 이것으로 행운을 누렸습니다.

cd whatever
rsync -avxWSHAXI . .

-Irsync는 파일이 변경되었다고 생각하는지 여부에 관계없이 모든 파일을 강제로 업데이트합니다. 이로 -S인해 새 파일이 희박해집니다. -a반복적으로 발생하도록 하여 단일 명령으로 전체 디렉터리 트리를 희소화할 수 있습니다.

취약점을 찾아서 사용자 정의 도구로 이를 깨뜨리는 것만큼 좋지는 않지만 FALLOC_FL_PUNCH_HOLE, 전체 디렉토리 트리를 복사하는 것보다는 낫습니다.

관련 정보