如何在主机系统(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
路径必须存在(并且主机用户可以访问)并且将被镜像到path
lxc 中。
ubuntu
以用户身份访问 shell
lxc exec mycontainer -- su -l ubuntu