免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3714 | 回复: 4
打印 上一主题 下一主题

关于linux stat命令和文件系统一个问题,请帮忙解释一下,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-26 20:01 |只看该作者 |倒序浏览
问题是关于linux stat命令和文件系统一些基本概念的。

我的 fs是ext3。
物理磁盘给linux分配的block是512bytes。
我的文件系统定义的块大小是 4096bytes

可以通过dumpe2fs -h /dev/sda3
看到
  1. ...
  2. First block: 0
  3. Block size: 4096
  4. Fragment size: 4096
  5. ...
复制代码



而且通过stat命令也可以看到
  1. kent@KentT60:~/Desktop$ stat Email
  2. File: `Email'
  3. Size: 965 Blocks: 8 IO Block: 4096 regular file
  4. Device: 80ah/2058d Inode: 746095 Links: 1
  5. Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
  6. Access: 2009-08-11 21:36:36.000000000 +0200
  7. Modify: 2009-08-11 21:36:35.000000000 +0200
  8. Change: 2009-08-11 21:36:35.000000000 +0200
复制代码


可问题来了,为什么4096的block,一个965bytes的字节会占8个blocks呢?应该是1才对阿,就是512bytes也应该是2阿。

我又换了个大点的文件
  1. kent@KentT60:~/Desktop$ stat wxPython-demo-2.8.10.1.tar.bz2
  2. File: `wxPython-demo-2.8.10.1.tar.bz2'
  3. Size: 3605257 Blocks: 7056 IO Block: 4096 regular file
  4. Device: 80ah/2058d Inode: 746210 Links: 1
  5. Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
  6. Access: 2009-08-12 21:45:45.000000000 +0200
  7. Modify: 2009-08-12 21:43:46.000000000 +0200
  8. Change: 2009-08-12 21:43:46.000000000 +0200

  9. kent@KentT60:~/Desktop$ bc
  10. 3605257/512
  11. 7041
  12. 3605257/4096
  13. 880
复制代码


没有一个对上7056的阿。

然后我就找到了这篇文章:
http://linux.about.com/library/cmd/blcmdl2_stat.htm

看那段C程序下面第2段:
The value st_blocks gives the size of the file in 512-byte blocks. (This may be smaller than st_size/512 e.g. when the file has holes.) The value st_blksize gives the "preferred" blocksize for efficient file system I/O. (Writing to a file in smaller chunks may cause an inefficient read-modify-rewrite.)

意思就是,这个stat命令的blocks数,不是按file system blocksize来的,而是按磁盘的blocksize(512)来的。即使这样为什么小文件900字节的那个占8个block呢?我猜想了一下,IO读取block应该是按照fs的block来读取,就是说读取4096字节,一次最少8个磁盘的blocks(512) ,所以,即使900字节文件,也读取4096,这个文件也就“占”磁盘block 8个。也就是stat 命令blocks是用文件SIZE除以512,然后再往上补到8的整数倍。900字节就是 900/512=2 ,然后补到8。 这个在上面那个大点的文件上不能100%证实,虽然7056比按我想法算出来的7041+7=7048还大,但至少还是8的倍数。我就糊涂地以为我这个猜想就对了。直到我看到这个例子:

http://www.computerhope.com/unix/stat.htm
看页面最下面的例子:

  1. stat index.htm

  2. Output results similar to the example shown below.

  3. File: `index.htm'
  4. Size: 17137 Blocks: 40 IO Block: 8192 regular file
  5. Device: 8h/8d Inode: 23161443 Links: 1
  6. Access: (0644/-rw-r--r--) Uid: (17433/comphope) Gid: ( 32/ www)
  7. Access: 2007-04-03 09:20:18.000000000 -0600
  8. Modify: 2007-04-01 23:13:05.000000000 -0600
  9. Change: 2007-04-02 16:36:21.000000000 -0600
复制代码



这个FS的BLOCK SIZE=8192,是8K,512的16倍,按说blocksize应该是16的整数倍,可来了个40。我就有糊涂了,看来我前面的想法不对。

或许是这个例子的磁盘block不是512而是1024?

所以想弄明白这个stat 的blocks到底怎么来的,什么具体含义。GOOGLE也没少弄,最后也没有个确切的说法。

谢谢

论坛徽章:
0
2 [报告]
发表于 2009-08-26 20:48 |只看该作者
LZ早点出现你的问题那,我实在是看不下去!

论坛徽章:
0
3 [报告]
发表于 2009-08-26 20:58 |只看该作者
ok, 怪我写多了。
问题是stat 命令里的blocks的数字怎么来的?

论坛徽章:
0
4 [报告]
发表于 2009-08-26 22:58 |只看该作者
man  stat

论坛徽章:
0
5 [报告]
发表于 2009-08-27 00:03 |只看该作者
原帖由 unixlinuxsys 于 2009-8-26 22:58 发表
man  stat


谢谢你帮我出主意。 不过manpage of stat好像没包含我想了解的信息。或者我没找到? 我知道凡是有关问命令的,建议去查看man xxx总是没错的,可我不是问的如何用这个命令。

我想可能你也没看我第一贴吧? 因为在这个疑问上我查了挺多也试了挺多,第一贴我写的是有点多,把我都做了什么测试写上面了,以为会对帮我想办法的人有帮助,结果我罗嗦拉。对不起大家。

这里再问一遍。

请问stat命令输出结果中的blocks的数字是如何得来的? 用个例子来说明一下。谢谢大家的帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP