關(guān)于du與df命令
內(nèi)容
提要
du與df命令都可以用來(lái)顯示文件系統(tǒng)的使用情況,但它們返回的值往往是不匹配的。這里我們談?wù)勥@兩個(gè)命令所返回的值之間的關(guān)系與不同之處。
正文
du和df命令都被用于獲得文件系統(tǒng)大小的信息:df用于報(bào)告文件系統(tǒng)的總塊數(shù)及剩余塊數(shù),du -s /<filesystem>用于報(bào)告文件系統(tǒng)使用的塊數(shù)。但是,我們可以發(fā)現(xiàn)從df命令算出的文件系統(tǒng)使用塊數(shù)的值與通過(guò)du命令得出的值是不一致的。如下例:
# du -s /tmp 返回如下值:
12920 /tmp
而 df /tmp返回如下值:
Filesystem 512-blocks Free %Used Iused %Iused Mounted on
/dev/hd3 57344 42208 26% 391 4% /tmp
從上面的值我們可以算出<total from df> - <Free from df> = <used block count>: 57344 - 42208 = 15136. 而15136大于12920。該值差異的存在是由于du與df命令實(shí)施上的不同: du -s命令通過(guò)將指定文件系統(tǒng)中所有的目錄、符號(hào)鏈接和文件使用的塊數(shù)累加得到該文件系統(tǒng)使用的總塊數(shù);而df命令通過(guò)查看文件系統(tǒng)磁盤塊分配圖得出總塊數(shù)與剩余塊數(shù)。
文件系統(tǒng)分配其中的一些磁盤塊用來(lái)記錄它自身的一些數(shù)據(jù),如i節(jié)點(diǎn),磁盤分布圖,間接塊,超級(jí)塊等。這些數(shù)據(jù)對(duì)大多數(shù)用戶級(jí)的程序來(lái)說(shuō)是不可見(jiàn)的,通常稱為Meta Data。
du命令是用戶級(jí)的程序,它不考慮Meta Data,而df命令則查看文件系統(tǒng)的磁盤分配圖并考慮Meta Data。df命令獲得真正的文件系統(tǒng)數(shù)據(jù),而du命令只查看文件系統(tǒng)的部分情況。例如,一個(gè)frag=4096 并且 nbpi=4096的空的大小為4MB的日志文件系統(tǒng)中Meta Data的分配情況如下:
1 4k block for the LVM
2 4k super blocks
2 4k blocks for disk maps
2 4k blocks for inode maps
2 4k blocks for .indirect
32 4k blocks for inodes
-------------------------
41 4k blocks for meta data on an empty 4MB file system
對(duì)于AIX 4.X版本:
執(zhí)行 du /foo返回的結(jié)果如下:
8 /foo/lost+found
16 /foo
要使du命令輸出的結(jié)果與df命令輸出的結(jié)果匹配,我們必須要加上Meta Data。首先,將41個(gè)4k的塊轉(zhuǎn)換為以512字節(jié)為單位的值:
41 * 8 = 328
328(meta data) + 16(from du) = 344
所以有344個(gè)以512字節(jié)為單位的塊分配給了這個(gè)空的文件系統(tǒng)。
而使用 df /foo命令我們可以得到下面的結(jié)果:
Filesystem 512-blocks Free %Used Iused %Iused Mounted on
/dev/lv01 8192 7848 5% 16 2% /foo
從中我們可以得到該文件系統(tǒng)使用的塊數(shù):8192(total blocks) - 7848(free blocks) = 344。該值與上面得出的值一致。
上面的換算方法對(duì)于空的文件系統(tǒng)很容易實(shí)現(xiàn),但是對(duì)于非空的文件系統(tǒng),由于Meta Data中文件間接塊的大小不定,因此較難實(shí)現(xiàn)。所以我們不需要查看du 與 df返回的值的匹配關(guān)系,而只需要了解du -s命令返回的值反映了分配給文件及目錄的磁盤塊數(shù),而df命令則反映了文件系統(tǒng)的實(shí)際分配情況。df命令反映的實(shí)際情況包含了用戶數(shù)據(jù)(文件及目錄)和Meta Data。
另一個(gè)表現(xiàn)出du與df命令不同之處的例子如下:
如果用戶刪除了一個(gè)正在運(yùn)行的應(yīng)用所打開(kāi)的某個(gè)目錄下的文件,則du命令返回的值顯示出減去了該文件后的目錄的大小。但df命令并不顯示減去該文件后的大小。直到該運(yùn)行的應(yīng)用關(guān)閉了這個(gè)打開(kāi)的文件,df返回的值才顯示出減去了該文件后的文件系統(tǒng)的使用情況。