本篇內(nèi)容主要講解“l(fā)inux下du和df的工作原理”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“l(fā)inux下du和df的工作原理”吧!
成都創(chuàng)新互聯(lián)公司于2013年成立,先為三元等服務(wù)建站,三元等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為三元企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
du命令會(huì)對(duì)待統(tǒng)計(jì)文件逐個(gè)調(diào)用fstat這個(gè)系統(tǒng)調(diào)用,獲取文件大小。它的數(shù)據(jù)是基于文件獲取的,所以有很大的靈活性,不一定非要針對(duì)一個(gè)分區(qū),可以跨越多個(gè)分區(qū)操作。如果針對(duì)的目錄中文件很多,du速度就會(huì)很慢了。
df命令使用的事statfs這個(gè)系統(tǒng)調(diào)用,直接讀取分區(qū)的超級(jí)塊信息獲取分區(qū)使用情況。它的數(shù)據(jù)是基于分區(qū)元數(shù)據(jù)的,所以只能針對(duì)整個(gè)分區(qū)。由于df直接讀取超級(jí)塊,所以運(yùn)行速度不受文件多少影響。
常見(jiàn)的df和du不一致情況就是文件被刪除的而進(jìn)程句柄還在導(dǎo)致的問(wèn)題。當(dāng)一個(gè)文件被刪除后,在文件系統(tǒng)目錄中已經(jīng)不可見(jiàn)了,所以du就不會(huì)再統(tǒng)計(jì)它了。然而如果此時(shí)還有運(yùn)行的進(jìn)程持有這個(gè)已經(jīng)被刪除了的文件的句柄,那么這個(gè)文件就不會(huì)真正在磁盤中被刪除,分區(qū)超級(jí)塊中的信息也就不會(huì)更改,這樣df仍舊會(huì)統(tǒng)計(jì)這個(gè)被刪除了的文件。
首先查看磁盤和路徑
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 42G 201G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]#
[root@zhjk115 app]# pwd
/app
用dd命令創(chuàng)建1G大學(xué)的文件
[root@zhjk115 app]# dd if=/dev/zero of=/app/test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.31891 s, 243 MB/s
查看df和du結(jié)果,目前是一致的
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 43G 200G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]# du -sh
43G
模擬進(jìn)程在使用test.iso文件
[root@zhjk115 app]# tail -f test.iso &
[1] 22349
[root@zhjk115 app]# ps -ef |grep tail
root 22349 21633 28 09:56 pts/1 00:00:01 tail -f test.iso
root 22353 21633 0 09:56 pts/1 00:00:00 grep tail
刪除test.iso文件,可以看出df和du的結(jié)果是不一致的
[root@zhjk115 app]# rm -rf test.iso
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 43G 200G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]# du -sh
42G
用lsof查看哪個(gè)進(jìn)程在使用/app/test.iso
[root@zhjk115 app]# lsof |grep test.iso
tail 22349 root 3r REG 253,2 1048576000 12 /app/test.iso
手動(dòng)kill占有test.iso文件的進(jìn)程,此時(shí),du和df的結(jié)果一致
[root@zhjk115 app]# kill -9 22349
[1]+ Killed tail -f test.iso
[root@zhjk115 app]# du -sh
42G
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 42G 201G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
結(jié)論:
本實(shí)驗(yàn)主要是針對(duì)Linux環(huán)境的使用,該問(wèn)題是由于進(jìn)程的文件句柄釋放問(wèn)題導(dǎo)致的,很多情況為清理完日志等文件是du顯示為已釋放空間,但df空間還在使用,此時(shí)可以通過(guò)echo(或者>)代替rm來(lái)避免這種情況,同時(shí)也可以查看是哪個(gè)進(jìn)程在使用,可以根據(jù)情況手動(dòng)清理、重啟應(yīng)用或者等待釋放。
注:當(dāng)oracle主機(jī)某些日志被清理后但df顯示空間沒(méi)有被釋放也是同樣的道理,一般來(lái)說(shuō)等一段時(shí)間即可,否則需要重啟數(shù)據(jù)庫(kù)實(shí)例來(lái)釋放空間。
到此,相信大家對(duì)“l(fā)inux下du和df的工作原理”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!