「ls -l」はファイルの論理サイズを報告するのに、ディレクトリの物理サイズを報告するのはなぜですか?

「ls -l」はファイルの論理サイズを報告するのに、ディレクトリの物理サイズを報告するのはなぜですか?

ls -lディレクトリの物理サイズを報告しながら、ファイルの論理サイズを報告することに気付きました。たとえば、これは次の出力例ですls -l:

drwxr-xr-x 2 chris chris 36864 2017-04-23 18:14 dir1 
-rw-r--r-- 1 chris chris 6     2017-04-23 18:10 file1.txt

dir1サイズは 36864 バイトで、4096 バイトの倍数です (したがって、おそらく物理サイズです)。

サイズfile1.txtは 6 バイト (論理サイズ) です。

答え1

実際には、lsカーネルが指示したものをそのまま報告します。ファイルがディレクトリであるかどうかによってサイズが異なることはありません。Linux は論理サイズを報告します。ただし、ディレクトリの論理サイズはあまり興味深いプロパティではありません。これはファイルシステムの形式によって異なります。

ほとんどの Linux ディストリビューションのデフォルトのファイルシステム タイプは ext4 であり、おそらくこれが使用されているでしょう。ext4 は、ディレクトリにブロック全体を割り当て、それらのブロック内のスペースを適切に管理します。ディレクトリが縮小してもブロックを解放しません (ディレクトリdir1内のすべてのファイルを削除しても 9 つのブロックが残ります)。ディレクトリであるファイルのサイズを尋ねられた場合、ext4 はディレクトリに割り当てられたサイズを返しますが、これは常にブロックの整数です。

ファイルシステムの種類によって動作が異なります。たとえば、Btrfs の場合、実験的にはディレクトリのサイズは 2 の倍数にすることができます。

答え2

ext2これは//ext3ファイルシステムの機能でext4、ディレクトリのサイズを完全なブロック単位で報告します。XFS で同じことを試すと、より細かい粒度のサイズが表示されます。

実際には、それは問題ではありません。ファイルの場合、「論理」サイズが関係します。アプリケーションは、ファイルのサイズを 1 バイトまで知る必要があるためです。末尾のゴミが関係する場合や、一部のデータ構造がファイルの末尾からの相対位置に配置される場合があります (例: .zip アーカイブ)。

ディレクトリの場合、「論理」サイズは重要ではありません。内部構造はよく知られており、Linux ではユーザー空間プログラムはディレクトリの内容を直接読み取ることさえできないためです。代わりに、読み取りは、その目的のためだけに作成されたシステム コールを経由する必要があります。そして、それらのシステム コールは、ディレクトリの内部構造を処理します。

関連情報