【发布时间】:2010-11-23 17:25:24
【问题描述】:
我想知道stat 命令如何计算文件的块数。我读到这个article 说:
值 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
如果这里的“Blocks”的意思是:“多少个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。我想“块”值应该是 16xN,但它是 40。我迷路了......
谁能解释stat如何计算“块”值?
谢谢!
【问题讨论】:
-
stat的输出有点危险:“Blocks”的块大小为 512 字节,而“IO Block”的块大小通常为 4096 字节(对于 ext4)。我试图在this answer 中了解这一点。
标签: linux filesystems