谁吃了你的硬盘空间?(2) 获取文件系统与文件信息

/etc目录下有一个fstab文件,记录了磁盘分区的信息,挂载分区(mount)的时候,就需要读取这个文件的信息。另外,同一目录下,还有一个mtab文件,记录了当前已挂载的磁盘分区信息,每当mount、umount的时候,都会更新该文件,而df命令,读取的也正是这个mtab文件。这是Linux的情况,如果是Unix,文件名字可能有所不同,例如:


操作系统 记录所有分区信息的文件 记录已挂载分区信息的文件
Linux /etc/fstab /etc/mtab
Solaris /etc/vfstab /etc/mnttab
HP-UX /etc/fstab /etc/mnttab

为叙述方便,本文都按Linux的标准编写。

/etc/mtab是一个按行表示已挂载分区信息的文件,以制表符或者空格分隔各列。第一列表示文件系统的名字,第二列表示文件系统挂载的目录,第三列表示文件系统的类型,第四列表示文件系统挂载时的参数,从第五列开始,各个操作系统的定义不尽相同,而且df命令无需用到,因此不再列举。

至此,简述一下df命令的工作原理:
1. 按行读取/etc/mtab文件,每行的内容解析成一个mntent结构体,该结构体在Linux中定义如下,df.c会用到前四个成员,但真正有用的是前两个:


2. 调用上一节提到的get_fs_usage接口,分别传进挂载目录和文件系统名字两个参数,获得一个fs_usage结构体,最后按上一节的公式计算磁盘使用情况和空间占用百分比。

OK,df的分析到此为止,但是如何知道磁盘分区中,哪些目录下的文件占用的空间较多呢?这就需要用到网上广为流传的stat结构体及其接口了。简化版的stat结构体如下:


简单地说,要获得该目录的占用空间,就是对目录下的每一个文件使用系统调用lstat,获得其stat结构,然后累加st_size或者st_blksize*st_blocks,这取决于你偏好于哪一种计算方法,如遇到目录则进入递归调用。lstat系统调用的原型如下:


至此,我们已经知道了怎样计算磁盘分区的空间占用情况,并且知道怎样找到每个目录下的文件的总字节数或总占用空间。这样,就可以计算出磁盘上,哪个分区空间最紧张,哪个目录吃掉了最多的空间了。

下一节,将给出全部源代码。

你可能感兴趣的:(linux,unix,Solaris,Access,HP)