rm rf之後磁碟空間沒有釋放的解決方法

2022-09-26 11:36:26 字數 2033 閱讀 2310

目錄

現在運營的平台採用的是微服務架構,部署的服務較多,開發環境一台伺服器上部署幾十個服務是很正常的,之前用ci構建部署的時候,發現磁碟滿了。我的處理方式是:先刪了/tmp/目錄, 空閒出部分空間,然後檢查下幾個常用的使用者目錄,發現幾個日誌檔案占用了好幾個大g,由於是開發環境,所以就直接刪除, 於是rkboiqtm之後就天真地認為萬事大吉了...

然而過幾天後,又有同事發現該機器磁碟又滿了,驚呼奇怪咋這麼快又滿了。最終發現是上次rm後,占用好幾個大g的日誌檔案被刪除之後,磁碟空間並沒有釋放。linux系統中是通過link的數量來控制檔案刪除的,只有當乙個檔案不存在任何link的時候,這個檔案才會被刪除。一般來說,每個檔案都有2個link計數器:i_count 和 i_nlink,也就是說:linux系統中只有i_nlink及i_count都為0的時候,這個檔案才會真正被刪除。

可以理解為i_count是記憶體引用計數器,i_nlink是磁碟的引用計數器。kboiqt 當乙個檔案被某乙個程序引用時,對應i_count數就會增加;當建立檔案的硬鏈結的時候,對應i_nlink數就會增加。在linux或者unix系統中,通過rm或者檔案管理器刪除檔案,只是將它會從檔案系統的目錄結構上解除鏈結(unlink),實際上就是減少磁碟引用計數i_nlink,但是並不會減少i_count數。如果乙個檔案正在被某個程序呼叫,使用者使用rm命令把檔案"刪除"了,這時候通過ls等檔案管理命令就無法找到這個檔案了,但是並不意味著這個檔案真正的從磁碟上刪除了。因為還有乙個程序在正常的執行,在向檔案中讀取或寫入,也就是說檔案其實並沒有被真正的"刪除",所以磁碟空間也就會一直被占用。當服務程序停止(檔案控制代碼的引用計數會變為0)或者重啟後,占用的儲存空間才被釋放。如果不知道具體程序或檔名的話:lsof | grep deleted,這樣會查詢所有被刪除的但是檔案控制代碼沒有釋放的檔案和相應的程序,然後再kill掉程序或者重啟程序即可。

其實可以簡單用修改檔案內容的方式(例如echo "test">test.log)在不用重啟程序的情況下釋放空間。

對於某個日誌檔案,直接用echo "test" > yyzx_tradingcenterservice.log.2020-06-03.log,然後 df 確認磁碟空間確實已經釋放,分別執行下面的命令:

[dev@tjptdebug-no yyzx_tradingcenterservice_logs]$ du -h yyzx_tradingcenterservice.log.2020-06-03.log

4.0k yyzx_tradingcenterservice.log.2020-06-03.log

[dev@tjptdebug-no yyzx_tradingcenterservice_logs]$ ll -h yyzx_tradingcenterservice.log.2020-06-03.log

-rw-rw-r-- 1 dev dev 7 jul 8 19:49 yyzx_tradingcenterservice.log.2020-06-03.log

ls 的結果是 apparent sizes,我的理解是檔案長度,就類似檔案系統中 file 這個資料結構中的定義檔案長度的這個字段,du 的結果 disk usage,即真正占用儲存空間的大小,且預設度量單位是 block。block 為磁碟儲存的基本的單位,kboiqt方便磁碟定址等,而此處的block可以理解為乙個邏輯單位,且乙個檔案除了包括資料外,還需要儲存描述此檔案的其他資訊,因此包含1個位元組的檔案實際在磁碟中占用的儲存空間不止1個位元組。

du == disk usage (磁碟使用量,占用的磁碟空間)

ls == apparent sizes(檔案長度,file資料結構中定義的檔案長度字段)

乙個檔案占用的磁碟空間和乙個檔案的大小是兩碼事情。占用空間取決於檔案系統的塊(block)的大小,linux一般預設是4k(4096) ,因此,乙個大小為1個位元組的檔案,最小也要占用4k,如果你建立檔案系統的時kboiqt候制定塊大小是16k,那麼即便乙個檔案只有1個位元組,占用空間也是16k。通常情況下,ls 顯示的檔案大小比du顯示的磁碟占用空間小,比如檔案系統的block是4k,乙個13k的檔案占用的空間是 13k/4k = 3.25 個block,乙個block只能被乙個檔案占用,因此實際占用空間就是4個block,就是16k。

linux RM刪除檔案,磁碟空間沒有釋放

今天公司乙個伺服器的磁碟滿了。經過du命令發現是乙個服務的日誌太大了,佔了將近乙個t的空間。然後 果斷用rm把日誌刪了。以為這下磁碟肯定空間足夠了。但是df一看,磁碟使用率仍然很高,沒有多少改觀。經過網上查詢,知道rm只是將檔案鏈結解除,如果此時有程序開啟檔案,系統是不會 檔案。但此時用ls命令卻看...

Linux磁碟空間釋放

在近期的實際工作中,遇到過幾次因為磁碟空間滿而導致服務不可用的情況,所以免不了要對系統進行清理。在最開始的幾次清理過程中,通過刪除一些大日誌檔案可以得到立竿見影的效果,所以就沒怎麼注意 但是在最近一次的清理過程中,發現根目錄的使用率已經到達百分百,但是並沒有在根目錄下發現有什麼大檔案,所以無法僅通過...

檔案刪了磁碟空間沒釋放

問題 某天發現某台機器df h已用磁碟空間為90g,而du sh 顯示所有使用空間加起來才30g,囧。原因 可能某人直接用rm刪除某個正在寫的檔案,導致檔案刪了但磁碟空間沒釋放的問題 解決 1 最簡單重啟系統或者重啟相關服務。2 乾掉程序 usr sbin lsof grep deleted ora...