非空目录的大小如何为 0?

非空目录的大小如何为 0?

我有一个包含 18 个文件的目录,但stat其他工具报告其大小为0.这怎么可能?

$ \stat $PWD
  File: `/home/users/gholl/checkouts_local/FCDR_HIRS/FCDR_HIRS/analysis'
  Size: 0               Blocks: 0          IO Block: 524288 directory
Device: 14h/20d Inode: 62487444829821592  Links: 1
Access: (0755/drwxr-xr-x)  Uid: (35063/   gholl)   Gid: (26030/   users)
Access: 2018-04-09 11:38:43.574427000 +0100
Modify: 2018-04-09 11:38:43.574427000 +0100
Change: 2018-04-09 11:38:43.575000000 +0100
~/checkouts_local/FCDR_HIRS/FCDR_HIRS/analysis$ \ls -1 | wc -l
18

$ mount | grep homeusers
172.26.72.131:/homeusers on /home/users type nfs (rw,tcp,hard,intr,timeo=50,addr=172.26.72.131)

该机器是 Red Hat Enterprise Linux Server 6.9 版(圣地亚哥)。根据df -T,文件系统类型是nfs

$ df -hT .
Filesystem    Type    Size  Used Avail Use% Mounted on
172.26.72.131:/homeusers
               nfs    200T  3.5T  197T   2% /home/users

我认为目录的大小与其中的文件数量有关,因为它存储了文件的元数据。那么对于一个非空目录怎么可能为零呢?

注意:我无权访问服务器,也没有超级用户权限,因此我无法调查服务器端发生的情况。

答案1

它取决于 NFS 服务器上的底层文件系统。最终,这归结为 POSIX 语义中有点奇怪且不为人所知的一点,即st_blocks返回的字段stat()不包括分配为的块元数据,仅分配为的块数据

这种区别起源于 UNIX 系统上的标准文件系统使用静态分配的 inode 表,这意味着每个文件系统对象为元数据使用固定数量的空间(因此担心在文件大小中计算该空间是没有意义的,因为它对文件的总空间使用量没有贡献(因为索引节点表是静态分配的,该空间已被保留)在这些文件系统上,目录条目不存储为元数据,而是存储为文件主要部分中定期分配的块文件系统(IOW,目录条目被视为文件内容,而不是元数据),这就是为什么旧 UNIX 系统上的大多数目录大小都是 4kB 的倍数,因为这是大多数 UNIX 文件系统的块大小,这也是为什么stat()和使用它的工具报告文件大小而不考虑元数据。

然而,在许多较新的文件系统上,情况却大不相同。元数据的空间是动态分配的,而不是固定大小条目的静态表,并且目录条目被视为元数据。因此,根据具体的系统和文件系统,目录可能显示为具有零表观大小,或者可能显示零磁盘使用率(如stat或报告du)但表观大小较小,如 报告ls。 BTRFS 是属于第二类的文件系统的一个很好的例子,目录的表观大小是其中有多少条目及其名称长度的函数,而您返回的报告磁盘大小stat()是始终为零。

相关内容