如何在LXC容器和主机之间共享目录?


15

如何在主机系统(ubuntu 14.04)和ubuntu lxc容器之间共享文件夹?

我尝试将文件夹安装在主机上:

sudo mount --bind /media/data/share /media/data/container/name/rootfs/share

但我看不到任何文件。

同样适用于:

sudo ln -s /media/data/share /media/data/container/name/rootfs/share

我是否需要更改共享文件夹的权限?

Answers:


13

根据LXC文档,您可以通过特权容器执行此操作:

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu

请注意,那是LXD文档,而不是LXC。如果尚未安装LXD,则lxc命令将不起作用。
山姆·布尔

@SamBull好吧,这是LXC / LXD团队自行造成的。LXC可用于引用liblxc(基础库)或lxd此答案中使用的LXD客户端(名称为)或LXC(带有命名工具的软件和“旧”工具集lxc-*)或项目(其中LXC是LinuX Containers的缩写)。这就是我在Unix.SE meta上问这个问题的原因。
0xC0000022L

12

我在openSUSE Wiki中找到了一篇文章:https ://en.opensuse.org/User:Tsu2/ LXC_mount_shared_directory

我按照步骤操作,现在可以正常工作。

创建主机目录:

mkdir /media/data/share && chmod 7777 /media/data/share

在lxc容器中创建目录:

mkdir /share

在主机上编辑lxc配置文件:

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0

将安装项定义为只读背后有什么原因吗?那是避免容器将数据写回到共享文件系统的良好安全实践吗?
jgomo3 '16

1
为我工作。请注意,使用相对路径sharelxc.mount.entry是至关重要的。
HRJ

1
如果在'bind'之后添加',create = dir',则无需创建安装点。我还删除了“ ro”部分,它似乎工作正常。
山姆·布尔

4

下面是我将主机目录之一挂载到容器的操作。这比听起来要棘手,因为我们希望实现

  • 在容器内,我们应该能够写入目录。
  • 在容器外部,我们应该能够写入在容器内部创建的文件和目录。

在在线阅读了各种文章之后(最有用的是github问题),这就是我解决的方法。技巧是将主机用户的uid和gid映射到容器内用户的uid和gid。

假设我要安装/home/breakds/projects到容器中的相同位置。外部目录归用户所有breakds,其uid和gid为1000

然后,我在名为的容器中创建了一个用户,该用户debian的uid和gid也恰好1000一样(因为它是第一个非root用户)。然后,我将在主机上创建一个(lxc)配置文件

lxc profile edit breakds

以下是配置文件的内容(我相信它是yaml格式):

name: breakds
config:
    raw.lxc: |
        lxc.id_map =
        lxc.id_map = u 0 165536 999
        lxc.id_map = g 0 165536 999
        lxc.id_map = u 1000 1000 1
        lxc.id_map = g 1000 1000 1
        lxc.id_map = u 1001 166537 64535
        lxc.id_map = g 1001 166537 64535
    user.vendor-data: |
        packages:
            - bash
description: allow home dir mounting for breakds
devices:
eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
projects:
    path: /home/breakds/projects
    source: /home/debian/projects
    type: disk

然后,将此配置文件永久应用于该容器:

$ lxc profile apply <my container> breakds

这应该可以解决问题。

注意:请注意,在切换到此配置文件之前,请确保应删除所有者/组为debian的所有目录或文件(并可能在切换后重新创建)。这是因为在uid和gid映射之后,它们的所有权将变为无效。我最初以为,因为我只是将1000映射到1000,所以一切都应该没问题,但是我想我在这里错过了一些东西,如果有人可以就如何解决这一问题提供建议,那就太好了。


但是您始终可以chown从主持人那里获得。
iBug

1

您也可以在不使用LXD的情况下通过直接编辑LXC配置文件来执行此操作:

# Container specific configuration
lxc.idmap = u 0 165536 1000
lxc.idmap = g 0 165536 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 166536 64535
lxc.idmap = g 1001 166536 64535

您还必须通过编辑/ etc / subuid和/ etc / subgid,确保容器的用户帐户具有映射到主机上的uid / gid 1000的权限:

containeruser:165536:65536
containeruser:1000:1

哪个系统处理/创建了/ etc / subuid?Openwrt没有。
mcr
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.