Digital-Ocean

journalctl 在 DigitalOcean droplet 上啟動後隨機停止工作

  • March 25, 2021

我正在使用我在 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-idand來做到這一點/etc/machine-id,或者您可以使用packer-virt-sysprep中的 machine-id 腳本,這是一個有用的腳本庫,用於將 VM 準備為映像。

引用自:https://serverfault.com/questions/1058259