公式:那个数是多少?
total int = 每个文件的 (physical_blocks_in_use) * physical_block_size/ls_block_size) 之和。
地点:
-
ls_block_size 是一个任意环境变量(通常为 512 或 1024 字节),可通过
--block-size=<int>ls 上的标志,POSIXLY_CORRECT=1 GNU
环境变量(获取 512 字节单位),或 -k 标志强制
1kB 单位。
-
physical_block_size 是内部块接口的操作系统相关值,它可能连接或不连接到底层硬件。该值通常为 512b 或 1k,但完全取决于操作系统。它可以通过stat 或fstat 上的%B 值显示。 请注意,此值(几乎总是)与现代存储设备上的物理块数无关。
为什么这么混乱?
这个数字与任何物理或有意义的指标完全分离。许多初级程序员没有使用file holes 或hard/sym links 的经验。此外,关于这个特定主题的可用文档几乎不存在。
术语“块大小”的脱节和含糊不清是由于许多不同的度量很容易混淆,以及围绕磁盘访问的相对较深的抽象级别。
冲突信息示例:du(或ls -s)与stat
在项目文件夹中运行 du * 会产生以下结果:(注意:ls -s 返回相同的结果。)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
总计:2+2+1+3+3+5+26+4+2+14 = 62块
然而,当我们运行stat 时,我们会看到一组不同的值。在同一目录中运行 stat 会产生:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
总计: 3+3+1+5+6+10+51+8+3+28 = 118 块
注意:您可以使用命令stat * --printf="%b\t(%B)\t%n: %s bytes\n" > 输出(按顺序)块的数量,(以括号表示)这些块的大小
块、文件名和大小(以字节为单位),如上所示。
有两个重要的要点:
-
stat 报告上面公式中使用的 physical_blocks_in_use 和 physical_block_size。请注意,这些是基于操作系统接口的值。
-
du 提供了普遍接受的物理磁盘利用率的相当准确的估计。
供参考,这里是上面目录的ls -l:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h