web-dev-qa-db-ja.com

XFSファイルシステムのls-l出力でディレクトリサイズが異なるのはなぜですか?

理由がわかりませんls -lはブロックサイズよりも小さいフォルダサイズを示します。

例えば:

[user@01 NEW]$ ls -l
total 4
drwxr-xr-x  5 root root   78 Apr 22 00:43 controllers
drwxr-xr-x 14 root root 4096 Apr 22 00:44 schemas
drwxr-xr-x  2 root root   38 Apr 22 00:44 spinner

「controllers」はディレクトリで、ブロックサイズは4096バイトですが、なぜサイズが78バイトなのですか?

[user@01 NEW]$ find controllers/ -type f | wc -l
73

多くのファイルが中にあります。そしてdu -hsは、このフォルダのサイズが840Kであることを示しています。

もう1つの奇妙なことは、ls -sは、この2つのディレクトリに0ブロックが割り当てられていることを示しています。

[user@01 NEW]# ls -ls
total 4
0 drwxr-xr-x  5 root root   78 Apr 22 00:43 controllers
4 drwxr-xr-x 14 root root 4096 Apr 22 00:44 schemas
0 drwxr-xr-x  2 root root   38 Apr 22 00:44 skins

xfs_info:

 xfs_info /
meta-data=/dev/disk/by-uuid/5d87d678-e4cc-445f-b770-4e4c0357faaa isize=256    agcount=4, agsize=393088 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=1572352, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Ext4フォルダーでは、サイズは通常です(つまり、ブロックサイズと同じです)。

1
loadaverage

ディレクトリがほとんど空であるため、サイズは78バイトです。 「ディレクトリ」とは、そのフォルダの直系の子孫コンテンツを意味します。

.../controllers/
                Class1/Whatever
                      /Resources...
                Class2/Whatever
                      /Resources...

その場合、「コントローラー」には3つのエントリしかありません(..、Class1およびClass2。実際に..が保存されているかどうか、またはどのように保存されているかは正確にはわかりません)。

ディスク上でディレクトリが1つのブロック全体を占める場合でも、したがって4K(ただし以下を参照... )、ディレクトリ論理サイズは78バイトのままで、多くの点でファイルとして扱われます( XFSホワイトペーパーディレクトリファイルと呼びます)。 controllersのすぐ下に新しいオブジェクトを作成すると、そのサイズが増加すると思います。

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch07s03s02s02.html

また、非常に小さなディレクトリを iノード内に格納できるため、実際のブロックを占有することはありません。

非常に小さなファイル

ほとんどのシンボリックリンクとディレクトリファイルは小さなファイルです。 XFSでは、パフォーマンスを向上させるために、これらのファイルをiノードに格納にすることができます。 XFSはまた、遅延書き込みを使用して、ディスクに書き込む前に、バッファキャッシュ内の小さなファイル全体を収集するのを待ちます...

要約すると、私が理解している限り、あなたは

テスト

XFS iノード内でディレクトリファイル用に使用できるスペースは、私のLinuxシステムでは約156〜157バイトのようです。超過すると、4Kブロックが使用されますが、スペースを解放するとブロックも解放され、情報がiノードに格納されます。

mkdir temp

drwxr-xr-x   2 root   root               6 2013-04-22 08:59 temp

touch temp/x; ls -la temp

drwxr-xr-x   2 root   root              14 2013-04-22 09:00 temp

mv temp/x temp/{ 100 x's }

drwxr-xr-x   2 root   root             113 2013-04-22 09:01 temp

{ 130 x's }

drwxr-xr-x   2 root   root             143 2013-04-22 09:02 temp

{ 140 x's }    
drwxr-xr-x   2 root   root             153 2013-04-22 09:02 temp

{ 146 x's }
drwxr-xr-x   2 root   root            4096 2013-04-22 09:03 temp

{ 142 x's }
drwxr-xr-x   2 root   root             155 2013-04-22 09:03 temp
2
LSerni