找出 Linux 上佔用大量硬碟空間的檔案
前幾天我們在 Grafana 上發現某台 VM (Virtual Machine) 的硬碟使用率在短時間內迅速飆高。為了找出原因,我們分別使用 df
與 du
指令,成功在 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"
找到哪個程序在使用被刪除的日誌檔並將其重新啟動後,硬碟空間就成功的釋放了。