如果我在目录中有以下内容:
empty_dir
: 空目录。empty_file
: 空的文件。one_char
: 由一个字符组成的文件。several_blocks
:由几个块组成的文件(但不是“太大”或“稀疏”)。
然后,ls
将显示以下 †:
$ ls -Gghs
total 152K
8,0K drwxr-xr-x 2 4,0K dec 21 23:34 empty_dir
4,0K -rw-r--r-- 1 0 dec 21 23:21 empty_file
8,0K -rw-r--r-- 1 1 dec 21 23:22 one_char
132K -rw-r--r-- 1 127K dec 22 00:14 several_blocks
其次,stat
显示以下内容:
$ stat empty_dir/
File: empty_dir/
Size: 4096 Blocks: 16 IO Block: 4096 directory
...
$ stat empty_file
File: empty_file
Size: 0 Blocks: 8 IO Block: 4096 regular empty file
...
$ stat one_char
File: one_char
Size: 1 Blocks: 16 IO Block: 4096 regular file
...
$ stat several_blocks
File: several_blocks
Size: 129760 Blocks: 264 IO Block: 4096 regular file
...
第三,du
显示以下内容:
$ du -h empty_dir/
8,0K empty_dir/
$ du -h empty_file
4,0K empty_file
$ du -h one_char
8,0K one_char
$ du -h several_blocks
132K several_blocks
最后:
$ tune2fs /dev/nvme0n1p2 -l
...
Block size: 4096
...
Inode size: 256
...
所报告的块大小stat
为 512 B,这意味着stat
、ls
、 和之间的输出du
是一致的:
empty_dir
:16 * 512 / 1024 = 4096 + 4096 = 8 KiB。empty_file
:8 * 512 / 1024 = 0 + 4096 = 4 KiB。one_char
:16 * 512 / 1024 = 4096 + 4096 = 8 KiB。several_blocks
:264 * 512 / 1024 = 129760 + 5408 = 129760 + 1312 + 4096 = 131072 + 4096 = 32 * 4096 + 4096 = 132 KiB。
问题
- 为什么分配的大小是两个块(大小为 4096 B)而不是一个
empty_dir
?one_char
- 为什么为
empty_file
一个块分配的大小而不是零? - 为什么分配的大小
several_blocks
(以及通常更大的文件)比表观大小((264 * 512)-129760 = 5408 > 4096)大一个以上的块?
我怀疑附加块是包含 的块inode
,就像这个提问者问的那样(但没有得到回答)。同样,这个提问者观察到了双倍大小,但它在问题中的表述不正确,并得到了问题另一部分的答案。然而,这个对另一个问题的回答表明不应该有额外的块(这是我的直觉)。
- 我们的系统是否配置不正确?
- 假设包含 的块
inode
被计数:du
在多个文件上使用时,它是否会补偿inode
多次计数块,是否应该多个inodes
在同一个块中(因为一个块可以包含 16inodes
(4096 / 256 = 16))?
附录
@WumpusQ.Wumbley 推测它可能是扩展属性,事实证明就是这样!
getfattr
返回user.com.dropbox.attributes
。结果测试目录是一个目录深处的子目录,它象征性地链接到我的Dropbox文件夹中。请参阅下面接受的答案。
†这在 GNU/Linux 上使用 GNU Core Utilities 8.30,在 NVME SSD 上的 ext4 上使用内核 4.19.1 (Manjaro)。