1. 程式人生 > 實用技巧 >Linux磁碟空間怎麼釋放?

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命令查詢空間並未釋放也就不足為奇了。

解決措施有以下幾種

  1. 通過lsof|grep deleted命令獲取到已經被刪除但是仍然被應用程式佔用的檔案列表,然後kill掉還在佔用所刪除檔案的程序。需要注意的是:如果有很多程序都在使用所刪除檔案,那麼採用第1種方式kill程序就有點麻煩了,而且風險也比較大。

    因為kill程序是通過截斷proc檔案系統中的檔案可以強制要求系統回收分配給正在使用的的檔案。必須要確定不會對執行中的程序造成影響時才能使用,應用程式對這種方式支援的並不好,當一個正在使用的檔案被截斷可能會引發不可預知的問題。

  2. 或停掉或重啟使用這個所刪除檔案的應用,讓OS自動回收磁碟空間。

  3. 也可以重啟作業系統,不過這並不是最好的方法

  4. 對待這種程序不停對檔案寫日誌的操作,要釋放檔案佔用的磁碟空間,最好的方法是線上清空這個檔案。通過這種方法,磁碟空間不但可以馬上釋放,也可保障程序繼續向檔案寫入日誌。

線上清空檔案(比如/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頭條!回覆關鍵詞“資料合集”即可免費領取!