1. 程式人生 > >linux下獲取磁碟使用情況的命令 (df du )

linux下獲取磁碟使用情況的命令 (df du )

1、前言

  在嵌入式裝置中,硬碟空間非常有限,在涉及到經常寫日誌的程序時候,需要考慮日誌的大小和刪除,不然很快就硬碟寫滿,導致日誌程式崩潰。為了捕獲硬碟寫滿的異常場景,我們需要在寫日誌過程中判斷硬碟空間的使用情況,根據硬碟的使用情況,就可以判斷是否寫滿了。如果將要寫滿了,就給出警告。這樣就可以避免程式崩潰。首先看一下linux獲取硬碟和目錄大小的命令,最後總結一下statfs結構和函式。

2、df命令

  Linux下可以用df命令獲取硬碟的使用情況,通過man可以獲取df命令的詳細情況。df命令經常用的引數為:

  a:顯示全部的檔案系統和各分割區的磁碟使用情形 
  i:顯示i -nodes的使用量 


  k:大小用k來表示 (預設值) 
  t:顯示某一個檔案系統的所有分割區磁碟使用量 
  x:顯示不是某一個檔案系統的所有分割區磁碟使用量 
  T:顯示每個分割區所屬的檔案系統名稱 
  常用命令:df -hi 

舉例截圖如下所示

3、du命令

  du命令用來查詢檔案或目錄的磁碟使用空間,通過man獲取du命令的詳細介紹。常用的命令引數如下: 
  a:顯示全部目錄和其次目錄下的每個檔案所佔的磁碟空間 
  b:大小用bytes來表示 (預設值為k bytes) 
  c:最後再加上總計 (預設值) 
  s:只顯示各檔案大小的總合 (summarize) 
  x:只計算同屬同一個檔案系統的檔案 


  L:計算所有的檔案大小 
  常用命令:du -ah

舉例操作如下圖所示:

簡單總結一下:df與du的區別,du檢視目錄大小,df檢視磁碟使用情況。

du -sh命令通過將指定檔案系統中所有的目錄、符號連結和檔案使用的塊數累加得到該檔案系統使用的總塊數;
而df命令通過檢視檔案系統磁碟塊分配圖得出總塊數與剩餘塊數。
檔案系統分配其中的一些磁碟塊用來記錄它自身的一些資料,如i節點,磁碟分佈圖,間接塊,超級塊等。這些資料對大多數使用者級的程式來說是不可見的,通常稱為Meta Data。
du命令是使用者級的程式,它不考慮Meta Data,而df命令則檢視檔案系統的磁碟分配圖並考慮Meta Data。

因此正常情況下,df計算的USED空間會比du計算的結果要稍大。

2、異常情況下,df計算的USED空間會比du大很多。

這也是之前碰到的問題,df檢視結果檔案系統100%使用了,而du的結果是還有6GB空閒的,就這麼個問題硬體廠商一個SUPPORT居然不知道怎麼解釋,這也是讓我好奇晚上回來查檢視究竟的原因,結果GOOGLE一下就有了。

原因在於du是以檔名、目錄名為依據計算空間使用的,而df是以硬碟塊使用情況來計算空間使用的。

當一個應用程式正在寫一個大檔案的時候,我們RM或者MV了這個檔案(UNIX是允許這麼幹的,WINDOWS在這一點上傻有傻福),應用程式會佔有控制代碼,並根據控制代碼所指磁碟位置直接寫磁碟,而不會檢查該檔案是否被刪除。

因此就會產生上述的問題。具體到Oracle層面,可能發生這種情況的有:Oracle因為某種原因在生成很大的TRACE檔案,可能導致oracle等目錄滿,如果此時直接RM或MV掉該TRACE檔案會發現空間並不會釋放,進而可能導致Oracle資料庫DOWN機。

解決辦法:使用“> tracefile.trc”命令清空掉該檔案,如果需要保留TRACE檔案便於事後分析問題,可以使用CP先複製該檔案到其他地方,然後清空掉原來的檔案。