Answers:
我认为我找到了比当前此处介绍的解决方案更好的解决方案。据我所知,部分原因是cgmanager已死,部分原因是我的解决方案感觉不像是一种变通的解决方法,而主要是因为在寻找问题的解决方案时仍会看到这种讨论。实际上,这非常简单:使用systemd用户模式。
当然,如果您不使用systemd,此解决方案将无济于事。在这种情况下,我建议您弄清楚您的init系统是否可以通过某种方式允许非特权用户在引导时运行服务并将其用作起点。
我假设您有没有特权的lxc容器正常工作,并且lxc-autostart
以容器用户的身份运行。如果是这样,请执行以下操作:
~/.config/systemd/user/lxc-autostart.service
在具有lxc容器的任何用户的主目录中创建文件:[Unit]
Description="Lxc-autostart for lxc user"
[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1
[Install]
WantedBy=default.target
systemctl --user enable lxc-autostart
(请注意,该--user
选项告诉systemctl您正在用户模式下使用它。我通常使用systemctl进行的所有操作,启动,停止,状态,启用等都与--user一起使用。)
$user
具有lxc容器的用户的名称是:sudo loginctl enable-linger $user
这是systemd在启动时启动systemd用户实例所必需的$user
。否则,它只会在$user
登录时启动。
有关更多信息,我建议使用archlinux wiki systemd / timer页面和systemd手册页。
您实际上可以以root用户身份启动/停止/使用用户的systemd服务,但这需要您设置XDG_RUNTIME_DIR
环境变量。假设$user
是您要访问其实例的用户,$uid
它是uid,那么这就是您启动上面定义的lxc-autostart.service的方式:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
您甚至可以使用systemd-run
该用户身份以不破坏lxc的方式运行任意命令。我正在使用以下命令在备份之前/之后停止/启动容器,其中$name
正在备份的lxc容器的名称是:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name
(请注意,没有--wait
systemd-run直到容器停止后才会阻塞。)
我建议@reboot
在Ubuntu的cron中使用方便的别名运行lxc-autostart
。
以拥有非特权容器的用户身份,运行crontab -e
并添加以下行:
@reboot lxc-autostart
/proc/self/cgroup
它包含类似的序列,/user/0.user/1.session
而不是/user/1000.user/1.session
如果有人偶然发现此问题,以获取自动启动非特权LXC容器的答案(我肯定会在这里多次检查),这是一个很好的解决方案,我遵循了该解决方案以使其在服务器上正常工作:
Nicholas J Ingrassellino的http://blog.lifebloodnetworks.com/?p=2118。
简而言之,它涉及创建两个脚本,它们在启动时一起工作,以允许LXC启动每个列出的用户的非特权容器,而无需实际登录用户帐户。换句话说,以用户身份执行所有CGroups魔术的命令。为了遵循最佳实践,我在这里引用它的内容,但是值得阅读他的原始文章。
允许我们的用户帐户使用网桥…
echo "$USER veth lxcbr0 1024" | sudo tee -a /etc/lxc/lxc-usernet
创建Upstart脚本...在
/etc/init/lxc-unprivileged.conf
添加中...
description "LXC Unprivileged Containers"
author "Mike Bernson <mike@mlb.org>"
start on started lxc
script
USERS="[user]"
for u in $USERS; do
cgm create all lxc$u
cgm chown all lxc$u $(id -u $u) $(id -g $u)
lxc-autostart -L -P /home/$u/.local/share/lxc | while read line;
do
set -- $line
/usr/local/bin/startunprivlxc lxc$u $u $1
sleep $2
done
done
end script
确保用您的用户帐户替换[user]。
创建容器启动脚本...在
/usr/local/bin/startunprivlxc
添加中...
#!/bin/sh
cgm movepid all $1 $$
sudo -iH -u $2 -- lxc-start -n $3 -d
…并使其可执行…
sudo chmod +x /usr/local/bin/startunprivlxc
我只想强调一下,它确实可以安全,正确地运行,并且不需要root用户即可通过SSH进入其他用户帐户。
这里还有更多关于该主题的内容(触及相关陷阱):https : //gist.github.com/julianlam/4e2bd91d8dedee21ca6f,这对于理解为什么是这样很有用。
我已经写了一个小脚本来解决此问题,只需按照注释中的说明进行操作即可。
抱歉:回答太早了。即使lxc-ls将“ AUTOSTART”显示为“ YES”,它也不起作用。
这是一个包含更多有用信息的链接,也许有人可以使用它:http : //www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/
我登陆此页面是因为我遇到了同样的问题。读完该线程后,我意识到lxc-create如果不使用sudo运行,则无法将其写入通常的“ / var / lib / lxc /”目录。
我环顾四周,将我的非特权容器的rootfs放在“〜/ .local / share / lxc”中,然后将问题中的两行放入该目录的config中。
我查看了我使用的模板“ lxc-download”作为线索,但是我认为在调用“ lxc-download”时传递了路径。我还没有研究系统在引导过程中如何查找未特权的容器。
我使用了另一种方法,它正在工作
1º在容器配置文件中添加以下条目
lxc.start.auto = 1 lxc.start.delay = 5
2º在同一服务器上的容器用户和他自己之间创建信任关系
userlxc @ GEST-4:〜$ ssh-keygen -t rsa生成公用/专用rsa密钥对。输入要在其中保存密钥的文件(/home/userlxc/.ssh/id_rsa):输入密码(无密码时为空):再次输入相同的密码:您的标识已保存在/home/userlxc/.ssh/id_rsa中。您的公钥已保存在/home/userlxc/.ssh/id_rsa.pub中。密钥指纹为:c9:b4:e1:f3:bf:a3:25:cc:f8:bc:be:b6:80:39:59:98 userlxc @ GEST-AMENCIA-4密钥的randomart图像为:+ -[RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =。| | 。+。+。| | oO = oo | + ----------------- +
userlxc @ GEST-4:〜$ cat .ssh / id_rsa.pub >> .ssh / authorized_keys userlxc @ GEST-4:〜$ ls -lrt .ssh / authorized_keys -rw-rw-r-- 1 userlxc userlxc 404 Nov 19 17:23 .ssh / authorized_keys
检查ssh连接,您必须能够在没有密码的情况下使用它。userlxc @ GEST-4:〜$ ssh userlxc @ localhost“ lxc-ls --fancy”
EXTLXCCONT01已停止--是
UBUSER1404USERCONT01-测试已停止--否
UBUSER1404USERLXCCONT01已停止--否
3º在容器所有者处创建一个crontab条目
@reboot ssh userlxc @ localhost“ lxc-autostart”