将共享的主机目录添加到LXC / LXD容器


19

我已经在Ubuntu 14.04上进行了LXC / LXD的实验,并且运行良好。我只需要弄清楚如何使共享目录在主机和容器之间工作,就可以一劳永逸地抛弃Virtualbox。

我已经看到此页面:https : //wiki.gentoo.org/wiki/LXD

其中提供了说明,但我一直在出错。

有谁知道任何简单明了的指令来使它工作?任何帮助,不胜感激。


2
我设法使用挂载了主机目录lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared。但是,查看容器上的目录,将其中文件的所有者和组设置为“ nobody”和“ nogroup”,并且装载是只读的。
user47227

您能再补充一点细节吗?什么究竟你做了,你想要什么,以实现和发生了什么呢?您是否遇到任何警告或错误消息?请在您的问题中完整复制它们。您可以在Ubuntu中选择,复制和粘贴终端内容和大多数对话消息。(请参阅如何问一个好问题?
David Foerster

假设您使用的是无特权的容器,并且UID / GID映射是问题所在,请查看本文中有关LXD的用户映射的这一部分。但是,这可能是在您提出问题后添加到LXD方式中的。
0xC0000022L

我不知道哪个版本加入这个(我是2.18),但如果可能的话,你也可以使用lxc file到主机和容器,使用之间传输文件pushpull
code_dredd

Answers:


21

您提到的https://wiki.gentoo.org/wiki/LXD上的说明是正确的,但可能需要更多说明。

首先在主机上检查存储容器数据的目录的所有权。跑

sudo ls -l /var/lib/lxd/containers

并检查您要与之共享目录的容器的所有者。以我为例uidgid两者均为100000。

接下来,使用以下命令更改您要共享的目录的所有权:

sudo chown 100000:100000 /tmp/share_on_host

以您在注释中指示的方式与容器共享目录:

lxc config device add mycontainer sharedtmp disk \
                  path=/tmp/share_on_guest source=/tmp/share_on_host

现在,在容器中,您将看到目录/tmp/share_on_guest(我不建议挂载目录,/tmp因为该目录被系统用于其他内容并且具有特殊权限)归根目录所有。从这里开始,您可以使用chown在容器中以将所有权更改为适当的所有权,uidgid适合您在容器中的用户。

附带说明一下,将容器中的所有权更改为例如拥有uid33 个用户的所有权后,您将在主机上看到uid现在有100033个,这很有意义。


不知道这是否只是我的设置,但是对于LXD v3.0.3 LTS(Ubuntu 18.04 LTS),除了/var/lib/lxd/containers指向其中的符号链接外,我什么都没有找到/var/lib/lxd/storage-pools/lxd/containers(在本例中,最后lxd一位是我的ZFS存储池的名称)。那里的所有容器在运行时似乎都具有相同的165536 uid / gid,root:root在关闭时则归所有者所有。
deoren

1
我意识到这是一个老问题+答案,但是在Ubuntu 18.04中,我不必弄乱任何许可。只需添加文件夹,lxc config它就像一个魅力!
Apache

4

这是此问题的更新答案。

/var/www/var/test在容器中那样安装主机文件夹。

lxc config device add mycontainer vartest disk source=/var/www path=/var/test

欢迎来到Ask Ubuntu!我建议编辑此答案以将其扩展为有关如何执行此操作的特定详细信息。(另请参阅“我如何编写一个好的答案?”,以获取有关在AskUbuntu上认为最有价值的答案的一般建议。)
David Foerster

3

您可以将其他设备分配给容器,这些设备可以是主机可访问的文件夹。

$ lxc config ## display help
...
lxc config device add [<remote>:]<container> <device> <type> [key=value...]
    Add a device to a container.
...

注意 <device>只是您分配的任意名称,它将用作后续设备管理的ID。

例如,要将主机文件夹“ ./host”挂载为容器中的“ / mnt / host” ...

lxc config device add mycontainer vartest disk source=$(pwd)/host path=/mnt/host

仍然存在一个问题 -如果您希望主机和容器都可以写入此文件夹,则需要相应地配置所有权和权限。LXD的默认模式使用户和组id值的数字范围虚拟化,这使情况变得复杂。 但是,有一个简单的解决方案:通过将容器配置为以主机等效的特权运行来绕过此虚拟化...

lxc config set <container> security.privileged true

目前,我尚不清楚这种方法对主机安全性的影响,但是虚拟化似乎在某种程度上“包含”了它。实际风险取决于使用容器的方式和原因。请参见https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers中的技术说明

进一步注意,如果您通常以非root用户身份在容器中操作,例如与...附加在一起,则此方法可能最有效。

lxc exec zesty -- su --login ubuntu

非root用户登录有一个问题:env尤其是http_proxy。解决方法示例:sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update
nobar

关于 http_proxy,我觉得更容易的解决方案可能要启用IPv4的讨论在这里
nobar

... 其次是 sudo dhclient在容器中-或更改manualdhcpin 50-cloud-init.cfg。不错的线索在这里:github.com/lxc/lxd/issues/1298
nobar

1
这是专利 主意。建议切换到特权容器,这将颠覆LXD带来的优势之一。虽然LXC 1.x还提供了使用非特权容器的可能性(是的,甚至是root用户),但整理细节却有些复杂。使用LXD,这已成为过去。此外,在某些文件夹上设置ACL以允许主机端UID进行必需的访问使用此处概述的方法有何复杂之?是的,映射UID / GID并不是唯一的方法!
0xC0000022L

1

基于ph0t0nix出色回答,我为Ubuntu 18.04服务器提出了以下分步方法:

  1. 在主机中,确定rootfs所有者的UID:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. 在容器中确定ubuntu的UID(即容器中的用户):

    id -u ubuntu    1000
  3. 在主机中创建共享文件夹并将其添加到容器中:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. 调整共享文件夹的主机UID(UID = UID主机+ UID来宾):

    sudo chown 101000:101000 /home/share_on_host
  5. 来宾(用户ubuntu)现在可以访问共享文件夹,并且可以使用来在容器内调整对共享文件夹的访问chmod


0

现在,我有了使用LXD配置文件处理容器和主机上的UID和GID之间的映射的安全,有效的解决方案。

在这里可以找到一个非常有用的要点:

https://gist.github.com/bloodearnest/ebf044476e70c4baee59c5000a10f4c8


5
请注意,从安全角度来看,使事物可写入世界通常不是一个好主意。您可能应该考虑在主机路径上使用POSIX ACL,通过为该uid添加一个特定的ACL,然后再为其他需要写访问权限的其他主机用户,授予对容器用户的访问权限。
stgraber

1
@stgraber虽然我同意您的意见,但我不知道如何进行设置。一些链接会有所帮助。
s3v3n

请不要推荐0777没有明显原因的“请破解我的系统和销毁我的数据”权限!几乎没有理由这么做,因为可以通过更明智的修改(例如更改(组)所有权)来避免这种情况。-1
David Foerster

我同意你的观点,但是我只是将其用作单个用户开发计算机上的临时解决方法,而没有其他任何方法可以使其正常工作。从那时起,我发现使用配置文件是解决此问题的方法,请参阅上面我编辑过的答案!
user47227

1
使用ACL或此处概述方法有何困难?
0xC0000022L
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.