Linux磁碟空間怎麼釋放?
問題說明
IDC裡的一臺伺服器的/分割槽使用率爆滿了!已達到100%!經檢視發現有個檔案過大(80G),於是在跟有關同事確認後rm -f果斷刪除該檔案。但是發現刪除該檔案後,/分割槽的磁碟空間壓根沒有釋放出來,使用率還是100%!這是為什麼呢?
[root@linux-node1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 58G 7.8G 47G 100% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/vda1 190M 72M 108M 40% /boot
原因分析:
在Linux系統中,通過rm或者檔案管理器刪除檔案,只是將它會從檔案系統的目錄結構上解除連結(unlink),也就是說只是刪除了檔案和系統目錄結構的連結;
如果檔案在刪除時是被開啟的(有一個程序正在使用該檔案,檔案被程序鎖定或者有程序一直在向這個檔案寫資料等)狀態,那麼程序將仍然可以讀取該檔案,也就是說沒有刪除掉檔案在讀取的狀態,所以磁碟空間也就會一直被佔用。
一個檔案在檔案系統中的存放分為兩個部分:資料部分和指標部分,指標位於檔案系統的meta-data中,資料被刪除後,這個指標就從meta-data中清除了,而資料部分儲存在磁碟中,資料對應的指標從meta-data中清除後。
檔案資料部分佔用的空間就可以被覆蓋並寫入新的內容,之所以出現刪除檔案後,空間還沒釋放,就是因為有程序還在一直向這個檔案寫入內容,導致雖然刪除了檔案,但檔案對應的指標部分由於程序鎖定,並未從meta-data中清除,而由於指標並未被刪除,那麼系統核心就認為檔案並未被刪除,因此通過df命令查詢空間並未釋放也就不足為奇了。
解決措施有以下幾種
-
通過lsof|grep deleted命令獲取到已經被刪除但是仍然被應用程式佔用的檔案列表,然後kill掉還在佔用所刪除檔案的程序。需要注意的是:如果有很多程序都在使用所刪除檔案,那麼採用第1種方式kill程序就有點麻煩了,而且風險也比較大。
因為kill程序是通過截斷proc檔案系統中的檔案可以強制要求系統回收分配給正在使用的的檔案。必須要確定不會對執行中的程序造成影響時才能使用,應用程式對這種方式支援的並不好,當一個正在使用的檔案被截斷可能會引發不可預知的問題。
-
或停掉或重啟使用這個所刪除檔案的應用,讓OS自動回收磁碟空間。
-
也可以重啟作業系統,不過這並不是最好的方法
-
對待這種程序不停對檔案寫日誌的操作,要釋放檔案佔用的磁碟空間,最好的方法是線上清空這個檔案。通過這種方法,磁碟空間不但可以馬上釋放,也可保障程序繼續向檔案寫入日誌。
線上清空檔案(比如/home/wangshibo.log)的方式:
a)# echo " " > /home/wangshibo.log
b)# cat /dev/null > /home/wangshibo.log
c)# > /home/wangshibo.log
還有一種磁碟空間使用問題的現象:明明使用df -h命令檢視磁碟空間使用率不算高,還有很多空餘空間,但是建立檔案或寫入資料時一直報錯磁碟寫滿:" no space left on device"!
一般這種問題都是由於分割槽目錄下deleted刪除後的資源空間沒有真正釋放出來導致的, 具體處理流程如下:
- 先df -lh檢視一下磁碟使用狀況, 發現/data分割槽下的Used已用空間很大, 但是實際檢視並沒有佔用那麼大的空間!
- 找到被刪除檔案所在的分割槽, 比如/data分割槽
- 檢視被刪除了的所有檔案:lsof -n /data |grep deleted
- 殺死這些檔案的delete程序, 釋放空間: lsof -n /data |grep deleted|awk '{print $2}'|xargs kill -9
- 接著再執行lsof -n /data |grep delete,應該就沒有結果了。
- 注意: 剛殺死deleted程序時, df -h檢視/data 分割槽, Used已用空間可能時瞬間顯示過大, 但隨著deleted程序殺死, 資源逐漸釋放, /data分割槽下的Used已用空間會逐漸變小, Avail可用空間會逐漸變大)
大多數檔案系統都會保留一部分空間留作緊急情況時用(比如硬碟空間滿了),這樣能保證有些關鍵應用(比如資料庫)在硬碟滿的時候有點餘地,不致於馬上就 crash,給監控系統和管理員一點時間去察覺。不過有時候這部分預留的硬碟空間不用的話有點浪費。
在Linux系統中,ext2、ext3、ext4檔案系統上通常會預設預留5%的磁碟空間,比如磁碟如果是2TB,這就意味著有100GB的空間會被預留下來,這樣的話會不會顯得有點浪費了。可以通過"tune2fs"命令來改變5%的預設設定,比如只預留2%的空間。但是不建議設成0%,現實環境中這樣做不安全。
[root@ss-server ~]# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/vda1 ext4 41151808 4962148 34076228 13% /
devtmpfs devtmpfs 1931468 0 1931468 0% /dev
tmpfs tmpfs 1941204 0 1941204 0% /dev/shm
tmpfs tmpfs 1941204 652 1940552 1% /run
tmpfs tmpfs 1941204 0 1941204 0% /sys/fs/cgroup
tmpfs tmpfs 388244 0 388244 0% /run/user/0
[root@ss-server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.8G 33G 13% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 620K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 380M 0 380M 0% /run/user/0
比如上面"/"分割槽是ext4檔案系統,預設系統預留了5%也就是2G的空間。現在可以通過"tune2fs"命令將系統預留空間改為2%。
[root@ss-server ~]# tune2fs -m 2 /dev/vda1
tune2fs 1.42.9 (28-Dec-2013)
Setting reserved blocks percentage to 2% (209704 blocks)
執行後,發現"/"分割槽騰出了1G的空間,這時系統預留空間也就是2%了。
[root@ss-server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.8G 34G 13% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 620K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 380M 0 380M 0% /run/user/0
注意:Linux下只有ext2、ext3、ext4檔案系統時,系統才會預設預留5%的磁碟空間。如果檔案系統是xfs、tmpfs、devtmpfs、overlay等,則系統預設不會預留磁碟空間。
福利:豆花同學為大家精心整理了一份關於linux和python的學習資料大合集!有需要的小夥伴們,關注豆花個人公眾號:python頭條!回覆關鍵詞“資料合集”即可免費領取!