如何自动启动非特权Lxc容器?


9

在Ubuntu 14.04上,我创建了一个无特权的容器,可以手动启动和停止该容器。

但是,我希望这与系统一起启动和停止。

我在容器的配置中添加了以下内容: lxc.start.auto = 1 lxc.start.delay = 5

但是,系统脚本似乎没有选择非特权容器。

linuxcontainers.org上有与此相关的线程,但是该解决方案似乎仅限于root用户。

有没有针对非root用户(经root用户同意)执行此操作的干净方法?

Answers:


3

我认为我找到了比当前此处介绍的解决方案更好的解决方案。据我所知,部分原因是cgmanager已死,部分原因是我的解决方案感觉不像是一种变通的解决方法,而主要是因为在寻找问题的解决方案时仍会看到这种讨论。实际上,这非常简单:使用systemd用户模式

当然,如果您不使用systemd,此解决方案将无济于事。在这种情况下,我建议您弄清楚您的init系统是否可以通过某种方式允许非特权用户在引导时运行服务并将其用作起点。

使用systemd用户模式自动启动非特权的lxc容器

我假设您有没有特权的lxc容器正常工作,并且lxc-autostart以容器用户的身份运行。如果是这样,请执行以下操作:

  1. ~/.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
  1. 然后,当该用户运行时:
systemctl --user enable lxc-autostart

(请注意,该--user选项告诉systemctl您正在用户模式下使用它。我通常使用systemctl进行的所有操作,启动,停止,状态,启用等都与--user一起使用。)

  1. 然后运行以下命令,其中$user具有lxc容器的用户的名称是:
sudo loginctl enable-linger $user

这是systemd在启动时启动systemd用户实例所必需的$user。否则,它只会在$user登录时启动。

有关更多信息,我建议使用archlinux wiki systemd / timer页面和systemd手册页

以root身份访问用户的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

(请注意,没有--waitsystemd-run直到容器停止后才会阻塞。)


7

我建议@rebootUbuntu的cron中使用方便的别名运行lxc-autostart

以拥有非特权容器的用户身份,运行crontab -e并添加以下行:

@reboot lxc-autostart


听起来不错。但是,似乎没有办法在关机时(通过cron)运行命令。有任何想法吗?
HRJ 2015年

我不知道在关闭时运行作业的任何简单方法。您可能必须以root用户身份添加一个upstart作业来关闭拥有它们的每个用户的容器。您可以查看/etc/init/lxc.conf指针。这是启动特权容器的新贵工作。复制它并修改它以关闭非特权容器也不应该太难。
编码

1
在我看来,由于容器中的每个进程都可以从主机看到,因此容器可能不需要任何特殊操作即可关闭它,因此每个进程都应从主机接收到TERM信号。您可能不需要在关机时做任何特别的事情。如果要在关机时运行某些脚本或其他类似的东西,则有所不同,但是大多数进程应该都有机会正常关机。
编码

crontab方法有效吗?在Ubuntu 14.04上,我收到“ cgmanager_move_pid_sync调用失败:无效请求”错误,该错误发生是因为PAM(即libpam-systemd)不参与用户更改过程。您可以看到/proc/self/cgroup它包含类似的序列,/user/0.user/1.session而不是/user/1000.user/1.session
Daniel Alder

3

如果有人偶然发现此问题,以获取自动启动非特权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,这对于理解为什么是这样很有用。



0

抱歉:回答太早了。即使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”时传递了路径。我还没有研究系统在引导过程中如何查找未特权的容器。


0

我使用相同的命名用户运行每个非特权容器,以实现更好的隔离,这就是我的方法:

#!/bin/bash

LXC_CONTAINERS="container1 container2"

for LXC_CONTAINER in $LXC_CONTAINERS; do
 su - $LXC_CONTAINER -c "lxc-start -n $LXC_CONTAINER --logfile /home/$LXC_CONTAINER/.local/share/lxc/lxc-$LXC_CONTAINER.log --logpriority DEBUG"
done

-1

假设(这是解决问题的所有方法之母),您将以“拥有”非特权lxc容器的用户身份登录,那么以下命令应可满足您的需求...

$ echo "lxc-start -n LXC-CONTAINER-NAME -d" >> .bashrc

通过bash登录时,这将仅运行上述命令。这也假设bash是登录shell。请使用LXC-CONTAINER-NAME您要启动的LXC容器的名称替换名称:。


-1

我使用了另一种方法,它正在工作

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”

名称状态IPV4 IPV6自动启动

EXTLXCCONT01已停止--是
UBUSER1404USERCONT01-测试已停止--否
UBUSER1404USERLXCCONT01已停止--否

3º在容器所有者处创建一个crontab条目

@reboot ssh userlxc @ localhost“ lxc-autostart”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.