找出 Linux 上佔用大量硬碟空間的檔案

程式技術
找出 Linux 上佔用大量硬碟空間的檔案

前幾天我們在 Grafana 上發現某台 VM (Virtual Machine) 的硬碟使用率在短時間內迅速飆高。為了找出原因,我們分別使用 dfdu 指令,成功在 VM 中找到是什麼檔案佔據了大量的硬碟空間。雖然找出原因的過程並不困難,但蠻有趣的,因此寫篇文章記錄一下。

使用 df 指令找出哪個資料夾佔據大量的硬碟空間

df 指令是 Linux 系統中非常實用的工具,全稱為 Disk Free,主要用來顯示檔案系統的磁碟空間使用狀況。它可以告訴你每個掛載硬碟的總容量、已使用空間、可用空間以及使用百分比等資訊。

首先使用 df 指令來找出哪個資料夾佔據了最大的硬碟空間。這裡的 -h 參數為 --human-readable 可以將硬碟容量以 MB 與 GB 等單位來顯示,方便人們閱讀。

df -h

指令顯示結果如下。

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  24G   4.1G  90% /
tmpfs           3.9G  4.0K  3.9G   1% /dev/shm
tmpfs           1.6G  1.5M  1.6G   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
efivarfs        128M   26K  128M   1% /sys/firmware/efi/efivars
tmpfs            10M   16K   10M   1% /ramdisk
/dev/sda16      881M   59M  761M   8% /boot
/dev/sda15      105M  6.1M   99M   6% /boot/efi
tmpfs           794M   12K  794M   1% /run/user/1000

/dev/root 為根目錄,此時我們可以移動到根目錄,使用 du 指令找出哪個檔案佔據了大量的硬碟空間。

使用 du 指令找出哪個檔案佔據大量的硬碟空間

du 指令的全稱是 Disk Usage,是 Linux 系統中用來顯示檔案及目錄所佔用的磁碟空間的強大工具。

du 常用的參數如下:

  • -h--human-readable:以人類可讀的格式 (如 KB、MB、GB) 顯示輸出結果。
  • -s--summarize:只顯示指定目錄的總大小。
  • -a--all:顯示所有檔案和目錄的大小,包括空目錄。
  • -d-max-depth=N:只顯示指定深度內的目錄大小。
  • -x--one-file-system:在跨檔案系統時,不遞回計算子目錄的大小。
# 在根目錄底下使用 du 指令
du -h -d 1

顯示結果 var 資料夾佔據大量的空間。

23G	var

接下來只要重複移動資料夾並使用上方的 df 指令,就能找出是哪個資料夾底下佔用大量的硬碟空間。最後我們發現 /var/log 底下有個檔案超級大,超過 20 GB。

540K	./sysstat
4.0K	./landscape
4.0K	./dist-upgrade
4.0K	./apparmor
17M	    ./journal
4.0K	./private
76K	    ./apt
60K	    ./amazon
4.0K	./unattended-upgrades
4.0K	./chrony
23G	    .

使用 ll -h 指令,就能發現佔用硬碟空間的罪魁禍首了。

-rw-r--r-- 1 root root 23G Dec 17 02:35 charon.log

因為某個程序的設定錯誤,導致短時間內日誌檔案被寫入大量的紀錄。至於是哪裡設定錯誤,本篇文章就不多談了。接下來我們要釋放被佔滿的硬碟空間。

將日誌檔案刪除並釋放硬碟空間

使用 rm 指令將日誌檔案刪除後,再次使用 df 指令查看硬碟空間狀態,會發現硬碟空間仍舊沒有被釋出。

因為使用 rm 指令刪除檔案,實際上只是將這個檔案在檔案系統中標記為刪除,讓系統知道這個檔案不再有效。如果有程序在使用這個檔案,檔案的實際資料並不會立即從硬碟上被擦除

這個時候可以使用 lsof (List Open Files) 指令列出系統中所有被打開的檔案,其中包含那些被標記為刪除的檔案。

lsof | egrep "deleted|COMMAND"

找到哪個程序在使用被刪除的日誌檔並將其重新啟動後,硬碟空間就成功的釋放了。

參考資料

sharkHead
written by
sharkHead

持續努力中的後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言
新增留言
編輯留言