Digital-Ocean
journalctl 在 DigitalOcean droplet 上啟動後隨機停止工作
我正在使用我在 DigitalOcean 上使用 Packer 製作的自定義圖像建構伺服器,並且我遇到了一個反復出現的問題,即 journalctl 沒有任何日誌:
# journalctl No journal files were found.
有時我對我建構的圖像有這個問題,有時我沒有。有時,由同一映像建構的一台伺服器可以工作,而另一台則不能。
我還注意到,如果我非常快速地登錄到伺服器,有時 journalctl 最初可以工作,但很快就會中斷(<1 分鐘後)。
如果我重新啟動 journald,那麼從那時起它會正常工作,但我會失去在那之前的所有日誌。
這不是隨機的。“隨機性”基於建構映像和啟動伺服器之間是否經過了 10 分鐘——這就是為什麼有時同一個映像會給出不同結果的原因。
問題是你沒有清除鏡像中的機器id。
如果基礎映像中有一個,DigitalOcean 通過 cloud-init 注入一個首次啟動腳本來生成一個新的機器 ID。這個腳本用來判斷機器 id 是否被烘焙到圖像中的啟發式方法是檢查 mtime on
/etc/machine-id
是否超過 10 分鐘前。
/var/lib/cloud/scripts/per-instance/machine_id.sh
:# record timestamp on machine-id for testing # If /etc/machine_id is over 10m old on first-boot, delete it if [ -f /etc/machine-id ]; then if [ $DIFF -lt 600 ]; then exit 0 fi rm -rf /etc/machine-id fi
systemd 日誌將日誌文件儲存在磁碟上以機器 ID 命名的目錄中,因此更改機器 ID 會使其失去對這些日誌的跟踪。
journalctl
您可以通過告訴從舊目錄載入日誌來查看機器 ID 更改之前的日誌,例如:journalctl -D /var/log/journal/4ff0f6fdda274a6b9d2b9287b8a15c81
此處的修復是清除烘焙圖像中的機器 ID。您可以通過刪除
/var/lib/dbus/machine-id
and來做到這一點/etc/machine-id
,或者您可以使用packer-virt-sysprep中的 machine-id 腳本,這是一個有用的腳本庫,用於將 VM 準備為映像。