df的基本打印信息如下:
文件系统 1K-块 已用 可用 已用% 挂载点
udev 10240 0 10240 0% /dev
tmpfs 26371504 323096 26048408 2% /run
/dev/sda1 47929224 6618744 38852728 15% /
tmpfs 65928756 156 65928600 1% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 65928756 0 65928756 0% /sys/fs/cgroup
/dev/sda5 513289816 71536 487121592 1% /home
包括文件系统名字、总量、已用量、可用量、已用百分比和挂载点。通过对于df和sar相关代码的一些分析,大体的计算方法如下:
首先,通过读取“/proc/self/mountinfo”文件或者“/etc/mtab”获取文件系统基本信息,其中df使用的是前者,sar使用的是后者,以前者举例:
43 22 8:5 / /home rw,relatime shared:27 - ext4 /dev/sda5 rw,data=ordered
这是其中的一条信息,其中可以获取磁盘分区/dev/sda5和其挂载点/home,8:5是major:minor,设备的主辅ID号。知道了挂载点后,就可以使用linux系统调用statvfs获取其他信息,其中path就是挂载点,该接口的基本信息:
int statvfs(const char *path, struct statvfs *buf);
struct statvfs {
unsigned long f_bsize; /* filesystem block size */
unsigned long f_frsize; /* fragment size */
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* # free blocks */
fsblkcnt_t f_bavail; /* # free blocks for unprivileged users */
fsfilcnt_t f_files; /* # inodes */
fsfilcnt_t f_ffree; /* # free inodes */
fsfilcnt_t f_favail; /* # free inodes for unprivileged users */
unsigned long f_fsid; /* filesystem ID */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
这里对主要参数做一些说明:
f_bsize、f_frsize:对于绝大多数Linux系统而言,f_bsize和f_frsize的取值是相同的。然而,某些文件系统支持块片段的概念,在无需使用完整数据块的情况下,可在文件尾部分配较小的存储单元,从而避免因分配完整块而导致的空间浪费。在此类文件系统上,f_frsize和f_bsize分别表示块片段和整个块的大小。(在sar和df中,都是使用的f_frsize表示的块大小)
f_bfree、f_bavail:都表示空闲的块,但是有一些区别。许多原生UNIX和Linux文件系统,都支持为超级用户预留一部分文件系统块,如此一来,即便在文件系统空间耗尽的情况下,超级用户仍可以登录系统解决故障。如果文件系统中确有预留块,那么f_bfree和f_bavail字段间的差值则为预留块。也就是说f_bfree是root可以使用的空闲块总量,包含了f_bavail,而f_bavail是非特权用户能够使用的,是f_bfree去掉预留块。
f_files、f_ffree:与inode相关的参数,意思比较简单,就是总的inodes和空闲的inodes,f_favail参数好像不需要,只使用f_ffree就可以
下面解析df的各项打印,打印的单位的KB,说明中单位是字节,注意区别:
文件系统:从“/proc/self/mountinfo”文件或者“/etc/mtab”获取的,在上面的那条信息中就是/dev/sda5
总量(字节):f_blocks * f_frsize
已用(字节):(f_blocks - f_bfree) * f_frsize
可用(字节):f_bavail, df中的可用量不计算预留块
已用(%):(f_blocks - f_bfree) / (f_blocks - f_bfree + f_bavail)* 100,注意该项,分母并不是总量,而是总量去掉了预留块
挂载点:从“/proc/self/mountinfo”文件或者“/etc/mtab”获取的,在上面的例子中就是/home
在上面的各项中,主要注意的是可用和已用的百分比,可以看到,df认为文件系统的可用量是不算预留块的,所以这两个参数都不计算预留块。但是总量却计算了预留块,这个地方比较容易产生困惑。