du命令
du的英文原義為“disk usage”,含義為顯示磁盤空間的使用情況,統計目錄(或文件)所占磁盤空間的大小。該命令的功能是逐級進入指定目錄的每一個子目錄並顯示該目錄占用文件系統數據塊(1024字節)的情況。若沒有給出指定目錄,則對當前目錄進行統計。
需要注意的是:
1、du命令的輸出列表是從目錄層級的最底部開始,然后按文件、子目錄、目錄逐級向上
2、du命令默認不會統計隱藏文件,需要使用-a參數支持;du命令不統計Inode引用計數為0的文件
常用參數:
-c:顯示所有已列出文件總的大小。
-s:顯示每個輸出參數的總計
dh命令
df(disk free)命令可以獲取硬盤被占用了多少空間,目前還剩下多少空間等信息,它也可以顯示所有文件系統對Inode節點和磁盤塊的使用情況。
文件句柄
一個文件創建,就新生成了一個inode節點,且inode節點的引用計數為1。當文件被一個進程打開,則在內存中緩沖建立此inode節點緩存,且其引用計數加1。一個文件可以被多次打開,創建多個文件描述符,但對應的inode節點只有一個,對應的磁盤存儲只有一個,只是引用計數每打開一次加1。
當文件被rm,在操作系統內部其實是調用了unlink操作,其目錄項被刪除,如果其對應的inode節點的引用計數為0,則刪除對應的inode節點和清除inode節點位圖中對應的位,其對應磁盤可被再申請;但如果此文件被其他進程打開,則其對應的inode節點的引用計數不為0,則不會刪除對應的inode節點和清除inode節點位圖中對應的位,其對應磁盤不能被再申請,也就是在lsof下可以看到deleted句柄;當前文件被所有使用進程close后,系統刪除對應的inode節點和清除inode節點位圖中對應的位,其對應磁盤可被再申請。
當df命令顯示的結果出現負值時,是因為Linux操作系統提供了保留分區,會給root或指定用戶預留5%或更大的空間,當使用到這塊保留區的空間時,fdisk
命令的計算將會是負數。
導致出現du和df結果不一致的情況
1、正常情況下,df和du輸出結果都會有差距。
- du -sh命令通過將指定文件系統中所有的目錄、符號鏈接和文件使用的塊數累加得到該文件系統使用的總塊數;
- df命令通過查看文件系統磁盤塊分配圖得出總塊數與剩余塊數。
- 文件系統分配其中的一些磁盤塊用來記錄它自身的一些數據,如i節點,磁盤分布圖,間接塊,超級塊等。這些數據對大多數用戶級的程序來說是不可見的,通常稱為Meta Data。
- du命令是用戶級的程序,它不考慮Meta Data,
- df命令則查看文件系統的磁盤分配圖並考慮Meta Data。
- 因此正常情況下,df計算的USED空間會比du計算的結果要稍大。
2、異常情況導致du和df結果差距
- 由於磁盤掛載前該路徑下就存在文件,掛載后用
du
無法查詢到原路徑文件。卸載分區后可以看到原有文件 - 用戶刪除了某些文件后,du命令就不會統計這些文件了,由於有運行的程序仍持有文件,該文件的super-block信息並不會刪除,該文件會被標記為deleted狀態,當 進程重啟 或者 服務器重啟后磁盤自檢 后會自動釋放掉這部分deleted的句柄。lsof |grep deleted
- 如果檢查都沒有問題,可以備份磁盤數據后嘗試將磁盤分區卸載,然后fsck -y partition_name(分區名) 來進行磁盤修復。