答案1
因此,在经过一番折腾并试图理解 systemd 的内部工作原理后,我阅读了DigitalOcean 的优秀指南,我基本上尝试了与之前建议相反的做法。我没有指示 getty@tty 在 cloud-init 完成之前不要启动,而是要求 cloud-init 在完成之前不要允许 getty@tty 启动(如果这有意义的话)。
具体来说,这意味着我创建了一个名为 cloud-init.service.d 的目录,在其中创建了一个如下所示的 .conf 文件:
[Unit]
[email protected]
这似乎有效,尽管从理论上讲这应该在逻辑上等同于以前的解决方案。无论如何,我希望这能帮助其他遇到同样问题的人。
如有任何进一步的评论或澄清,我们将不胜感激。
答案2
如果你想云初始化奔跑和不是写入控制台,然后您可以更改 SystemdStandardOutput
设置云初始化服务文件。
一种方法是创建一个覆盖文件。此代码段将更改服务的设置cloud-init-local.service
,,,和。cloud-init.service
cloud-config.service
cloud-final.service
for i in init-local init config final ; do
mkdir -p /etc/systemd/system/cloud-${i}.service.d
cat <<EOF > /etc/systemd/system/cloud-${i}.service.d/override.conf
[Service]
StandardOutput=journal
EOF
done
systemctl daemon-reload
这可能会产生负面影响,因为服务文件包含注释
输出需要出现在实例控制台输出中
我不知道为什么输出需求写入控制台,但提交历史说
将 stdout 写入 tty,以便它显示在 GetConsoleOutput 中
GetConsoleOutput
似乎是 Amazon EC2 调用,因此写入控制台可能是云初始化通过云服务器向用户提供信息。
答案3
对于 Ubuntu 20.04 和 22.04,这是可行的。
您需要做的就是创建 2 个文件,将输出写入日志而不是控制台:
文件:
- /etc/systemd/system/cloud-config.service.d/override.conf
- /etc/systemd/system/cloud-final.service.d/override.conf
内容
[Service]
StandardOutput=journal
解释
cloud-init 调用了 2 个服务,用于打印到控制台:
- 云配置
- 云最终
如何:
sudo -i
DIR=/etc/systemd/system
cd $DIR
mkdir cloud-config.service.d cloud-final.service.d
FILE1=$DIR/cloud-config.service.d/override.conf
FILE2=$DIR/cloud-final.service.d/override.conf
cat >$FILE1 <<-EOF
[Service]
StandardOutput=journal
EOF
cat >$FILE2 <<-EOF
[Service]
StandardOutput=journal
EOF
确认有效 重启-->控制台无输出-->登录-->检查journalctl
journalctl -t cloud-init -g "modules:"
journalctl -t cloud-init -o verbose
您应该会在日志中看到之前打印到控制台的行。详细输出将显示 cloud-init 正在调用 cloud-final 和 cloud-config,它们是打印消息的实际服务。