几个晚上,我已经尝试安装一个与用户空间容器一起工作的 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 和 Ubuntu 15.04 客户机:lxc-start:调用 cgmanager_create_sync 失败:无效请求/容器启动失败。
Ubuntu 14.04 带 Debian 8 客户端:lxc-create:错误:找不到匹配的图像。
Ubuntu 15.04:lxc-start:调用 cgmanager_move_pid_sync 失败:无效请求/容器启动失败。(两位客人)
我按照教程https://help.ubuntu.com/lts/serverguide/lxc.html和https://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 ===="
在 pastebin 上,我发布了所有这些机器的控制台输出:
- 使用 debian-live-7.8.0-amd64-xfce-desktop.iso 进行测试
- 使用 debian-live-8.0.0-amd64-xfce-desktop.iso 进行测试
- 使用 xubuntu-14.04.2-desktop-amd64.iso 进行测试
- 使用 xubuntu-15.04-desktop-amd64.iso 进行测试
更新
我使用 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
更新 2
我尝试了更多:我在两台虚拟机上安装了 Ubuntu trusty 和 vim,并在它们上安装了所有更新。然后我分别用原始 lxc 包和 lxc daily ppa 中的包测试了一次。结果总是出现如上所示的相同错误。
答案1
尤里卡!虽然还没有完成,但我第一次成功启动了一个容器。有几个地方出了问题,我发现有很多人遇到了类似的问题。以下是一些故障排除指南:
分发/存储库
由于反馈非常积极,我决定从 Ubuntu 14.04 解引导系统开始。这意味着,原始系统不超过几百兆,并且不包含很多软件包。我使用了更新和安全软件包源以及 lxc daily 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
安装
在许多教程、论坛和错误报告中,我找到了必须安装的软件包列表。我还不确定其中哪些是重要的,但这是我最终安装的软件包列表(从已解引导的 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
再次强调:这个列表可能比必要的要长。以下是真正重要的内容:
- libpam-systemd:此库对于正确的 cgroup 权限很重要。我没有看到任何错误消息,但如果没有它,文件
/proc/self/cgroup
看起来像8:blkio:/
等,而不是8:hugetlb:/user/1000.user/1.session
- fuse:我读到它对 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-用户网络
- 〜/ .config/lxc/默认.conf
我做的唯一额外的事情如下,因为我在许多线程中发现了这一行:
chmod +x /home/testuser/.local/share
以用户身份登录
现在最重要的事情我仍然不明白,但它毁了我所有的基于脚本的实验:不要使用 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
我仍然不知道原因,但它必须与 libpam-systemd 连接。显然,两者su
都sudo
绕过了 PAM
最后,不要忘记在以用户身份登录时使用 lxc-xxx 命令。如果以 root 身份执行这些命令,它们将会失败(因为用户空间容器存储在.local/share/lxc/
而不是/var/lib/lxc/
故障排除
这些命令对我来说最有用:
journalctl
(在基于 upstart 的版本中):它揭示了 cgmanager 的问题/proc/self/cgroup
lxc-start
使用选项-l debug --logfile logfilename.txt
让我知道还有什么重要的事情。我认为社区需要它。
致谢
感谢以下教程:
- https://www.stgraber.org/2013/12/20/lxc-1-0-blog-post-series/
- https://help.ubuntu.com/lts/serverguide/lxc.html
- https://linuxcontainers.org/lxc/getting-started/
对于这些错误报告和论坛主题:
- https://serverfault.com/questions/646176/lxc-container-not-starting
- 我正在尝试使用 LXC 容器,但在启动非特权容器时遇到权限问题。我该如何修复?
- https://forum.linode.com/viewtopic.php?f=23&t=11019
- https://forum.linode.com/viewtopic.php?t=11506&p=65649
- https://serverfault.com/questions/678984/unprivileged-lxc-container-as-root
- 还有更多
免责声明
我在第一次测试成功后写了这篇文章。但我做了太多事情,以至于其中一些步骤可能没有必要。我很快就会在新系统上重新检查所有内容。
更新
以上所有操作均在 Ubuntu Trusty 14.04 LTS 上完成。现在,我刚刚测试了 Ubuntu Wily。到目前为止,我可以说:
- 您需要在已启动的基础系统上安装以下内容:
apt-get install lxc bridge-utils
- 无需外部镜像,使用Ubuntu自带的lxc
- 我没有触及我的新系统上的以下文件:,,,
/etc/subuid
此外,我创建了一个用户并填写了它的主页/etc/subgid
/etc/lxc/lxc-usernet
- 结论:更简单,更稳定。对我来说,这是第一个真正有效的版本。
(Wily 目前处于测试阶段,将于 2015 年 10 月 22 日发布)