df和du顯示的磁盤空間使用狀況不一致的緣由及處理

在Linux下查看磁盤空間使用狀況,最常使用的就是du和df了。然而二者仍是有很大區別的,有時候其輸出結果甚至很是懸殊。linux

Linux命令之cd http://www.linuxidc.com/Linux/2013-05/83948.htmcentos

Linux命令之cat http://www.linuxidc.com/Linux/2013-05/83947.htmspa

Linux命令之alias/unalias http://www.linuxidc.com/Linux/2013-05/83946.htm日誌

Linux命令解析:su root和su -root http://www.linuxidc.com/Linux/2013-04/82564.htmhtm

Linux命令之 交互式輸入read http://www.linuxidc.com/Linux/2013-03/81594.htm進程

1. 如何記憶這兩個命令ip

du-Disk Usageget

df-Disk Freeit

2. df 和du 的工做原理class

2.1 du的工做原理

du命令會對待統計文件逐個調用fstat這個系統調用,獲取文件大小。它的數據是基於文件獲取的,因此有很大的靈活性,不必定非要針對一個分區,能夠跨越多個分區操做。若是針對的目錄中文件不少,du速度就會很慢了。

2.2 df的工做原理

df命令使用的事statfs這個系統調用,直接讀取分區的超級塊信息獲取分區使用狀況。它的數據是基於分區元數據的,因此只能針對整個分區。因爲df直接讀取超級塊,因此運行速度不受文件多少影響。

3 du和df不一致狀況模擬

常見的df和du不一致狀況就是文件刪除的問題。當一個文件被刪除後,在文件系統 目錄中已經不可見了,因此du就不會再統計它了。然而若是此時還有運行的進程持有這個已經被刪除了的文件的句柄,那麼這個文件就不會真正在磁盤中被刪除, 分區超級塊中的信息也就不會更改。這樣df仍舊會統計這個被刪除了的文件。

(1)當前分區sda1的使用狀況

[root@CentOS192 testdu]# df -h /dev/sda1
文件系統      容量  已用  可用 已用%% 掛載點
/dev/sda1              49G  776M  45G  2% /var

(2)新建一個1GB的大文件

[root@centos192 var]# dd if=/dev/zero of=myfile.iso bs=1024k count=1000
記錄了1000+0 的讀入
記錄了1000+0 的寫出
1048576000字節(1.0 GB)已複製,24.0954 秒,43.5 MB/秒

(3)此時的分區sda1使用狀況

df結果:

[root@centos192 var]# df -h /dev/sda1
文件系統<span style="white-space: pre;"> </span> &nbsp; &nbsp; &nbsp;容量 &nbsp;已用 &nbsp;可用 已用%% 掛載點
/dev/sda1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;49G &nbsp;1.8G &nbsp; 44G &nbsp; 4% /var

du結果:

[root@centos192 var]# du -sh /var/
1.6G /var/

此時二者結果基本相同。

(4)模擬一個進程打開這個大文件,而後刪除這個大文件

[root@centos192 var]# tail -f myfile.iso &
[1] 23277
[root@centos192 var]# rm -f myfile.iso

(5)此時,再對比du和df的結果
 
首先確認有進程持有myfile.iso句柄。

[root@centos192 var]# lsof | grep myfile.iso
tail      23955      root    3r      REG                8,1 1048576000      7999 /var/myfile.iso (deleted)

[root@centos192 var]# du -sh /var/
596M /var/
[root@centos192 var]# df -h /dev/sda1
文件系統      容量  已用  可用 已用%% 掛載點
/dev/sda1              49G  1.8G  44G  4% /var

能夠看出,df結果沒有變化,而du則再也不統計被刪除了的文件myfile.iso。

(6)中止模擬進程,再對比du和df結果

首先確認沒有進程持有myfile.iso句柄。

[root@centos192 var]# lsof | grep myfile.iso
[root@centos192 var]#

[root@centos192 var]# du -sh /var/; df -h /dev/sda1
596M /var/
文件系統      容量  已用  可用 已用%% 掛載點
/dev/sda1              49G  776M  45G  2% /var

此時,myfile.iso已經沒有進程佔有它了,也就從磁盤上刪除了,分區的超級塊信息已經更改,df也就顯示正常了。

4 工做中須要注意的地方

(1)當出現du和df差距很大的狀況時,考慮是不是有刪除文件未完成形成的,方法是lsof命令,而後中止相關進程便可。

(2)可使用清空文件的方式來代替刪除文件,方式是:echo > myfile.iso。

(3)對於常常發生刪除問題的日誌文件,以更名、清空、刪除的順序操做。

(4)除了rm外,有些命令會間接的刪除文件,如gzip命令完成後會刪除原來的文件,爲了不刪除問題,壓縮前先確認沒有進程打開該文件。

轉載:http://www.linuxidc.com/Linux/2014-05/101752.htm

相關文章
相關標籤/搜索