Linuxシステムでtar -czv
を使用してバックアップを実行したとき、プロセスが/var/lib/docker/devicemapper/devicemapper/data
で非常に長くスタックしていることに気付きました(すべてのイメージとコンテナーのコピーにかかる時間よりもはるかに長い)が、結果はファイルは大きくなりません。
このファイルサイズをls -lh
でチェックすると、100G
パーティションに20G
サイズが出力されます。これはどのようなファイルで、ここでtar
は何をしていますか?
スパースファイル があるようです。
スパースファイルは、ファイル自体がほとんど空のときにファイルシステムスペースをより効率的に使用しようとするタイプのコンピュータファイルです。これは、より少ないディスクスペースを使用して、ブロックを構成する実際の「空の」スペースではなく、空のブロックを表す簡単な情報(メタデータ)をディスクに書き込むことによって実現されます。ブロックに「実際の」(空でない)データが含まれている場合にのみ、完全なブロックサイズが実際のサイズとしてディスクに書き込まれます。
この答え があります:
/var/lib/docker/devicemapper/devicemapper
ディレクトリには、dockerがマウントする他のすべてのデータを含むスパースループファイルが含まれています。
ファイルはほとんどが空のブロック(すべてゼロ)で構成されており、スパースファイルとして小さなパーティションに収まります。どうやらtar
は単にすべてのゼロを読み取り、それらを処理します。それらは非常によく圧縮されるため、ゼロのストリームが終了したときに結果ファイルが少しだけ大きくなります。
tar
には、スパースファイルを認識させるコマンドラインオプションがあります。記載されています ここ 。
-S
--sparse
あなたの場合、次のことが非常に重要だと思います。
抽出時(…)、そのようなファイルには、穴が見つかった場所に穴が作成されます。 (…)ファイルシステムのバックアップを実行するときは、システムにまばらに保存されている拡張形式のファイルをアーカイブしないように、
--sparse
の使用を検討してください。
--sparse
オプションを使用しなかったと思います。そのため、抽出に関しては、100G
ファイルは非スパースとして作成され、20G
パーティションに収まりません。