rm -rf之后磁盤空間沒有釋放的解決方法
rm -rf之后就高枕無憂了?
現(xiàn)在運(yùn)營的平臺采用的是微服務(wù)架構(gòu),部署的服務(wù)較多,開發(fā)環(huán)境一臺服務(wù)器上部署幾十個(gè)服務(wù)是很正常的,之前用CI構(gòu)建部署的時(shí)候,發(fā)現(xiàn)磁盤滿了。我的處理方式是:先刪了/tmp/
目錄, 空閑出部分空間,然后檢查下幾個(gè)常用的用戶目錄,發(fā)現(xiàn)幾個(gè)日志文件占用了好幾個(gè)大G,由于是開發(fā)環(huán)境,所以就直接刪除, 于是rm
之后就天真地認(rèn)為萬事大吉了...
然而過幾天后,又有同事發(fā)現(xiàn)該機(jī)器磁盤又滿了,驚呼奇怪咋這么快又滿了。最終發(fā)現(xiàn)是上次rm
后,占用好幾個(gè)大G的日志文件被刪除之后,磁盤空間并沒有釋放。Linux系統(tǒng)中是通過link的數(shù)量來控制文件刪除的,只有當(dāng)一個(gè)文件不存在任何link的時(shí)候,這個(gè)文件才會被刪除。一般來說,每個(gè)文件都有2個(gè)link計(jì)數(shù)器:i_count 和 i_nlink,也就是說:Linux系統(tǒng)中只有i_nlink及i_count都為0的時(shí)候,這個(gè)文件才會真正被刪除。
- i_count表示當(dāng)前文件使用者(或被調(diào)用)的數(shù)量
- i_nlink表示介質(zhì)連接的數(shù)量(硬鏈接的數(shù)量);
可以理解為i_count是內(nèi)存引用計(jì)數(shù)器,i_nlink是磁盤的引用計(jì)數(shù)器。當(dāng)一個(gè)文件被某一個(gè)進(jìn)程引用時(shí),對應(yīng)i_count數(shù)就會增加;當(dāng)創(chuàng)建文件的硬鏈接的時(shí)候,對應(yīng)i_nlink數(shù)就會增加。在Linux或者Unix系統(tǒng)中,通過rm或者文件管理器刪除文件,只是將它會從文件系統(tǒng)的目錄結(jié)構(gòu)上解除鏈接(unlink),實(shí)際上就是減少磁盤引用計(jì)數(shù)i_nlink,但是并不會減少i_count數(shù)。如果一個(gè)文件正在被某個(gè)進(jìn)程調(diào)用,用戶使用rm命令把文件"刪除"了,這時(shí)候通過ls等文件管理命令就無法找到這個(gè)文件了,但是并不意味著這個(gè)文件真正的從磁盤上刪除了。因?yàn)檫€有一個(gè)進(jìn)程在正常的執(zhí)行,在向文件中讀取或?qū)懭耄簿褪钦f文件其實(shí)并沒有被真正的"刪除",所以磁盤空間也就會一直被占用。當(dāng)服務(wù)進(jìn)程停止(文件句柄的引用計(jì)數(shù)會變?yōu)?)或者重啟后,占用的存儲空間才被釋放。如果不知道具體進(jìn)程或文件名的話:lsof | grep deleted
,這樣會查找所有被刪除的但是文件句柄沒有釋放的文件和相應(yīng)的進(jìn)程,然后再kill掉進(jìn)程或者重啟進(jìn)程即可。
其實(shí)可以簡單用修改文件內(nèi)容的方式(例如echo "test">test.log
)在不用重啟進(jìn)程的情況下釋放空間。
du和ls的區(qū)別
對于某個(gè)日志文件,直接用echo "test"> yyzx_tradingcenterservice.log.2020-06-03.log
,然后 df 確認(rèn)磁盤空間確實(shí)已經(jīng)釋放,分別執(zhí)行下面的命令:
[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 的結(jié)果是 apparent sizes,我的理解是文件長度,就類似文件系統(tǒng)中 file 這個(gè)數(shù)據(jù)結(jié)構(gòu)中的定義文件長度的這個(gè)字段,du 的結(jié)果 disk usage,即真正占用存儲空間的大小,且默認(rèn)度量單位是 block。block 為磁盤存儲的基本的單位,方便磁盤尋址等,而此處的block可以理解為一個(gè)邏輯單位,且一個(gè)文件除了包括數(shù)據(jù)外,還需要存儲描述此文件的其他信息,因此包含1個(gè)字節(jié)的文件實(shí)際在磁盤中占用的存儲空間不止1個(gè)字節(jié)。
總結(jié)
du == disk usage (磁盤使用量,占用的磁盤空間)
ls == apparent sizes(文件長度,file數(shù)據(jù)結(jié)構(gòu)中定義的文件長度字段)
一個(gè)文件占用的磁盤空間和一個(gè)文件的大小是兩碼事情。占用空間取決于文件系統(tǒng)的塊(block)的大小,Linux一般默認(rèn)是4k(4096) ,因此,一個(gè)大小為1個(gè)字節(jié)的文件,最小也要占用4k,如果你創(chuàng)建文件系統(tǒng)的時(shí)候制定塊大小是16K,那么即便一個(gè)文件只有1個(gè)字節(jié),占用空間也是16K。通常情況下,ls 顯示的文件大小比du顯示的磁盤占用空間小,比如文件系統(tǒng)的block是4K,一個(gè)13K的文件占用的空間是 13k/4k = 3.25 個(gè)block,一個(gè)block只能被一個(gè)文件占用,因此實(shí)際占用空間就是4個(gè)block,就是16K。
到此這篇關(guān)于rm -rf之后磁盤空間沒有釋放的解決方法的文章就介紹到這了,更多相關(guān)rm -rf磁盤釋放內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。