web-dev-qa-db-ja.com

巨大なDockerファイルと `tar`の動作

Linuxシステムでtar -czvを使用してバックアップを実行したとき、プロセスが/var/lib/docker/devicemapper/devicemapper/dataで非常に長くスタックしていることに気付きました(すべてのイメージとコンテナーのコピーにかかる時間よりもはるかに長い)が、結果はファイルは大きくなりません。

このファイルサイズをls -lhでチェックすると、100Gパーティションに20Gサイズが出力されます。これはどのようなファイルで、ここでtarは何をしていますか?

3
Milleu

スパースファイル があるようです。

スパースファイルは、ファイル自体がほとんど空のときにファイルシステムスペースをより効率的に使用しようとするタイプのコンピュータファイルです。これは、より少ないディスクスペースを使用して、ブロックを構成する実際の「空の」スペースではなく、空のブロックを表す簡単な情報(メタデータ)をディスクに書き込むことによって実現されます。ブロックに「実際の」(空でない)データが含まれている場合にのみ、完全なブロックサイズが実際のサイズとしてディスクに書き込まれます。

この答え があります:

/var/lib/docker/devicemapper/devicemapperディレクトリには、dockerがマウントする他のすべてのデータを含むスパースループファイルが含まれています。

ファイルはほとんどが空のブロック(すべてゼロ)で構成されており、スパースファイルとして小さなパーティションに収まります。どうやらtarは単にすべてのゼロを読み取り、それらを処理します。それらは非常によく圧縮されるため、ゼロのストリームが終了したときに結果ファイルが少しだけ大きくなります。

tarには、スパースファイルを認識させるコマンドラインオプションがあります。記載されています ここ

-S
--sparse

あなたの場合、次のことが非常に重要だと思います。

抽出時(…)、そのようなファイルには、穴が見つかった場所に穴が作成されます。 (…)ファイルシステムのバックアップを実行するときは、システムにまばらに保存されている拡張形式のファイルをアーカイブしないように、--sparseの使用を検討してください。

--sparseオプションを使用しなかったと思います。そのため、抽出に関しては、100Gファイルは非スパースとして作成され、20Gパーティションに収まりません。

3