设置用户空间 LXC 容器时出现问题

Dan*_*der 7 lxc

几个晚上,我已经尝试使用用户空间容器安装 LXC。由于它将成为一个新服务器,我(还)不太关心分发和发布,所以我尝试将 Debian 7+8 和 Ubuntu 14.04 和 15.04 作为主机,将 Ubuntu 15.04 和 Debian 8 作为来宾。他们都有自己的问题。摘要:

Debian 7.8 : lxc-create: 此命令必须以 root 身份运行(两个来宾)

Debian 8.0:lxc-create:不允许操作(两个来宾)

Ubuntu 14.04 w/ Ubuntu 15.04 来宾:lxc-start:调用 cgmanager_create_sync 失败:请求无效/容器无法启动。

带有 Debian 8 来宾的 Ubuntu 14.04:lxc-create:错误:找不到匹配的图像。

Ubuntu 15.04:lxc-start:调用 cgmanager_move_pid_sync 失败:请求无效/容器无法启动。(两位客人)

我遵循了教程https://help.ubuntu.com/lts/serverguide/lxc.htmlhttps://linuxcontainers.org/lxc/getting-started/,它们看起来并不那么复杂。

我编写了一个脚本来使测试可重现(以 root 身份在新启动的 live cd 上运行)。谁能告诉我它有什么问题?

#!/bin/sh


# need to be run as root

set -x

echo "==== SYSTEM INFO & INSTALL ===="

lsb_release -a

uname -a

apt-get update
apt-get install -y lxc
apt-get clean

lxc-checkconfig
ifconfig
brctl show

adduser testuser

cat /etc/subuid /etc/subgid

cat >/etc/lxc/lxc-usernet <<.e
# USERNAME TYPE BRIDGE COUNT
testuser veth lxcbr0 2
.e

sudo -u testuser -i mkdir -p .config/lxc

sudo -u testuser -i tee .config/lxc/default.conf <<.e
lxc.id_map = u 0 $(grep testuser /etc/subuid | cut -d: -f2) 65536
lxc.id_map = g 0 $(grep testuser /etc/subgid | cut -d: -f2) 65536

lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx
.e
cat /home/testuser/.config/lxc/default.conf

echo "==== TEST UBUNTU VIVID GUEST ===="

sudo -u testuser -i lxc-create -t download -n vivid1 -- -d ubuntu -r utopic -a amd64
#You just created an Ubuntu container (release=trusty, arch=amd64, variant=default)

#sudo -u testuser -i lxc-start -n vivid1 -d
#read press_enter_key_when_quit

if [ $? -eq 0 ]; then
  rm /tmp/log
  sudo -u testuser -i lxc-start -n vivid1 -l debug --logfile /tmp/log
  cat /tmp/log
fi

echo "==== TEST DEBIAN JESSIE GUEST ===="

sudo -u testuser -i lxc-create -t download -n jessie1 -- -d debian -r jessie -a amd64
#You just created an Ubuntu container (release=trusty, arch=amd64, variant=default)

#sudo -u testuser -i lxc-start -n jessie1 -d
#read press_enter_key_when_quit

if [ $? -eq 0 ]; then
  rm /tmp/log
  sudo -u testuser -i lxc-start -n jessie1 -l debug --logfile /tmp/log
  cat /tmp/log
fi

echo "==== END OF SCRIPT ===="
Run Code Online (Sandbox Code Playgroud)

在 pastebin 上,我发布了所有这些机器的控制台输出:

更新

我进一步尝试使用 Ubuntu 15.04 作为主机。我发现错误报告https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1413927有类似但不相同的问题。但是 journalctl 揭示了 cgmanager 的问题:

May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:do_create_main: pid 17417 (uid 1000 gid 1000) may not create under /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/blkio/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/cpu/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/cpuset/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/devices/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/freezer/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/hugetlb/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/memory/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/net_cls/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/perf_event/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager: Invalid path /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
May 20 16:06:10 xubuntu cgmanager[4736]: cgmanager:per_ctrl_move_pid_main: Invalid path /run/cgmanager/fs/none,name=systemd/user.slice/user-999.slice/session-c1.scope/lxc/jessie1
Run Code Online (Sandbox Code Playgroud)

更新 2

我尝试了更多:我在两个虚拟机上安装了 Ubuntu trusty and vivi 并在它们上安装了所有更新。然后我用原来的 lxc 包测试了一次,用 lxc daily ppa 的包测试了一次。结果总是与上面显示的错误相同。

Dan*_*der 7

尤里卡!还没有完成,但我第一次设法启动了一个容器。有几件事出了问题,我发现有很多人有类似的问题。这是一个解决问题的小指南:

分发/存储库

由于最积极的反馈,我决定从 Ubuntu 14.04 解压系统开始。这意味着,原始系统不会超过只有几个 100M,并且不包含很多包。我使用了更新和安全包源以及 lxc 每日 ppa。这是我的 /etc/apt/sources.list:

