GNU/Linux >> Linux の 問題 >  >> Linux

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

この質問が非常に古いことは承知していますが、私と同じ方法でここにたどり着いた他の人に役立つかもしれない最新情報です。

ありがたいことに、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 で作成されたアーカイブとは異なり、抽出をマルチスレッド化できることも意味します .
  • pbzip2bzip2 エラーや破損なしに、互いのアーカイブを確実に抽出します。

  • 短い答え: 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
    

    Linux
    1. TarファイルをTgzファイルに変換する方法は?

    2. Linuxで圧縮/解凍する方法

    3. Linuxでtar.xzファイルを抽出または解凍する方法

    1. Linux のスパース ファイルとは

    2. インデックス付きアーカイブ形式?

    3. tar:短い読み取り

    1. 圧縮 tar 内の単一ファイルの更新

    2. ファイルをスパースにする方法は?

    3. filename.tar.gz ファイルを抽出する方法