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認爲文件系統的可用量是不算預留塊的,所以這兩個參數都不計算預留塊。但是總量卻計算了預留塊,這個地方比較容易產生困惑。