长话短说,我有几个非特权容器在启动时运行,以前我可以从 启动它们rc.local
。现在不行了,现在用 systemd 单元启动它们。它们可以启动,但我无法lxc-attach -n <container>
控制它们。
长话短说,我运行了一个基本的滚动 Debian 安装(跟踪稳定版,但也可以通过首选项文件从实验版、测试版和不稳定版中提取),使用 lxc 1:4.0.5-2 和 systemd 247.2-5。那是在之后apt-get -y dist-upgrade
。容器是在升级之前创建的(2021 年 1 月 24 日之前),并从 rc.local 启动,一行代码:
su -c "lxc-autostart -a" container-user
经过一番搜索,我发现创建以下单元文件后可以通过 systemd 启动容器:
#
# ~/.config/systemd/user/container.service
#
[Unit]
Description=lxc-autostart containers
DefaultDependencies=no
Wants=network.target lxc.service
[Service]
Type=oneshot
RemainAfterExit=yes
Delegate=yes
ExecStart=lxc-autostart -a
[Install]
WantedBy=default.target
#
# ~/.config/systemd/user/container.timer
#
[Unit]
Description=Timer to run container
[Timer]
OnBootSec=30
[Install]
WantedBy=timers.target
经过简单的设置后systemctl --user enable container.timer
,容器将在启动后 30 秒启动。如果没有计时器,我会看到服务在启动过程中失败。
那时一切都很好,只要我不必附着在容器上。以用户身份登录,运行,lxc-attach -n container
出现如下错误:
lxc-attach: container: conf.c: userns_exec_minimal: 4236 Permission denied - Running parent function failed
在出现这样的故障后,我通常必须使用reset
终端才能再次查看我正在输入的内容。我尝试的另一件事是运行lxc-attach
(systemd-run
这是我最初调试启动容器的方式),如下所示:
systemd-run --user -r -p "Delegate=yes" lxc-attach -n container
这会打印出一条消息说Running as unit: run-<rando chars>.service
但没有终端。
我感觉自己在寻找解决方案,但我错过了一些关键的东西(或两个或三个)。真正令人恼火的是,我无法再自由地在不停止容器的情况下从容器中添加或删除软件包,然后将其su -
添加到chroot
相关容器的根文件系统中apt-get install <package>
。即便如此,这样做似乎也是错误的,因为以这种方式拉入和安装的每个文件的 uid 和 gid 都是错误的,反映了真实的主机系统的 root uid 和 gid。哦,还有,我可以lxc-stop -n <container>
不用systemd-run
。获取 的状态container.service
将显示为active(exited)
停止后的状态。
一些先前存在的容器已经openssh-server
安装(当我能够lxc-attach
自由使用时),这对我来说可以管理这些容器,但是,我一直使用的模板容器(lxc-create -n <new container> -t download -- -d debian -r buster -a amd64
例如)默认情况下没有安装 ssh 服务器。
那么,在完成所有这些之后,我该怎么做才能在启动这些容器后将其附加到容器上?我真的必须停止容器,将其 chroot 到容器中安装软件包,然后找到所有新安装的文件以将它们 chown 到正确的容器 uid 和 gid 吗?
答案1
首先,我错误地声称自己在跟踪 Debian 的稳定分支,但事实证明我实际上是在跟踪测试。我在 irc 上的 #debian-lxc 寻找答案后发现了这一点。那里的一位用户 (Zhenech) 提到他们的非特权容器在稳定版本上运行,就像我一样?!? apt-cache madison lxc lxc-templates systemd
证实了我的错误。追踪到我在 中的首选项文件/etc/apt/preferences.d/
。
我希望这个奇怪的问题能够在 systemd 和/或 lxc 的后续版本中得到解决,但在此之前的临时解决方案是将lxc
、lxc-templates
和分别降级systemd
为它们的稳定 Debian 软件包1:3.1.0+really3.0.3-8
、3.0.4-0+deb10u1
和241-7~deb10u5
。
我还调整了 systemd 单元.service
文件,以便能够正确停止容器:
#
# ~/.config/systemd/user/container.service
#
[Unit]
Description=lxc-autostart containers
DefaultDependencies=no
Wants=network.target lxc.service
[Service]
Type=simple
RemainAfterExit=yes
Delegate=yes
ExecStart=lxc-start -n <container name>
ExecStop=lxc-stop -n <container name>
[Install]
WantedBy=default.target
稍后提醒:
- systemd 247.2-5 默认层次结构=统一
- systemd 241 默认层次结构=混合
- lxc 3.0.3 需要每个接口 +2 个数字 /etc/lxc/lxc-usernet
- 降级软件包很糟糕