スパースファイルを理解するユーティリティを使用せずに、元々スパースファイルであったものをコピーまたは転送すると、「穴」が埋められることを知っています。かつてスパースファイルであったものをスパースに戻す方法またはユーティリティはありますか?
例えば:
スパースファイルを作成:
% 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
util-linux 2.25以降、Linuxの fallocate
ユーティリティには-d
/--Dig-hole
オプションがあります。
fallocate -d the-file
ファイル内のzerosでいっぱいのブロックごとに穴を掘る
古いシステムでは、手動で行うことができます。
Linuxには、これを行うことができるfallocate
へのFALLOC_FL_PUNCH_HOLE
オプションがあります。私は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バイトのブロックのみを検出してパンチアウトするため、ファイルを起動時とまったく同じようにまばらにしない場合があることに注意してください。もちろん、もっと賢くすることもできます。また、それは軽くテストされただけですので、注意してbackupsの前に信じて!
ファイルをスパースにしたい場合は、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
_を使用します。
tar
の不足--S
フラグ(GNU tarと仮定)、およびscp
...を再実行します。いいえ。私が知っているユーティリティでは、「穴」だった。
私はこれでうまくいきました:
cd whatever
rsync -avxWSHAXI . .
-I
_は、rsyncがファイルが変更されたかどうかに関係なく、すべてのファイルを更新するように強制します。 -S
により、新しいファイルがスパース化されます。 -a
は、これを再帰的に実行するので、1つのコマンドでディレクトリツリー全体をスパース化できます。
FALLOC_FL_PUNCH_HOLE
で穴を探し出して破壊する特注のツールほど良くはありませんが、ディレクトリツリー全体を複製する必要があるよりはましです。