在非特权容器中挂载 ZFS 数据集

在非特权容器中挂载 ZFS 数据集

首先介绍一下我的配置:

  • Ubuntu 15.10
  • ZFS 池已创建
  • 存储在 pool/lxc 中的 LXC 容器
  • 数据集创建于pool/mydataset所有者user1

现在我需要一个容器来访问中的文件/文件夹pool/mydataset。我尝试了以下操作:

  • user1在容器内创建用户
  • 编辑pool/lxc/mycontainer/config并添加:

    lxc.mount.entry = /pool/mydataset mnt/mydataset none rw,bind 0 0
    

当我启动容器时,数据集已被挂载,但ls -la /mnt/mydataset容器中显示nobody:nogroup的不是user1:user1,这意味着所有文件都是只读的。

知道如何在挂载目录中获取正确的权限吗?

答案1

如果确实mycontainer是无特权的,那么它的所有者可能无权访问该路径/pool/mydataset。无特权容器中的用户的 uid 在主机上的偏移量是容器所有者的 uid,因此容器内部的 uid 与主机上的 uiduser1不同。user1

  1. 您可以检查主机上的哪个用户拥有该容器sudo ls -l /pool/lxc | grep mycontainersudo可能不需要,具体取决于/pool/lxc的权限,但ls无论如何都应该足够安全以 root 身份运行。接下来,sudo如果权限允许,可以省略需要的地方)。例如,我得到

    drwxr-xr-x 4 100000 100000    5 Apr 22 11:37 mycontainer
    

    显示容器所有者的 uid 和 gid 是 100000(我们看到的是 uid 而不是名称,因为该用户在主机上不存在)。

  2. 测试/pool/mydataset的权限sudo ls -l /pool | grep mydataset(或其sudo ls -l /pool/mydataset内容)。

    如果您希望文件在容器内可写入,则只需确保您mycontainer希望能够写入的任何用户/pool/mydataset在主机上具有执行此操作的权限。例如,rootmycontainer主机上有 uid 100000,如果user1在中mycontainer有 uid 1001(使用id user1 从容器内部) 那么在主机上它的uid将是101001。


您可以通过允许主机上的每个人/pool/mydataset写入

sudo chmod -R o+w /pool/mydataset

(注意:这将在内部递归添加权限/pool/mydataset),或者更好的方法是确保组中的用户user1具有写权限(如果没有,则使用递归设置sudo chmod -R g+w /pool/mydataset),然后将容器的所有者添加到组user1

sudo usermod -a -G user1 <username>

(在我上面的例子中,我们看到主机上没有用户拥有该容器,所以我们应该首先创建一个 uid 和 gid 为 100000 的用户,

adduser --no-create-home --uid 100000 --disabled-password --disabled-login <username>

当然,你可能希望只向user1容器内部授予权限,因此创建一个用户,并赋予其主持人uid 并将其添加到user1主机上的组,例如 101001。)

您还可以使用以下方式获得核并将/pool/mydatasetmycontainer根所有权授予

sudo chown -R 100000:100000 /pool/mydataset

但这可能会影响主机上其他用户访问数据。


完成此操作后,您设置的挂载应该mycontaier根据需要允许内部写入权限。

相关内容