web-dev-qa-db-ja.com

最初はスパースで、その後拡張されたファイルを再びスパースにすることはできますか?

スパースファイルを理解するユーティリティを使用せずに、元々スパースファイルであったものをコピーまたは転送すると、「穴」が埋められることを知っています。かつてスパースファイルであったものをスパースに戻す方法またはユーティリティはありますか?

例えば:
スパースファイルを作成:

% 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
29
user25849

2015年を編集

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の前に信じて!

30
Jim Paris

ファイルをスパースにしたい場合は、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_を使用します。

8
bahamat

tarの不足--Sフラグ(GNU tarと仮定)、およびscp...を再実行します。いいえ。私が知っているユーティリティでは、「穴」だった。

2
tink

私はこれでうまくいきました:

cd whatever
rsync -avxWSHAXI . .

-I_は、rsyncがファイルが変更されたかどうかに関係なく、すべてのファイルを更新するように強制します。 -Sにより、新しいファイルがスパース化されます。 -aは、これを再帰的に実行するので、1つのコマンドでディレクトリツリー全体をスパース化できます。

FALLOC_FL_PUNCH_HOLEで穴を探し出して破壊する特注のツールほど良くはありませんが、ディレクトリツリー全体を複製する必要があるよりはましです。

2
David Given