为什么 XFS 文件系统上的 ls -l 输出中的目录大小不同?

为什么 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。

另一件奇怪的事情是ls -s显示这两个目录分配了 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_信息:

 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

大小为 78 字节,因为目录几乎为空。我说的“目录”是指该文件夹的直接后代内容,即,如果你有

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

那么“控制器”只有三个条目(..,Class1 和 Class2。我不知道..是否或如何实际存储)。

即使在磁盘上,目录也会占用一整个块,因此 4K(但请参见下文...)目录逻辑大小仍然是 78 个字节,并且在许多方面它被视为一个文件(XFS 白皮书将其称为目录文件)。如果您在 下立即创建一个新对象controllers,我预计该大小会增加。

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

此外,可以存储非常小的目录内部 inode,从而占用零个实际区块:

非常小的文件

大多数符号链接和目录文件是小文件。XFS 允许这些文件存储在 inode 中以提高性能。XFS 还使用延迟写入来等待收集缓冲区缓存中的整个小文件,然后再写入磁盘……

总结一下,据我所知,你可以

  • 小目录文件存储在 inode 中(“简短目录"),占用零块,以数组形式组织。
  • 合理的目录文件存储在占用一个块的物理文件中(“块目录“)
  • 大型目录文件存储在物理文件中,占用一个块的整数倍,并且采用 B 树结构以提高速度

测试

在我的 Linux 系统上,XFS inode 中目录文件的可用空间似乎约为 156-157 字节。超出时,将使用 4K 块,但释放空间也会释放该块,将信息存储回 inode。

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

相关内容