Montar conjunto de dados do ZFS em contêineres não privilegiados

4

Primeiro, um pouco de informação sobre minha configuração:

  • Ubuntu 15.10
  • Conjunto do ZFS criado
  • Contêineres LXC armazenados no pool / lxc
  • Conjunto de dados criado em pool/mydataset de propriedade de user1

Agora eu preciso de um dos contêineres para acessar os arquivos / pastas em pool/mydataset . Eu tentei o seguinte:

  • Criado um usuário user1 dentro do contêiner
  • Editado pool/lxc/mycontainer/config e adicionado:

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

Quando inicio o contêiner, o conjunto de dados é montado, mas ls -la /mnt/mydataset no contêiner mostra nobody:nogroup em vez de user1:user1 , o que significa que todos os arquivos são somente leitura.

Alguma ideia de como obter as permissões corretas no diretório montado?

    
por ghetto 15.02.2016 / 23:41

1 resposta

4

Se, de fato, mycontainer não for privilegiado, seu proprietário poderá não ter acesso ao caminho /pool/mydataset . Os usuários em contêineres não privilegiados têm seu deslocamento uid no host pelo uid do contêiner-proprietário, portanto user1 dentro do contêiner não é o mesmo que user1 no host.

  1. Você pode verificar qual usuário no host possui o contêiner com sudo ls -l /pool/lxc | grep mycontainer ( sudo pode não ser necessário, dependendo das permissões de /pool/lxc , mas ls deve ser seguro o suficiente para ser executado como raiz de qualquer forma No futuro, omitir sudo , quando desejável, se as permissões tornarem isso possível). Por exemplo, eu recebo

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

    mostrando que o uid e gid do proprietário do contêiner é 100000 (vemos um uid em vez de um nome, pois o usuário não existe no host).

  2. Teste as permissões de /pool/mydataset com sudo ls -l /pool | grep mydataset (ou sudo ls -l /pool/mydataset para seu conteúdo).

    Se você deseja que os arquivos sejam graváveis a partir do contêiner, basta garantir que o usuário dentro de mycontainer que você queira gravar em /pool/mydataset tenha permissões para fazê-lo no host. Por exemplo, root on mycontainer tem uid 100000 no host, e se user1 in mycontainer tiver uid 1001 (teste com id user1 de dentro do contêiner ), então no host será uid seria 101001.

Você pode fazer isso permitindo que todos no host gravem em /pool/mydataset com

sudo chmod -R o+w /pool/mydataset

(note: isso adicionará permissões recursivamente dentro de /pool/mydataset ), ou talvez melhor para garantir que os usuários do grupo user1 tenham permissões de gravação (defina recursivamente com sudo chmod -R g+w /pool/mydataset se não) e adicione o proprietário do container para agrupar user1 com

sudo usermod -a -G user1 <username>

(No meu caso acima, vimos que nenhum usuário no host possui o container, então devemos primeiro criar um usuário com uid e gid 100000 com

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

Claro, você pode querer dar permissões somente a user1 dentro do container, então crie um usuário com seu host uid e adicione-o ao grupo user1 no host, por exemplo, 101001 .)

Você também pode se tornar nuclear e dar a propriedade de /pool/mydataset à raiz de mycontainer com

sudo chown -R 100000:100000 /pool/mydataset

mas isso poderia mexer com outros usuários no host acessando os dados.

Depois de fazer isso, a montagem que você definir deverá permitir permissões de gravação dentro de mycontaier , conforme desejado.

    
por Jonathan Y. 15.05.2016 / 21:14