设置用户空间LXC容器时出现问题
几个晚上,我已经尝试使用用户空间容器来安装LXC。 由于它将成为一个新的服务器,我不太关心(但)关于发布和发布,所以我尝试了Debian 7 + 8和Ubuntu 14.04和15.04作为主机,Ubuntu 15.04和Debian 8作为嘉宾。 所有这些都有他们的问题。 摘要:
Debian 7.8 :lxc-create:此命令必须以root身份运行(两个guest)
Debian 8.0 :lxc-create:不允许操作(两个客人)
Ubuntu 14.04 w / Ubuntu 15.04 guest :lxc-start:调用cgmanager_create_sync失败:无效请求/容器无法启动。
Ubuntu 14.04 w / Debian 8 guest :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/进行了操作 ,看起来它们看起来并不那么复杂。
我编写了一个脚本来使测试可重现(在新启动的live cd上以root身份运行)。 谁能告诉我它有什么问题?
#!/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,并且安装了所有更新。 然后我用原始的lxc包测试了一次,用lxc每日ppa测试了一次。 结果始终与上面显示的错误相同。
找到了! 仍然没有完成,但我第一次设法启动一个容器。 有几件事情出了问题,我发现有很多人有类似的问题。 这是一个有点麻烦的解决指南:
Disribution / Repositories
由于最积极的反馈,我决定从一个Ubuntu 14.04 debootstrapped系统开始。 这意味着,原始系统不会超过几个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
安装
在许多教程,论坛和错误报告中,我找到了必须安装的软件包列表。 我不确定哪些是重要的,但这里是我最终安装的列表(从debootstrapped 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包不依赖它的bug )
- lxc:最重要的包,如果你只使用无特权的容器就足够了
- cgmanager:我还在学习它的function。 顺便说一句: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
我做的唯一额外的事情是以下,因为我在许multithreading中找到了这条线:
chmod +x /home/testuser/.local/share
以用户身份登录
现在最重要的事情我仍然不明白但是毁了我所有的基于脚本的实验: 不要使用su或sudo登录!
我certificate:
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/
以及这些错误报告和论坛post:
- 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可信赖的14.04 LTS完成。 现在,我只是狡猾地测试了Ubuntu。 到目前为止我可以说:
- 您需要在debootstrapped基础系统上安装所有东西:
apt-get install lxc bridge-utils
- 无需外部镜子。 使用Ubuntu提供的lxc
- 我在新系统上没有碰到以下文件:
/etc/subuid
,/etc/subgid
,/etc/lxc/lxc-usernet
,另外,我创建了一个用户并填充了它的主页 - 结论:更容易,更稳定。 对我而言,这是第一个真正有效的版本。
(Wily现已发布测试版,将于2015年10月22日发布)