我有一个包含 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()
是始终为零。