deb http://de.archive.ubuntu.com/ubuntu trusty main
deb http://de.archive.ubuntu.com/ubuntu trusty-updates main
deb http://security.ubuntu.com/ubuntu trusty-security main

deb http://ppa.launchpad.net/ubuntu-lxc/daily/ubuntu trusty main 
Run Code Online (Sandbox Code Playgroud)

安装

在许多教程、论坛和错误报告中,我找到了必须安装的软件包列表。我还不确定哪些是重要的,但这是我最终安装的列表(从解压的 14.04 系统开始):

apt-get install bridge-utils cgmanager cloud-image-utils debootstrap distro-info \
  distro-info-data euca2ools fuse libaio1 libapparmor1 libcap2 liblxc1 \
  libpam-systemd librados2 libseccomp2 libselinux1 libselinux1 lxc python3-lxc \
  python-distro-info
Run Code Online (Sandbox Code Playgroud)

再说一遍:这个列表可能比必要的要长。这是真正重要的:

  • libpam-systemd:这个库对于正确的 cgroup 权限很重要。我没有看到任何错误消息,但没有它,文件/proc/self/cgroup看起来像8:blkio:/等,而不是8:hugetlb:/user/1000.user/1.session
  • 保险丝:我读到它对 lxcfs 很重要(我会说lxcfs 包不依赖它是一个错误
  • lxc:最重要的包,如果你只使用非特权容器就足够了
  • cgmanager:我还在学习它的功能。顺便说一句:lxc PPA 目前提供 cgmanager-utils(0.27) 和 cgmanager(0.30) 两个包。cgmanager 与 cgmanager-utils (<< 0.30-1) 冲突,这意味着来自同一个 repo 的两个包不兼容(可能是错误)。我选择了 cgmanager。

配置

我尝试了很多来自各地的提示,所以我还不知道什么是重要的。但粗略地说,我只是从问题中运行了脚本。大致是关于这些文件:

  • /etc/subuid
  • /etc/subgid
  • /etc/lxc/lxc-usernet
  • ~/.config/lxc/default.conf

我做的唯一额外的事情如下,因为我在许多线程中找到了这一行:

chmod +x /home/testuser/.local/share
Run Code Online (Sandbox Code Playgroud)

以用户身份登录

现在我仍然不明白但破坏了我所有基于脚本的实验的最重要的事情:不要使用 su 或 sudo 登录!

我证明:

root@1404-lxc-test:~# tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# this is expected. I am root.

root@1404-lxc-test:~# sudo -u testuser -i tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# here I used sudo to switch user

root@1404-lxc-test:~# su - testuser
testuser@1404-lxc-test:~$ tail -1 /proc/self/cgroup
2:blkio:/user/0.user/1.session
# at least here I expected the correct settings

testuser@1404-lxc-test:~$ exit
root@1404-lxc-test:~# exit

$ ssh testuser@1404-lxc-test
testuser@1404-lxc-test's password: 
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-53-generic x86_64)

testuser@1404-lxc-test:~$ tail -1 /proc/self/cgroup
2:blkio:/user/1000.user/2.session
# now it's correct
Run Code Online (Sandbox Code Playgroud)

还是不知道是什么原因,不过肯定和libpam-systemd有关系。显然,无论是susudo旁路PAM

最后,不要忘记在以用户身份登录时使用 lxc-xxx 命令。如果您以 root 身份执行,它们将失败(因为用户空间容器存储在.local/share/lxc/而不是/var/lib/lxc/

故障排除

这些命令对我最有用:

  • journalctl (基于新贵的版本):它揭示了 cgmanager 的问题
  • /proc/self/cgroup
  • lxc-start 使用选项 -l debug --logfile logfilename.txt

让我知道还有什么是重要的。我认为社区需要它。

学分

感谢以下教程:

对于这些错误报告和论坛主题:

免责声明

我在第一次成功测试后写了这篇文字。但是我做了很多事情,其中​​一些步骤可能没有必要。我将很快在新系统上重新检查所有内容。

更新

以上所有内容都是使用 Ubuntu trusty 14.04 LTS 完成的。现在,我只是巧妙地测试了 Ubuntu。到目前为止,我可以说:

  • 您需要在已解压的基础系统上安装所有内容: apt-get install lxc bridge-utils
  • 不需要外部后视镜。使用 Ubuntu 提供的 lxc
  • 在我的新系统上,我只接触了以下文件:/etc/subuid, /etc/subgid, /etc/lxc/lxc-usernet, 另外,我创建了一个用户并填充了它的主页
  • 结论:更容易,更稳定。对我来说,这是第一个真正有效的版本。

(Wily 现在是测试版,将于 2015 年 10 月 22 日发布)