轉載:http://blog.linezing.com/?p=2136
在運維Linux服務器時,會碰到需要查看硬盤空間的情況,這時候,通常會使用df -lh命令來檢查每個掛載了文件系統的硬盤的總量和已使用量,或者,可以使用du -sh [directory]命令來統計某個目錄下所有文件的空間占用。
在使用df、du命令時,常常會遇到統計的硬盤使用情況不一致的問題。比如du統計根目錄下文件總共大小為2G,而df判斷掛載在根目錄的硬盤已用空間達到了3G,20G甚至更多。發生這種情況,有以下三種原因:
1.預留空間
為了預防緊急情況,linux ext文件系統會預留部分硬盤空間,具體預留的數值可以通過tune2fs -l [dev_name] | grep “Reserved block count”查看到(dev_name是設備名),這里預留的空間會被df計算到已用空間中,從而導致df和du統計不一致。如果需要調整預留空間大小,我們可以使用tune2fs -m [size] [dev_name]來進行調整。
2.幻影文件(phantom file)
du是統計被文件系統記錄到的每個文件的大小,然后進行累加得到的大小,這是通過文件系統獲取到的。而df主要是從超級塊(superblock)中讀入硬盤使用信息,df獲取到的是磁盤塊被使用的情況。當一個文件被刪除時,如果有別的進程正在使用它(占有句柄), 這個文件將不會被du統計到,但是這個文件被占用的磁盤空間卻依然會被df統計到。這些文件,以及正在使用這些文件的進程可以通過lsof | grep deleted查到。當進程停止或者被kill時,這些空間將被釋放。
3.未統計到的文件
如果上面兩種情況都排除了,但是數據還是不一致,那是怎么回事?這里隱藏着一種情況:當我們將一個目錄掛在到一個新的設備(硬盤)上之前,如果這個目錄里面已經有數據,那么這一部分數據不會被du感知,在文件系統中也看不到這些數據,但是這些數據又是確實占用了磁盤空間,是能夠被df所統計到的。這時候通過du/df統計原設備的空間使用情況,就會發現df統計到的比du要多。遇到這樣的情況時,使用fuser -km [directory]殺死占用該目錄的所有進程(小心操作!),然后使用umount [directory]將該目錄掛載的設備卸載,這時,目錄里面原來已有的數據就會出現,我們將其刪除之后,再重新掛載設備(mount -t [type] [dev] [directory])即可。
