我正在使用我在 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
:systemd 日志将日志文件存储在磁盘上以机器 ID 命名的目录中,因此更改机器 ID 会使其失去对这些日志的跟踪。
journalctl
您可以通过告诉从旧目录加载日志来查看机器 ID 更改之前的日志,例如:此处的修复是清除烘焙图像中的机器 ID。您可以通过删除
/var/lib/dbus/machine-id
and来执行此操作/etc/machine-id
,或者您可以使用packer-virt-sysprep中的 machine-id 脚本,这是一个有用的脚本库,用于将 VM 准备为映像。