如何连接到使用 systemd 启动的 Linux 容器?

如何连接到使用 systemd 启动的 Linux 容器?

长话短说,我有几个非特权容器在启动时运行,以前我可以从 启动它们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-attachsystemd-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 的后续版本中得到解决,但在此之前的临时解决方案是将lxclxc-templates和分别降级systemd为它们的稳定 Debian 软件包1:3.1.0+really3.0.3-83.0.4-0+deb10u1241-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
  • 降级软件包很糟糕

相关内容