web-dev-qa-db-ja.com

1TBのスパースファイルをコピーする

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)では、tarcpはスパースファイル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
16
ericzma

短い答え: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を使用してインストールします。

bsdtarlibarchiveを使用)は素晴らしいですが、残念ながら、タールを取り除くことに関してはあまり賢くありません-少なくともターゲットドライブにタールを塗らないファイルと同じくらいの空き容量が必要です。サイズ、穴に関係なく。 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
24
mvp

関連する質問 から、おそらくrsyncが機能します:

rsync --sparse sparse-1 sparse-1-copy
1
wallyk

この質問は非常に古いものだと思いますが、これは私と同じ方法でここにたどり着く他の人に役立つかもしれないアップデートです。

ありがたいことに、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を搭載した私の小さなホームサーバーでは、pbzip2bzip2を使用すると、時間が約25または30%短縮されました。

圧縮の有無にかかわらず、これにより、特別なスパースファイル処理を必要とせず、元のスパースファイルのほぼ「実際の」サイズ(圧縮されている場合はそれ以下)を占めるアーカイブが得られ、心配することなく移動できます。異なるユーティリティのスパースファイル機能間の不整合について。例:cpはスパースファイルを自動的に検出して正しい処理を行います。-Sフラグを使用すると、rsyncはスパースファイルを適切に処理し、scpはスパースファイルのオプションはありません(すべてのホールのゼロをコピーする帯域幅を消費し、結果のコピーは、サイズが元の「見かけの」サイズである非スパースファイルになります)。しかし、もちろん、それらはすべて、スパースファイルが含まれているかどうかに関係なく、特別なフラグなしでtarアーカイブを問題なく処理します。

その他の注意事項

  1. 抽出時に、tar-Sで作成されたアーカイブを自動的に検出するため、指定する必要はありません。
  2. pbzip2で作成されたアーカイブはチャンクで保存されます。これにより、アーカイブはbzip2を使用した場合よりもわずかに大きくなりますが、bzip2で作成されたアーカイブとは異なり、抽出をマルチスレッド化できることも意味します。
  3. pbzip2bzip2は、エラーや破損なしに、互いのアーカイブを確実に抽出します。
0
Askeli