清理 systemd 的 journal 檔案

使用 systemd 的 Linux 作業系統通常會在目錄 /var/log/journal/ 下存放 systemd-journald 這個服務所蒐集到的系統的 log 檔案,時間久了如果沒清理就可能會佔用一定大小的磁碟空間,對日常使用不會有什麼明顯影響,但是當磁碟空間不夠用、或是想要封裝、轉移系統的時候,清理這個目錄就會很有幫助 (可以少處理一些檔案),當然有這種情況時 /var/log 底下的其他 log 檔案可能也要清理,不過瞥除跑對外服務可能產生的大量 log 外,systemd 的 journal 也許會相對佔用比較多空間,可以考慮優先處理。

對於刪除不認識的檔案難免會擔心是否造成不良的影響,一般來說清除 systemd 的 journal 檔案並不會對系統造成危害,可以放心操作,但要不要清理這種事就見仁見智,保留太久的日誌有時候不見得有什麼價值 (當然還是看主機性質而定),有些人可能永遠用不到這些 log 、有些人可能經常會需要靠 log 來 debug 問題,清理後系統的 log 變少了省下空間,但如果剛好在追問題的話可能就暫時先避免類似的操作,或是清理時還是要保留一些 log 下來,以免相關資訊被清掉了增加追查問題的難度

Systemd-journald 預設使用的空間是磁碟大小的一成空間、上限是 4GB,要了解目前的上限以及使用狀況可以透過 journalctl -u systemd-journald 來得知:

$ sudo journalctl -u systemd-journald | tail -n 5
-- Reboot --
Jan 04 16:48:07 x systemd-journald[489]: Journal started
Jan 04 16:48:07 x systemd-journald[489]: Runtime journal (/run/log/journal/ef635a010d284bc38d762d2b9f0e65ac) is 8.0M, max 158.0M, 150.0M free.
Jan 04 16:48:07 x systemd-journald[489]: Time spent on flushing to /var is 177.349ms for 1008 entries.
Jan 04 16:48:07 x systemd-journald[489]: System journal (/var/log/journal/ef635a010d284bc38d762d2b9f0e65ac) is 4.0G, max 4.0G, 0B free.

也可以透過 dujournal --disk-usage 指令看目前使用的空間,像我這台主機就被佔用了 4GB :

$ du -d 0 -h /var/log/journal/
4.1G	/var/log/journal/

$ sudo journalctl --disk-usage
Archived and active journals take up 4.0G in the file system.

如果這時候找不到 /var/log/journal/ ,那有可能是因為這個目錄曾經被刪除過 (刪除後不一定會自動重建、要看設定)、或是 systemd 的設定是不會把 log 直接保存在磁碟上,這時後 log 可能就只有放在 /run/log/journal/ ,那就不是佔用磁碟空間、而是使用記憶體空間,清理的時機或動機就不太一樣。

最簡單的清理方式就是直接砍檔案,要小心的是除非之後不打算讓 journal 繼續往磁碟上寫,否則別把整個 /var/log/journal/ 資料夾都砍了,砍底下的內容就好

使用 rm 指令清理 /var/log/journal/ 目錄

這邊搭配 -rf 參數

