当我们使用 ls -l 命令时,会看到如下信息:
[root@model ESSSClient]# ls -l total 36 -rw-r--r-- 1 root root 1670 Jan 11 10:11 CMakeLists.txt drwxr-xr-x 2 root root 46 Jan 11 10:11 config -rw-r--r-- 1 root root 17078 Jan 11 10:11 ESSSCliOper.cpp -rw-r--r-- 1 root root 3708 Jan 11 10:11 ESSSCliOper.h -rw-r--r-- 1 root root 5421 Jan 11 10:11 ESSSCliTest.cpp
很多人对于第一行的 total 36 的数值并不是很在意,但是你是否想过,它究竟是什么意思?
man中说明: total 表示 "所列出内容的磁盘占用空间总和值,单位为kbytes"。这句话是什么意思?
我们知道 ls -l 列出的第5列数值是该文件或目录的大小。这里目录的大小并非目录所包含的文件的总大小,仅仅是目录自身的大小。
如果无法理解这一概念,请思考一下 "linux中一切皆文件" 的含义。
那么,图中的 total 36k 应该等于1670+46+17078+3708+5421 的值。我们计算一下,1670+46+17078+3708+5421 = 27923,单位是bytes,换算成 kbytes 则是 27923/1024 = 27.2685546875。
显然 36 ≠ 27.2685546875。
但为什么total却是所列出内容的磁盘占用空间总和值? 请注意其中的“占用”二字,何为占用?
我们知道文件系统中是有block(块)的概念的,块就像一间间屋子,如果你的文件系统中存的都是一些较大的文件,那么使用较大的block会得到较好的性能,反之亦然。所以,数据在存放过程中占据的block的大小就是 “占用”的空间。
那么27.2685546875k占用多少个block呢?
首先查看系统中block的大小,我们用以下两种方法查看:
[root@model home]# tune2fs -l /dev/sdb5 | grep "Block size" Block size: 4096 [root@model home]# getconf PAGESIZE 4096
可以看出,系统中一个块(block)的大小是4k(4096bytes),并且一个块(block)只可以容纳一个文件。所以,上面每个不足4K的文件(目录不占用块内存)都要占用一个块(block),即2个块(block);另外,ESSSCliOper.cpp文件为 17078bytes/1024 = 16.677734375K,占5个块(block),虽然第5个block中只存了0.677734375K的数据,但是它依然要占用一个block空间;ESSSCliTest.cpp文件 5421bytes/1024 = 5.2939453125 K,占2个块(block)。因此,上面的文件共占用了9个块,即 9*4096 bytes = 36K。.
最后我们还有一个很方便的查看和计算total的办法。就是使用 ls 命令的 -s 选项:
-s 以块大小为单位列出所有文件的大小