ディレクトリのサイズはどのように計算されますか?

ディレクトリのサイズはどのように計算されますか?

これを CentOS 7.3 インスタンスで実行しました。

[user01@ ~]$ rm -rf my-very-own-directory/
[user01@ ~]$ mkdir my-very-own-directory/ 
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 6           Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ mkdir my-very-own-directory/00
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 16          Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ date > my-very-own-directory/date.txt 
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 32          Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ echo "content" > my-very-own-directory/content
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 47          Blocks: 0          IO Block: 4096   directory
  • 初期作成 => サイズ = 6
  • 名前の長さが 2 バイトのエントリを追加する => サイズは 16 (6 + 8 + 2) になります
  • 名前の長さが 4 バイトの別のエントリを追加します => サイズは 32 (16 + 8 + 8) になります
  • 名前の長さが 7 バイトの別のエントリを追加します => サイズは 47 (32 + 8 + 7) になります

2つの質問:

  1. 作成されたディレクトリのサイズは 6 です。なぜでしょうか?
  2. ディレクトリへの新しいエントリは、ファイルでもサブディレクトリでも、すべて「自分のディレクトリ」のサイズに追加されます。問題は、サイズが 8 + (ファイル名 / ディレクトリ名の長さ) だけ増加することです。なぜ 8 なのでしょうか?

答え1

ディレクトリ形式はファイルシステムに完全に依存します。

少なくとも、ディレクトリ エントリにはファイル名と inode 番号が含まれている必要があります。

使用するにはLinuxext4ファイルシステム(および古いバージョン) の例として、元のディレクトリ エントリには、inode 番号 (4 バイト)、ファイル名の長さ (2 バイト)、エントリの合計長 (2 バイト)、およびファイル名自体が含まれていました。(記憶が正しければ、合計長はパディングなどを考慮して明示的に指定されます。)

現在のバージョン ( 以降ext3) では、ツリー型ストレージもサポートされており、多数のファイルを含むディレクトリの検索が高速化されますが、当然ながら、形式はより複雑になります。

ただしext4、 では、ディレクトリのサイズはブロック サイズの倍数としてのみ表示されます。つまり、空のディレクトリにはサイズがあり4096、十分な数のファイルが作成されて新しいデータ ブロックを割り当てる必要があるまでサイズは増加しません。

RHEL 7 はデフォルトのファイル システムとして XFS を使用するため、それが実行されている可能性があります。XFSにはいくつかのディレクトリ形式がある小さなディレクトリに使用される短縮形式は、基本的に、inode 番号 + ファイル名 + ファイル名の長さ + 合計長の同じ最小セットを持ちます。

関連情報