![ext4 在哪里存储目录大小?](https://linux22.com/image/53116/ext4%20%E5%9C%A8%E5%93%AA%E9%87%8C%E5%AD%98%E5%82%A8%E7%9B%AE%E5%BD%95%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
ext4 在哪里存储目录大小?它们存储在目录 inode 中吗?
例如,当我运行时du -h
,它会立即返回目录的大小,所以我不相信它当时会计算它。
我在 Linux 上使用 ext4。
答案1
使用strace
似乎表明文件大小确实是通过查询目录中的文件来计算的。
例子
假设我在一个目录中填充了 3 个 1MB 的文件。
$ mkdir adir
$ fallocate -l 1M adir/afile1.txt
$ fallocate -l 1M adir/afile2.txt
$ fallocate -l 1M adir/afile3.txt
现在当我们跟踪du -h
命令时:
$ strace -s 2000 -o du.log du -h adir/
3.1M adir/
查看生成的strace
日志文件du.log
:
...
newfstatat(AT_FDCWD, "adir/", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
fcntl(3, F_DUPFD, 3) = 4
fcntl(4, F_GETFD) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
getdents(3, /* 5 entries */, 32768) = 144
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
newfstatat(4, "afile2.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile3.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(4, "afile1.txt", {st_mode=S_IFREG|0644, st_size=1048576, ...}, AT_SYMLINK_NOFOLLOW) = 0
brk(0) = 0x231a000
...
注意到newfstatat
系统调用了吗?这些依次获取每个文件的大小。
其他背景
如果您有兴趣,这里有更多关于这个主题的信息。
- 此行为与 EXT4 无关。这就是文件系统在 Unix 中的工作方式。
该
stat
命令不提供查询文件系统对象(目录或文件)大小以外的任何内容的工具。$ stat adir/ File: ‘adir/’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: fd02h/64770d Inode: 11539929 Links: 2 Access: (0775/drwxrwxr-x) Uid: ( 1000/ saml) Gid: ( 1000/ saml) Context: unconfined_u:object_r:user_home_t:s0 Access: 2014-04-15 22:29:25.289639888 -0400 Modify: 2014-04-15 22:29:44.977638542 -0400 Change: 2014-04-15 22:29:44.977638542 -0400 Birth: -
请注意,它是 4096 字节。这是目录本身的实际大小,而不是它包含的内容。