我知道,在不使用理解稀疏文件的实用程序的情况下复制或传输最初是稀疏文件的内容将导致“漏洞”被填充。是否有一种方法或实用程序可以将曾经的稀疏文件恢复为稀疏文件?
例如:
创建稀疏文件:
% 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 开始,fallocate
Linux 上的实用程序有一个-d
/--dig-hole
选项。
fallocate -d the-file
会为每个装满的块挖一个洞零点在文件中
在旧系统上,您可以手动完成:
Linux 有一个FALLOC_FL_PUNCH_HOLE
选项fallocate
可以做到这一点。我在github上找到了一个脚本,其中有一个示例:
从 Python 使用 FALLOC_FL_PUNCH_HOLE
我对它进行了一些修改,以满足您的要求——在用零填充的文件区域中打孔。这里是:
使用 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
请注意,punch.py
仅查找要打孔的 4096 字节块,因此它可能不会使文件与开始时一样稀疏。当然,它可以变得更加智能。还,仅经过轻微测试,所以要小心并让备份在信任它之前!
答案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
-ing 它与一个-S
标志(假设 GNU tar),并重新执行scp
...不。据我所知,没有任何实用程序能够知道“漏洞”在哪里。
答案4
我对此很幸运:
cd whatever
rsync -avxWSHAXI . .
强制-I
rsync 更新所有文件,无论它是否认为它们已更改;这-S
会导致新文件变得稀疏。-a
使其递归发生,这样您就可以通过一个命令稀疏整个目录树。
它不如寻找漏洞并用 破坏它们的定制工具那么好FALLOC_FL_PUNCH_HOLE
,但它比必须复制整个目录树要好。