Linuxで実際に32MBのデータを格納する1TBのスパースファイルを取得しました。
スパースファイルを保存するパッケージを「効率的に」作成することは可能ですか?パッケージは、別のコンピューターで1TBのスパースファイルになるように解凍する必要があります。理想的には、「パッケージ」は約32MBである必要があります。
注:考えられる解決策は、「tar」を使用することです: https://wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27
ただし、1 TBのスパースファイルの場合、tarボールは小さい場合がありますが、スパースファイルのアーカイブには時間がかかりすぎます。
編集1
Tarとgzipをテストしたところ、結果は次のようになりました(このスパースファイルには0バイトのデータが含まれていることに注意してください)。
$ du -hs sparse-1
0 sparse-1
$ ls -lha sparse-1
-rw-rw-r-- 1 user1 user1 1.0T 2012-11-03 11:17 sparse-1
$ time tar cSf sparse-1.tar sparse-1
real 96m19.847s
user 22m3.314s
sys 52m32.272s
$ time gzip sparse-1
real 200m18.714s
user 164m33.835s
sys 10m39.971s
$ ls -lha sparse-1*
-rw-rw-r-- 1 user1 user1 1018M 2012-11-03 11:17 sparse-1.gz
-rw-rw-r-- 1 user1 user1 10K 2012-11-06 23:13 sparse-1.tar
0バイトのデータを含む1TBファイルsparse-1は、「tar」で10KBのtarボールにアーカイブするか、gzipで約1GBのファイルに圧縮できます。 gzipは、tarが使用する時間の約2倍の時間がかかります。
比較から、「tar」はgzipよりも優れているようです。
ただし、0バイトのデータを含むスパースファイルには96分が長すぎます。
編集2
rsync
は、tar
よりも長く、gzip
よりも短い時間でファイルのコピーを完了しているようです。
$ time rsync --sparse sparse-1 sparse-1-copy
real 124m46.321s
user 107m15.084s
sys 83m8.323s
$ du -hs sparse-1-copy
4.0K sparse-1-copy
したがって、この非常にスパースなファイルの場合、tar
+ cp
またはscp
は直接rsync
よりも高速である必要があります。
編集3
新しいカーネルのSEEK_HOLE機能を指摘してくれた@mvpに感謝します。 (以前は2.6.32 Linuxカーネルで作業していました)。
注:bsdtarバージョン> = 3.0.4が必要です(ここを確認してください: http://ask.fclose.com/4/how-to-efficiently-archive-a-very-large-sparse-file?show = 299#c299 )。
新しいカーネルとFedoraリリース(17)では、tar
とcp
はスパースファイルveryを効率的に処理します。
[zma@office tmp]$ ls -lh pmem-1
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:14 pmem-1
[zma@office tmp]$ time tar cSf pmem-1.tar pmem-1
real 0m0.003s
user 0m0.003s
sys 0m0.000s
[zma@office tmp]$ time cp pmem-1 pmem-1-copy
real 0m0.020s
user 0m0.000s
sys 0m0.003s
[zma@office tmp]$ ls -lh pmem*
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:14 pmem-1
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:15 pmem-1-copy
-rw-rw-r-- 1 zma zma 10K Nov 7 20:15 pmem-1.tar
[zma@office tmp]$ mkdir t
[zma@office tmp]$ cd t
[zma@office t]$ time tar xSf ../pmem-1.tar
real 0m0.003s
user 0m0.000s
sys 0m0.002s
[zma@office t]$ ls -lha
total 8.0K
drwxrwxr-x 2 zma zma 4.0K Nov 7 20:16 .
drwxrwxrwt. 35 root root 4.0K Nov 7 20:16 ..
-rw-rw-r-- 1 zma zma 1.0T Nov 7 20:14 pmem-1
3.6.5カーネルを使用しています:
[zma@office t]$ uname -a
Linux office.zhiqiangma.com 3.6.5-1.fc17.x86_64 #1 SMP Wed Oct 31 19:37:18 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
短い答え: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
は、そのようなまばらなアーカイブを効率的に解凍し、この状態をチェックしません。
これはUbuntu12.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
でのタール解除は、1TBの空き容量がないと機能しません。ただし、GNU tar
のどのバージョンでも、このようなsparse.tar
を解凍するのに問題なく機能します。
$ 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
関連する質問 から、おそらくrsync
が機能します:
rsync --sparse sparse-1 sparse-1-copy
この質問は非常に古いものだと思いますが、これは私と同じ方法でここにたどり着く他の人に役立つかもしれないアップデートです。
ありがたいことに、mvpの優れた答えは現在廃止されています。 GNU tarリリースノート によると、SEEK_HOLE/SEEK_DATAはv。1.29で追加され、2016年5月16日にリリースされました。(そしてGNU tarv。1.30は現在Debian安定版の標準であるため、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
は、marcinのコメントでほのめかされているように、圧縮タスクに複数のコアを使用している間また同じことを行います。クアッドコアAtom CPUを搭載した私の小さなホームサーバーでは、pbzip2
とbzip2
を使用すると、時間が約25または30%短縮されました。
圧縮の有無にかかわらず、これにより、特別なスパースファイル処理を必要とせず、元のスパースファイルのほぼ「実際の」サイズ(圧縮されている場合はそれ以下)を占めるアーカイブが得られ、心配することなく移動できます。異なるユーティリティのスパースファイル機能間の不整合について。例:cp
はスパースファイルを自動的に検出して正しい処理を行います。-S
フラグを使用すると、rsync
はスパースファイルを適切に処理し、scp
はスパースファイルのオプションはありません(すべてのホールのゼロをコピーする帯域幅を消費し、結果のコピーは、サイズが元の「見かけの」サイズである非スパースファイルになります)。しかし、もちろん、それらはすべて、スパースファイルが含まれているかどうかに関係なく、特別なフラグなしでtarアーカイブを問題なく処理します。
tar
は-S
で作成されたアーカイブを自動的に検出するため、指定する必要はありません。pbzip2
で作成されたアーカイブはチャンクで保存されます。これにより、アーカイブはbzip2
を使用した場合よりもわずかに大きくなりますが、bzip2
で作成されたアーカイブとは異なり、抽出をマルチスレッド化できることも意味します。pbzip2
とbzip2
は、エラーや破損なしに、互いのアーカイブを確実に抽出します。