この質問が非常に古いことは承知していますが、私と同じ方法でここにたどり着いた他の人に役立つかもしれない最新情報です。
ありがたいことに、mvp の優れた回答は廃止されました。 GNU tar のリリース ノートによると、2016 年 5 月 16 日にリリースされた v. 1.29 で SEEK_HOLE/SEEK_DATA が追加されました。 (そして、現在 Debian 安定版では GNU tar v. 1.30 が標準であるため、tar バージョン 1.29 以上がほぼどこでも利用可能であると想定しても安全です。)
そのため、現在スパース ファイルを処理する方法は、システムにインストールされている tar (GNU または BSD) を使用してそれらをアーカイブすることであり、抽出についても同じです。
さらに、実際にいくつかのデータを含むスパース ファイルの場合、圧縮を使用する価値がある場合 (つまり、データが十分に圧縮可能であり、かなりのディスク スペースを節約でき、ディスク スペースの節約は、圧縮に必要なかなりの時間と CPU リソースに見合うだけの価値があります)。 :
tar -cSjf <archive>.tar.bz2 /path/to/sparse/file
tar の SEEK_HOLE 機能を利用してスパース ファイルを迅速かつ効率的にアーカイブし、bzip2 を使用して実際のデータを圧縮します。tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file
、マルシンのコメントでほのめかされているように、も同じことをします 圧縮タスクに複数のコアを使用する
pbzip2
を使用して、クアッドコア Atom CPU を搭載した私の小さなホーム サーバーで vs bzip2
時間が約 25 または 30% 短縮されました。
圧縮の有無にかかわらず、これにより、特別なスパース ファイルの処理を必要とせず、元のスパース ファイルの「実際の」サイズとほぼ同じ (または圧縮されている場合はそれ以下) のアーカイブが得られ、心配することなく移動できます。異なるユーティリティのスパース ファイル機能の不一致について。例:cp
スパースファイルを自動的に検出し、正しいことを行います rsync
-S
を使用すると、スパース ファイルを適切に処理できます フラグ、および scp
スパース ファイルのオプションはありません (すべてのホールに対してゼロをコピーする帯域幅を消費し、結果のコピーは、サイズが元の「見かけの」サイズである非スパース ファイルになります)。しかしもちろん、それらはすべて、特別なフラグがなくても、スパース ファイルが含まれているかどうかに関係なく、tar アーカイブを問題なく処理します。
補足事項
<オール>tar
-S
で作成されたアーカイブを自動的に検出します したがって、指定する必要はありません。pbzip2
で作成されたアーカイブ チャンクに格納されます。これにより、アーカイブは bzip2
の場合よりわずかに大きくなります が使用されますが、bzip2
で作成されたアーカイブとは異なり、抽出をマルチスレッド化できることも意味します . pbzip2
と bzip2
エラーや破損なしに、互いのアーカイブを確実に抽出します。
短い答え: bsdtar
を使用 または GNU tar
(バージョン 1.29 以降) アーカイブを作成するため、および GNU tar
(バージョン 1.26 以降) 別のボックスでそれらを抽出します。
長い答え: これが機能するには、いくつかの要件があります。
まず、Linux は少なくともカーネル 3.1 である必要があり (Ubuntu 12.04 以降であれば可能)、SEEK_HOLE
をサポートします。
次に、このシステムコールをサポートできる tar ユーティリティが必要です。 GNU tar
バージョン 1.29 以降 (2016/05/16 にリリース、Ubuntu 18.04 以降はデフォルトで存在するはず)、または bsdtar
以降でサポートされています。 バージョン 3.0.4 以降 (Ubuntu 12.04 以降で利用可能) - sudo apt-get install bsdtar
を使用してインストールします .
bsdtar
の間 (これは libarchive
を使用します )は素晴らしいですが、残念ながら、解凍に関してはあまりスマートではありません-穴に関係なく、少なくとも解凍されたファイルサイズと同じくらいの空き容量がターゲットドライブに必要です。 GNU tar
このようなまばらなアーカイブを効率的に展開し、この状態をチェックしません。
これは Ubuntu 12.10 (Linux カーネル 3.5) のログです:
$ dd if=/dev/zero of=1tb seek=1T bs=1 count=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.000143113 s, 7.0 kB/s
$ time bsdtar cvfz sparse.tar.gz 1tb
a 1tb
real 0m0.362s
user 0m0.336s
sys 0m0.020s
# Or, use gnu tar if version is later than 1.29:
$ time tar cSvfz sparse-gnutar.tar.gz 1tb
1tb
real 0m0.005s
user 0m0.006s
sys 0m0.000s
$ ls -l
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov 7 01:43 1tb
-rw-rw-r-- 1 autouser autouser 257 Nov 7 01:43 sparse.tar.gz
-rw-rw-r-- 1 autouser autouser 134 Nov 7 01:43 sparse-gnutar.tar.gz
$
上で言ったように、残念ながら、bsdtar
で untar します。 1TB の空き容量がないと動作しません。ただし、GNU tar
のすべてのバージョン そのような sparse.tar
を untar するのに問題なく動作します :
$ rm 1tb
$ time tar -xvSf sparse.tar.gz
1tb
real 0m0.031s
user 0m0.016s
sys 0m0.016s
$ ls -l
total 8
-rw-rw-r-- 1 autouser autouser 1099511627777 Nov 7 01:43 1tb
-rw-rw-r-- 1 autouser autouser 257 Nov 7 01:43 sparse.tar.gz