$ sudo rm -rf /var/log/journal/*

砍完之後記得重啟 systemd-journald 服務:

$ sudo systemctl restart systemd-journald.service

上面的方法一次把 /var/log/journal/ 清理乾淨、可以釋出最多的可用空間,相對的如果在清理的前後有遇到一些問題想要翻 log 來看就會比較麻煩,如果有這樣的疑慮就建議考慮接下來使用 journalctl --vacuum 系列指令進行清理的方法

使用 journalctl --vacuum 系列指令進行在清理時還是會保留部份 log 下來供後續使用,不過這樣的方法只會處理已經被封存(archived) 的日誌檔,仍然在使用中(active)的日誌檔案則不會被清除,能清出的空間會比較有限,且在執行時如果遇到日誌損壞的問題可能就沒辦法正常操作,手動刪除日誌檔案則不會受到日誌損壞影響而無法進行。

1. 清除存在超過特定時間的 journal

超過這個時間範圍的 journal 就會被刪掉,支援的單位有秒(s, sec)、分(m, min)、時(h, hour(s))、天(d, day(s))、週(w, week(s))、月(month(s))、年(y, year(s)) 等,例如 30 以天為例:

$ sudo journalctl --vacuum-time=30d
Deleted archived journal /run/log/journal/00e8b7a35d2370b03e81d8735b57803d/system@5260bfce093a4325b3eed82c6871996b-0000000000000001-0005987e29e0f9a6.journal (80.0M).
Vacuuming done, freed 80.0M of archived journals on disk.

2. 清除超過指定數量的 journal 檔案

例如只保留 20 個 journal 檔案,超過的就會被刪掉:

$ sudo journalctl --vacuum-files=20
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-9032@73680238c6994c89a4e3e10c13ea875e-00000000003c4e06-00059aab44cf705b.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-1152@82cfd6df036c4a1da949825c64d69375-00000000003c5612-00059aabb49e8b05.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-9008@713b7f9a6077440780b67f9d0700d6ec-00000000003c486c-00059aaaf3ab4e11.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-9021@22b785b2e08140909849e622bd70f875-00000000003c02c9-00059aa70225c694.journal (8.0M).

.
.
.

Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-1153@94e20746068e43ab9369813de2db08f2-000000000045acd5-00059b328b0929c6.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-1055@5da134aec126461bb7708d983f026cde-000000000045fd4d-00059b371c89d60d.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-9008@713b7f9a6077440780b67f9d0700d6ec-000000000045c201-00059b33bee8d3fb.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-9021@22b785b2e08140909849e622bd70f875-0000000000466434-00059b3cf5af895f.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-6691@a6a0db53a076487084c660f5d90afe2f-0000000000460550-00059b3790666b0f.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/user-1005@6ace35f78df34a16826b19e87fbb083b-0000000000461856-00059b38a52f3aa5.journal (8.0M).
Vacuuming done, freed 848.0M of archived journals from /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510.

3. 清除舊的 journal 檔案直到使用的空間低於指定的大小

使用的單位為 “K”, “M”, “G” 和 “T”,例如指定為 3G (GB) ,journalctl 就會開始清除舊的日誌,直到使用的空間被清理到到小於 3GB 為止,假設原本已經使用了 4GB ,操作後就會清出 1GB 左右的空間

下面執行結果中間類似的訊息因為長度關係就拿掉了用點點點代替,但是可以留意一下最後一行有顯示清出了多少空間的訊息:

$ sudo journalctl --vacuum-size=3G
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/user-1000@f4d75b83b1b64d13893c1c68de2d3307-00000000000f75aa-0005804308d8cba8.journal (120.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@5bb1348481c54fdf863cb0a4b324f7a7-000000000012bc47-0005819f09b893da.journal (40.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/user-1000@f4d75b83b1b64d13893c1c68de2d3307-000000000012bc46-0005819f09b831cb.journal (128.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@5bb1348481c54fdf863cb0a4b324f7a7-0000000000150d17-0005822c637966b2.journal (96.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@00058274068e1ff5-c1297c1460ca3c2c.journal~ (56.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/user-1000@f4d75b83b1b64d13893c1c68de2d3307-0000000000174907-00058267988647c9.journal (120.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@2f46d6ceacd34adbb85f86a0d9c347fa-0000000000000001-00058274068ce84d.journal (96.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@0005837c1a41018b-40e1f506d471dcf0.journal~ (24.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/user-1000@000584b04414221c-d1df82b362aeb4e9.journal~ (72.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@000583df5c9a4e35-016146744911be45.journal~ (48.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@000583fbc5449509-e41e189f99811ce9.journal~ (16.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@000584b043a8d9ce-334dce280baa35f2.journal~ (56.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/system@000586075e8f869b-9f3eaa0718fcf2df.journal~ (80.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/user-1000@000586192bbf4790-0f86bcbeb61651b8.journal~ (56.0M).
Vacuuming done, freed 1008.0M of archived journals from /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac.

以上三個參數也可以同時帶入 journalctl 一次使用,在清出空間後就可以比較有效率的進行系統轉移或是打包了

實際執行時的畫面截圖:

在某一台主機上執行 sudo journalctl --vacuum-size=10M 進行磁碟空間清理的截圖

如果想要更直接的調整使用空間或檔案數量上限,讓 journal 沒有機會長到這麼大 (預設的 4GB 或磁碟大小的 10%) ,固定節省一些磁碟空間,可以在 /etc/systemd/journald.conf 補上對應的 SystemMaxUse=, SystemMaxFiles= 等限制,例如 SystemMaxUse=100M, SystemMaxFiles=20 ,設定完後一樣記得重啟 systemd-journald ,這樣就不用擔心 journal 會佔用太多的空間了,這部份細節可參考 man journald.conf 的說明。

發表迴響