LXC 容器将在命令行启动,但不会自动启动,从 cron 的 @reboot 或 /etc/rc.init

LXC 容器将在命令行启动,但不会自动启动,从 cron 的 @reboot 或 /etc/rc.init

我总是可以通过以下方式成功启动我的容器:

fadedbee@host:~$ sudo lxc-start -n mycontainer

它曾经自动启动,直到我将本地 ZFS 上的一些目录绑定到它。

我将以下内容添加到/etc/rc.local:

/bin/date >> /var/log/mycontainer.log
/bin/chmod a+r /var/log/mycontainer.log

/usr/bin/lxc-start -o /var/log/mycontainer.log

-l INFO -n mycontainer > /var/log/mycontainer.stdout 2> /var/log/mycontainer.stderr &

/var/log/mycontainer.log 文件已创建,但仅包含日期,不包含其他内容。

我将以下内容添加到 root 的 crontab 中:

@reboot /usr/bin/lxc-start -o /var/log/mycontainer.log -l INFO -n mycontainer

但这也没有产生任何结果。

我强烈怀疑所有这些事情都是在 ZFS 完成之前发生的。添加sleep 30 ;到 cron 条目没有帮助。

让我困惑的是我根本没有得到日志 stderr、stdout 或日志输出。

如何让我的容器自动启动,或者至少看到日志输出?


更新:

我已经添加:

*/5 * * * * /usr/bin/lxc-start -n mycontainer

到 root 的 cron,但它仍然无法启动。这相同的bash 提示符下的 (sudo'd) 命令有效。 root 的其余 cron 条目按预期工作。

答案1

要在启动时启动 LXC 容器,lxc 系统服务运行 lxc-autostart,如文档所示这里

要配置自动启动,请在容器配置中输入以下两行:

lxc.start.auto = 1
lxc.start.delay = 30

延迟可以设置为任何所需的值(以秒为单位)。

crontab 中不能有任何内容。只需重新启动系统,lxc 服务就会完成这项工作。

您可能想检查 LXC 自动启动是否在启动时运行。要在 systemd 系统上执行此操作,您可以列出 systemd 服务并进行检查,lxc.service如下所示:

systemctl -la | grep 'lxc\.service'

你应该得到这样一行:

lxc.service             loaded    active   exited    LXC Container Initialization and Autoboot Code

如果您没有看到这样的行,请尝试启用该服务:

sudo systemctl enable lxc

答案2

我强烈鼓励使用@rexkogitans 提供的“官方”解决方案。

不是从 cron 启动的程序通常会遇到不同的环境。执行 shellsh和环境变量通常与交互式 shell 不同。如果您有兴趣,请运行 cron 等命令setenv并将其输出定向到文件。

答案3

编辑:我通过将必要的路径数据添加到 crontab -e 解决了这个问题。我添加了以下行:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

在 crontab 注释之后、作业列表之前。

这个问题(和解决方案)可以通过比较命令行的输出来部分验证:

env

和(临时)cron 作业:

* * * * * env > env_dump.txt

就我而言,路径不相同,并且 cron 路径不足以启动 lxc-start。

我有一个类似的问题。在提升su -并发出lxc-start -n test(debian 11)后,我的容器将从命令行正常启动。

我有一个备份脚本,可以停止容器 tar.gz rootfs,然后重新启动它。我通过 cron 从 cron 运行脚本sh /home/dave/backup.sh。它按预期执行所有步骤,但是重启容器失败当它完成时。我找不到有用的错误消息。如果我从 shell 运行这个确切的命令,它就可以正常工作。不知何故,有关 cron 的某些事情导致了问题。这个问题有解决过吗?

相关内容