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先複制該檔案到其他地方,然後清空掉原來的檔案。