我想知道 stat
命令如何计算文件的块数。我阅读了这篇文章,其中写到:
st_blocks 的值以 512 字节块为单位给出文件的大小。(例如当文件存在空洞时可能比 st_size/512 更小)。st_blksize 的值是有效文件系统 I/O 操作的“首选”块大小。(以更小的块写入文件可能导致低效的读取-修改-重写操作。)
然而,我无法通过自己的测试进行验证。
我的文件系统是 ext3。
命令 dumpe2fs -h /dev/sda3
显示:
...
First block: 0
Block size: 4096
Fragment size: 4096
...
然后我运行
kent@KentT60:~/Desktop$ stat Email
File: `Email'
Size: 965 Blocks: 8 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746095 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
Access: 2009-08-11 21:36:36.000000000 +0200
Modify: 2009-08-11 21:36:35.000000000 +0200
Change: 2009-08-11 21:36:35.000000000 +0200
如果这里的“块”指的是“多少个512字节的块”,那么数字应该是2,而不是8。我认为文件系统(IO块)的块大小是4k。如果文件系统获取名为
Email
的文件,它将从磁盘中取出至少4k(8 x 512字节块),这意味着965/512 + 6 = 8。我不确定这个猜测是否正确。另一个测试:
kent@KentT60:~/Desktop$ stat wxPython-demo-2.8.10.1.tar.bz2
File: `wxPython-demo-2.8.10.1.tar.bz2'
Size: 3605257 Blocks: 7056 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746210 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
Access: 2009-08-12 21:45:45.000000000 +0200
Modify: 2009-08-12 21:43:46.000000000 +0200
Change: 2009-08-12 21:43:46.000000000 +0200
3605257/512=7041.xx = 7042
根据我的猜测,答案是7042+6=7048。但是stat
的结果显示为7056。
还有一个来自于网站https://www.computerhope.com/unix/stat.htm
的例子。我将这个例子贴在了页面底部:
File: `index.htm'
Size: 17137 Blocks: 40 IO Block: 8192 regular file
Device: 8h/8d Inode: 23161443 Links: 1
Access: (0644/-rw-r--r--) Uid: (17433/comphope) Gid: ( 32/ www)
Access: 2007-04-03 09:20:18.000000000 -0600
Modify: 2007-04-01 23:13:05.000000000 -0600
Change: 2007-04-02 16:36:21.000000000 -0600
在这个示例中,文件系统块大小为8k。我认为“Blocks”值应该是16xN,但它是40。我感到迷惑...有人能解释一下`stat`如何计算“Blocks”值吗?
谢谢!
stat
的输出有点棘手: "Blocks" 的块大小为 512 字节,而 "IO Block" 的块大小通常为 4096 字节(对于 ext4)。我试图在 这个答案 中深入了解这个问题。 - Matthias Braun