Linux檔案刪除,但是df之後磁碟空間沒有釋放

2021-09-05 01:23:24 字數 2147 閱讀 6717

linux 磁碟空間總是報警,查到到大檔案,刪除之後,df看到磁碟空間並沒有釋放。

查詢了下發現系統對rm進行了alias   ,因為linux對刪除操作沒有**站機制,對rm操作進行了自定義,對刪除檔案進行移動到/tmp 目錄裡面。

又對/temp刪除 但是還是沒有發現磁碟衝擊釋放 

執行   lsof | grep deleted發現有大量剛剛刪除檔案的程序存在,kill掉程序(或者重啟程序)   ok

參考資料

運維實戰案例之檔案已刪除但空間不釋放問題解析

1、錯誤現象

運維的監控系統發來通知,報告一台伺服器空間滿了,登陸伺服器檢視,根分割槽確實沒有空間了,如下圖所示:

這裡首先說明一下伺服器的一些刪除策略,由於linux沒有**站功能,我們的線上伺服器所有要刪除的檔案都會首先移動到系統/tmp目錄下,然後定期清除/tmp目錄下的資料。這個策略本身沒有問題,但是通過檢查發現這台伺服器的系統分割槽中並沒有單獨劃分/tmp分割槽,這樣/tmp下的資料其實是占用了根分割槽的空間。既然找到了問題,那麼刪除/tmp目錄下一些大資料即可,執行如下命令,檢查/tmp下最大的三個資料檔案,如下圖所示:

[root@localhost~ ]# du -s /tmp/*|sort -nr|head -3

69206016/tmp/access_log

36/tmp/hsperfdata_root

36/tmp/hsperfdata_mapred

通過命令輸出發現在/tmp目錄下有個66g大小的檔案access_log,這個檔案應該是apache產生的訪問日誌檔案,從日誌大小來看,應該是很久沒有清理apache日誌檔案了,基本判定是這個檔案導致的根空間爆滿,在確認此檔案可以刪除後,執行如下刪除操作:

[root@localhost ~]#  rm  /tmp/access_log

接著檢視系統根分割槽空間是否釋放,如下圖所示:

從輸出可以看到,根分割槽空間仍然沒有釋放,這是怎麼回事?

2、解決思路

一般說來不會出現刪除檔案後空間不釋放的情況,但是也存在例外,比如檔案被程序鎖定,或者有程序一直在向這個檔案寫資料等等,要理解這個問題,就需要知道linux下檔案的儲存機制和儲存結構。

乙個檔案在檔案系統中的存放分為兩個部分:資料部分和指標部分,指標位於檔案系統的meta-data中,資料被刪除後,這個指標就從meta-data中清除了,而資料部分儲存在磁碟中,資料對應的指標從meta-data中清除後,檔案資料部分占用的空間就可以被覆蓋並寫入新的內容,之所以出現刪除access_log檔案後,空間還沒釋放,就是因為httpd程序還在一直向這個檔案寫入內容,導致雖然刪除了access_log檔案,但檔案對應的指標部分由於程序鎖定,並未從meta-data中清除,而由於指標並未被刪除,那麼系統核心就認為檔案並未被刪除,因此通過df命令查詢空間並未釋放也就不足為奇了。

3、問題排查

既然有了解決問題的思路,那麼接下來看看是否有程序一直在向acess.log檔案中寫資料,這裡需要用到linux下的lsof命令,通過這個命令可以獲取乙個已經被刪除但仍然被應用程式占用的檔案列表,命令執行如下圖所示:

從輸出結果可以看到,/tmp/acess.log檔案被程序httpd鎖定,而httpd程序還一直向這個檔案寫入日誌資料,從第七列可知,這個日誌檔案大小僅70g,而系統根分割槽總大小才100g,由此可知,這個檔案就是導致系統根分割槽空間耗盡的罪魁禍首,在最後一列的「deleted」狀態,說明這個日誌檔案已經被刪除,但由於程序還在一直向此檔案寫入資料,空間並未釋放。

4、解決問題

[root@localhost ~]# echo " " >/tmp/acess.log

Linux檔案刪除,但是df之後磁碟空間沒有釋放

注 linux檔案刪除,但是df之後磁碟空間沒有釋放 linux 磁碟空間總是報警,查到到大檔案,刪除之後,df看到磁碟空間並沒有釋放。查詢了下發現系統對rm進行了alias 因為linux對刪除操作沒有 站機制,對rm操作進行了自定義,對刪除檔案進行移動到 tmp 目錄裡面。又對 temp刪除 但...

Linux中能看到檔案,但是無法訪問也刪除不了

遇到乙個有意思的linux檔名的問題,做乙個小筆記。找一台centos 6.5的機器,使用 touch test 建立乙個名稱為 test 的檔案,使用 ls a 檢視這個檔案,發現它的名字顯示為 test 後面的3個空格看不到 使用 rm rf test 發現刪除不掉這個檔案,ls l test ...

MySQL 資料刪除之後表檔案不變

在 mysql 8.0 版本以前,表結構是存在以.frm 為字尾的檔案裡。而 mysql 8.0 版本,則已經允許把錶結構定義放在系統資料表中了。引數innodb file per table 引數設定為 off 表示的是,表的資料放在系統共享表空間,也就是跟資料字典放在一起 引數設定為 on 表示...