20

Linuxで実際に32MBのデータを保存する1TBのスパースファイルを取得しました。

スパースファイルを格納するパッケージを「効率的に」作成することは可能ですか? パッケージは、別のコンピューターで 1 TB のスパース ファイルに展開する必要があります。理想的には、「パッケージ」は約 32MB にする必要があります。

注: 考えられる解決策は、「tar」を使用することです: https://wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.60tar.27

ただし、1TB のスパース ファイルの場合、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+ cporscpを直接使用するよりも高速にする必要があります。rsync

編集 3

新しいカーネルの SEEK_HOLE 機能を指摘してくれた @mvp に感謝します。(以前は 2.6.32 Linux カーネルで作業していました)。

注: bsdtar バージョン >=3.0.4 が必要です (ここを確認してください: http://ask.fclose.com/4/how-to-効率的にアーカイブ-a-very-large-sparse-file?show=299#c299 )。

新しいカーネルと Fedora リリース (17) では、スパース ファイルを非常に効率的tarに処理します。cp

[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
4

4 に答える 4

29

簡単な回答:bsdtarまたは GNU tar(バージョン 1.29 以降) を使用してアーカイブを作成し、GNU (tarバージョン 1.26 以降) を使用して別のボックスに解凍します。

長い回答: これが機能するには、いくつかの要件があります。

まず、Linux は少なくともカーネル 3.1 である必要があり (Ubuntu 12.04 以降で十分です)、SEEK_HOLE機能をサポートします。

次に、このシステムコールをサポートできる tar ユーティリティが必要です。GNUtarは、バージョン 1.29 (2016/05/16 にリリース、Ubuntu 18.04 以降はデフォルトで存在するはず) 以降、またはbsdtarバージョン 3.0.4 (Ubuntu 12.04 以降で利用可能) 以降をサポートしています - を使用してインストールしsudo apt-get install bsdtarます。

bsdtar(これは を使用します) は素晴らしいですが、残念ながらlibarchive、解凍に関してはあまりスマートではありません。穴に関係なく、少なくとも解凍されたファイル サイズと同じくらいの空き容量がターゲット ドライブに必要です。GNUtarは、このようなまばらなアーカイブを効率的に untar し、この状態をチェックしません。

これは 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
$

上で述べたように、残念ながら、1 TB のbsdtar空き容量がないと、での展開は機能しません。ただし、GNU のどのバージョンでも、そのtarようなものを untar するのに問題なく動作し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
于 2012-11-07T10:01:08.117 に答える
5

この質問は非常に古いものだと思いますが、私と同じようにここにたどり着いた他の人に役立つかもしれない更新があります.

ありがたいことに、mvp の優れた回答は廃止されました。GNU tar リリース ノートによると、 2016-05-16 にリリースされた v. 1.29 で SEEK_HOLE/SEEK_DATA が追加されました。(そして、現在、GNU tar v. 1.30 が Debian 安定版の標準であるため、tar バージョン ≥ 1.29 がほとんどどこでも利用可能であると想定しても安全です。)

したがって、スパース ファイルを処理する方法は、システムにインストールされている tar (GNU または BSD) を使用してそれらをアーカイブすることであり、抽出についても同じです。

さらに、実際にいくつかのデータを含むスパース ファイルの場合、圧縮を使用する価値がある場合 (つまり、データが十分に圧縮可能であり、かなりのディスク スペースを節約でき、ディスク スペースの節約は、圧縮に必要なかなりの時間と CPU リソースに見合うだけの価値があります)。 :

  • tar -cSjf <archive>.tar.bz2 /path/to/sparse/filetar の SEEK_HOLE 機能を利用してスパース ファイルを迅速かつ効率的にアーカイブし、bzip2 を使用して実際のデータを圧縮します。
  • tar --use-compress-program=pbzip2 -cSf <archive>.tar.bz2 /path/to/sparse/file、marcinのコメントで示唆されているように、圧縮タスクに複数のコアを使用しながら同じことを行います。

クアッドコア Atom CPU を搭載した私の小さなホーム サーバーでは、pbzip2vsを使用bzip2すると時間が約 25 ~ 30% 短縮されました。

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

その他の注意事項

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

関連する質問から、おそらくrsyncうまくいくでしょう:

rsync --sparse sparse-1 sparse-1-copy
于 2012-11-07T08:51:54.190 に答える
-3

あなたは間違いなく、、、、、などの圧縮ツールをtar探しlzmabzip2zipますrar。このサイトによると、lzma非常に優れた圧縮率を維持しながら、非常に高速です。

http://blog.terzza.com/linux-compression-comparison-gzip-vs-bzip2-vs-lzma-vs-zip-vs-compress/

圧縮レベルを低い値に設定して、圧縮の速度と品質の比率を調整することもできます。少し実験して、最適なレベルを見つけてください。

http://linux.die.net/man/1/unlzma

于 2012-11-06T14:18:35.623 に答える