0712-2888027 189-8648-0214
微信公眾號

孝感風(fēng)信網(wǎng)絡(luò )科技有限公司微信公眾號

當前位置:主頁(yè) > 技術(shù)支持 > Linux > df和du顯示的磁盤(pán)空間使用情況不一致的原因及處理

df和du顯示的磁盤(pán)空間使用情況不一致的原因及處理

時(shí)間:2024-07-18來(lái)源:風(fēng)信官網(wǎng) 點(diǎn)擊: 945次

在Linux下查看磁盤(pán)空間使用情況,最常使用的就是du和df了。然而兩者還是有很大區別的,有時(shí)候其輸出結果甚至非常懸殊。

1. 如何記憶這兩個(gè)命令

du-Disk Usage

df-Disk Free

2. df 和du 的工作原理

2.1 du的工作原理

du命令會(huì )對待統計文件逐個(gè)調用fstat這個(gè)系統調用,獲取文件大小。它的數據是基于文件獲取的,所以有很大的靈活性,不一定非要針對一個(gè)分區,可以跨越多個(gè)分區操作。如果針對的目錄中文件很多,du速度就會(huì )很慢了。

2.2 df的工作原理

df命令使用的事statfs這個(gè)系統調用,直接讀取分區的超級塊信息獲取分區使用情況。它的數據是基于分區元數據的,所以只能針對整個(gè)分區。由于df直接讀取超級塊,所以運行速度不受文件多少影響。

3 du和df不一致情況模擬

常 見(jiàn)的df和du不一致情況就是文件刪除的問(wèn)題。當一個(gè)文件被刪除后,在文件系統目錄中已經(jīng)不可見(jiàn)了,所以du就不會(huì )再統計它了。然而如果此時(shí)還有運行的進(jìn) 程持有這個(gè)已經(jīng)被刪除了的文件的句柄,那么這個(gè)文件就不會(huì )真正在磁盤(pán)中被刪除,分區超級塊中的信息也就不會(huì )更改。這樣df仍舊會(huì )統計這個(gè)被刪除了的文件。

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

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

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

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

(3)此時(shí)的分區sda1使用情況
df結果:

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

du結果:

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

此時(shí)兩者結果基本相同。

(4)模擬一個(gè)進(jìn)程打開(kāi)這個(gè)大文件,然后刪除這個(gè)大文件

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

(5)此時(shí),再對比du和df的結果
首先確認有進(jìn)程持有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
文件系統          容量  已用  可用 已用%% 掛載點(diǎn)
/dev/sda1              49G  1.8G   44G   4% /var

可以看出,df結果沒(méi)有變化,而du則不再統計被刪除了的文件myfile.iso。

(6)停止模擬進(jìn)程,再對比du和df結果
首先確認沒(méi)有進(jìn)程持有myfile.iso句柄。

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

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

此時(shí),myfile.iso已經(jīng)沒(méi)有進(jìn)程占有它了,也就從磁盤(pán)上刪除了,分區的超級塊信息已經(jīng)更改,df也就顯示正常了。

4 工作中需要注意的地方

(1)當出現du和df差距很大的情況時(shí),考慮是否是有刪除文件未完成造成的,方法是lsof命令,然后停止相關(guān)進(jìn)程即可。
(2)可以使用清空文件的方式來(lái)代替刪除文件,方式是:echo > myfile.iso。
(3)對于經(jīng)常發(fā)生刪除問(wèn)題的日志文件,以改名、清空、刪除的順序操作。
(4)除了rm外,有些命令會(huì )間接的刪除文件,如gzip命令完成后會(huì )刪除原來(lái)的文件,為了避免刪除問(wèn)題,壓縮前先確認沒(méi)有進(jìn)程打開(kāi)該文件。

熱門(mén)關(guān)鍵詞: df du 磁盤(pán)空間 使用情況
欄目列表
推薦內容
熱點(diǎn)內容
展開(kāi)