无法在 Debian 11 Bullseye 上自动启动非特权 LXC 容器

无法在 Debian 11 Bullseye 上自动启动非特权 LXC 容器

lxc-autostart不会在 Debian 11 Bullseye 中启动非特权容器。

Debian 11 Bullseye 中非特权容器的启动已解决 回答通过使用lxc-unpriv-start代替,lxc-start但在使用时我无法利用这种方法lxc-autostart

答案1

基本解决方案

好的,经过几个不眠之夜,我最终为每个容器提供了一个简单的 systemd 单元文件。一个示例可能如下所示:

[Unit]
Description=Linux container my-container-name
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/lxc-start -n my-container-name
ExecStop=/usr/bin/lxc-stop -n my-container-name
StandardOutput=journal
User=my-lxc-user
Group=my-lxc-user
Delegate=yes

[Install]
WantedBy=multi-user.target

Delegate=yes是对发布的建议的简单跟进这里并且也在回答我已经在上面链接了。

用户徘徊不是必需的(提到的这里)。

该解决方案的一个甜蜜的副作用是关闭(非特权)容器不再延迟主机关闭(如所述这里) 因为使用/usr/bin/lxc-stop -n my-container-name中定义ExecStop而不是发送信号。

调优 - Systemd 模板

谢谢systemd 模板单元文件可以对所有容器使用单个 unif 文件。我的最终模板单元文件如下所示:

[Unit]
Description=Linux container %I
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/lxc-start -n %i
ExecStop=/usr/bin/lxc-stop -n %i
StandardOutput=journal
User=lxc
Group=lxc
Delegate=yes

[Install]
WantedBy=multi-user.target

由于我命名了该文件[email protected]并将其放置到/etc/systemd/system/我可以使用控制我的所有容器systemctl COMMAND [email protected]

(请注意,这lxc.service是原创的,负责lxc-autostart

欢迎对单元文件等进行任何改进! - 因为我不是专家,我基本上使用了官方文档并且这个很好的答案

调优-Systemd 用户服务

另一个进步是使用 Systemd 用户服务,这样在部署新容器时就不需要以 root 身份运行。

单元文件会略有不同:

[Unit]
Description=LXC container %I
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/lxc-start -n %i
ExecStop=/usr/bin/lxc-stop -n %i
StandardOutput=journal
Delegate=yes

[Install]
WantedBy=default.target

既然multi-user.target无法使用对于用户服务,我们必须使用default.target它。

这次必须启用用户延迟,以便服务在启动时启动,而不是在用户登录时启动。可以使用以下命令从 root 帐户启用延迟:loginctl enable-linger <my-lxc-user>

我将服务文件保存到并使用启用它.config/systemd/user/[email protected]systemctl --user enable [email protected]

答案2

lxc我已经让 Debian 11.2 运行(版本 4.0.11-1)的测试包。使用时mprudek 的 systemd 单元( ),无论启用还是不启用延迟会话,我总是会遇到此错误:nano /etc/systemd/system/[email protected]

$ journalctl -f -u lxc@container1
Mär 10 20:32:42 vm-debian systemd[1]: [email protected]: Control process exited, code=exited, status=1/FAILURE
Mär 10 20:32:42 vm-debian lxc-unpriv-start[485]: Can't start an unprivileged container on a pure CGroups v2 host without a systemd user session running.
Mär 10 20:32:42 vm-debian lxc-unpriv-start[485]: If you are trying to get a non-interactive user to have unprivileged containers running, you need to
Mär 10 20:32:42 vm-debian lxc-unpriv-start[485]: enable lingering sessions for that user, via loginctl enable-linger lxcuser as root.
Mär 10 20:32:42 vm-debian systemd[1]: [email protected]: Failed with result 'exit-code'.
Mär 10 20:32:42 vm-debian systemd[1]: Failed to start LXC container container1.

我已经更新了 systemd 单元,如下所示,它的工作方式就像一个魅力。我的非特权 LXC 容器在该lxcuser帐户下运行。

[Unit]
Description=LXC container %I
Requires=systemd-user-sessions.service
After=systemd-user-sessions.service
Wants=systemd-user-sessions.service

[Service]
Type=forking
ExecStart=/usr/bin/lxc-unpriv-start -n %i
ExecStop=/usr/bin/lxc-stop -n %i
StandardOutput=journal
User=lxcuser
Group=lxcuser
Delegate=yes
RemainAfterExit=1
Restart=on-failure
RestartSec=5
SuccessExitStatus=0
RestartForceExitStatus=1

[Install]
WantedBy=multi-user.target
$ loginctl enable-linger lxcuser
$ systemctl disable lxc@container1
$ systemctl stop lxc@container1
$ systemctl daemon-reload
$ systemctl enable lxc@container1
$ systemctl start lxc@container1

相关内容