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

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

如何在主机系统(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

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

答案1

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

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

答案2

我在 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

答案3

下面是我将主机目录之一挂载到容器中的方法。这比听起来要复杂得多,因为我们想要实现

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

在网上阅读了各种文章后(最有帮助的是这个 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,所以一切都应该没问题,但我认为我在这里遗漏了一些东西,如果有人能建议如何在不使用 hack 的情况下解决这个问题,那就太好了。

答案4

对于可以访问主机用户文件(但不是 root 用户)的非特权容器,这是一种更安全的方法。我们创建从主机用户到默认 lxc 用户的映射。

lxc launch ubuntu:22.04 mycontainer -c raw.idmap="both 1000 1000"

第一个 id 是主机用户的 uid,通常为 1000,除非计算机中有多个用户。要检查,请运行id YOUR_USERNAME。第二个 id 是 lxd 默认用户ubuntu,始终为 1000。

现在运行

lxc config device add mycontainer mydiskname disk source=~/path/to/desired/folder path=/home/ubuntu/myfolder

mydiskname可以是任意名称。source路径必须存在(并且主机用户可以访问)并且将被镜像到pathlxc 中。

ubuntu以用户身份访问 shell

lxc exec mycontainer -- su -l ubuntu

相关内容