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