统计、块和扇区大小 - ext4

Cit*_*ght 4 filesystems stat

在阅读文件如何存储在文件系统中时,我创建了一个大小为 217 字节的测试文件。检查stat这个文件的输出,我看到这个文件占用了8个块。最初我认为,当块大小为 4096 字节且值Blocks:18. 然后我读了thisthisthis,并意识到该Blocks:值是文件占用的512字节空间的数量。由于一个块的最小大小是 4096 字节,即使是 2 字节大小的文件也会占用 8 个块(因为 4096/512 = 8)。

[root@server ~]# stat smallfile.txt
  File: `smallfile.txt'
  Size: 217             Blocks: 8          IO Block: 4096   regular file
Run Code Online (Sandbox Code Playgroud)

我在这里读到:

“每个扇区存储固定数量的用户可访问数据,传统上硬盘驱动器 (HDD) 为 512 字节,CD-ROM 和 DVD-ROM 为 2048 字节。较新的 HDD 使用 4096 字节 (4 KiB) 扇区,这是众所周知的作为高级格式 (AF)。”

我可以访问使用过的扇区大小为 512 字节的 HDD 的所有系统。所以我相信st_blocks(如我给出的第二个和第三个超链接所解释的)与硬盘驱动器的扇区大小相匹配?所以问题是:

  • 将来,如果我要在扇区大小为 4096 字节的 HDD 上拥有相同的 217 字节大小的文件,文件上的stat命令会显示Blocks: 1而不是Blocks: 8(since 4096/4096 = 1) 吗?
  • 或者st_blocks无论扇区大小如何,都将始终使用 512 字节作为单个最小单位?
  • 还是跟 VFS 有关系?

wur*_*tel 7

您明确给出的链接说明:

st_blocks 字段指示分配给文件的块数,以 512 字节为单位。

所以它们总是以 512 字节块为单位,不管使用什么底层设备。该stat命令仅显示stat系统调用返回的内容。512 字节的块是历史性的东西,在 POSIX 中定义。例如比较这些:

$ ls -s smallfile.txt
4 smallfile.txt
$ env POSIXLY_CORRECT=1 ls -s smallfile.txt
8 smallfile.txt
Run Code Online (Sandbox Code Playgroud)

ls默认情况下,GNU以 1kB 的块显示块,但当强制遵守 POSIX 时,它显示 512 字节的块。