1000個の同じ1バイトファイルを999個のハードリンクと1個のファイルに置き換えることで、ext4でどのくらいのスペースを節約できますか?

1000個の同じ1バイトファイルを999個のハードリンクと1個のファイルに置き換えることで、ext4でどのくらいのスペースを節約できますか?

ext4自動的に作成された何千もの必須ファイルを含むフォーマットされたディスクがあります。そのうち数千個は長さが1バイトに過ぎず、一部は長さが2バイトです。 2つの小さなファイルセットのすべてのファイルは同じです。

これらの1バイト長のファイル(1000個など)を見つけて各ファイルを削除し、単一の代表ファイルにハードリンクすると、どのくらいのスペースを節約できますか?

このように:

# ls -l
-rw-r----- 1 john john 1 Feb 25 10:29 a
-rw-r----- 1 john john 1 Feb 25 10:29 b
-rw-r----- 1 john john 1 Feb 25 10:29 c
# du -kcs ?
4   a
4   b
4   c
12  total

統合してみてください:

# rm b c
# ln a b
# ln a c
ll
total 12
-rw-r----- 3 john john 1 Feb 25 10:29 a
-rw-r----- 3 john john 1 Feb 25 10:29 b
-rw-r----- 3 john john 1 Feb 25 10:29 c
# du -kcs ?
4   a
4   total

duリストに載っていなくてもb気にcなります。)

質問:割り当てブロックサイズが4KiBであれば本当に簡単ですか? 1000のファイルシナリオで999 * 4KiBが保存されますか?

または、ext4透明に「尾をマージ」したり、「ディレクトリinode」に小さなファイルを保存したりする機能はありますか(一部のファイルシステムがこれを実行できることを漠然と覚えています)。

(ファイル割り当てブロックが多様である可能性があることを知っており、同様のコマンドで知ることができますtune2fs -l /dev/sda1。)

答え1

リポジトリファイルは、ファイルの内容を格納するために使用されるブロック、ファイルメタデータを格納するために使用される inode、および inode を指すディレクトリエントリ(またはエントリ)の 3 つの部分に分けられます。

複数の別々のファイルを作成する場合、最も一般的な場合は、ファイル数に応じてこの料金を複数回支払います。

インラインデータの使用(ファイルシステムが適切なオプションで作成されている場合)ファイルが十分に小さい場合は、ファイルの内容を格納するために使用されるブロックを保存できますが、ファイルごとに1つのinodeとファイルごとに1つ以上のディレクトリエントリが必要です。

ハードリンクを使用すると、ファイルの内容を保存するために使用されるブロックが保存されます。そしてinode: 1 つの inode、1 つのファイルデータインスタンス (inode のインラインであるか別のもの)、およびリンクと同じくらい多くのディレクトリエントリがあります。

とにかくディレクトリエントリを保存する必要があることを考慮すると、ハードリンクは事実上無料です。他には、より多くの記憶領域が必要です。正確にどれだけ多くは、ファイルシステムの特定の設定によって異なります。

関連情報