web-dev-qa-db-fra.com

Monter le jeu de données ZFS dans des conteneurs non privilégiés

D'abord un peu d'informations sur ma configuration:

  • Ubuntu 15.10
  • Pool ZFS créé
  • Conteneurs LXC stockés dans pool/lxc
  • Jeu de données créé dans pool/mydataset appartenant à user1

Maintenant, j'ai besoin de l'un des conteneurs pour accéder aux fichiers/dossiers dans pool/mydataset. J'ai essayé ce qui suit:

  • Création d'un utilisateur user1 à l'intérieur du conteneur
  • Edité pool/lxc/mycontainer/config et ajouté:

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

Lorsque je démarre le conteneur, le jeu de données est monté, mais ls -la /mnt/mydataset dans le conteneur affiche nobody:nogroup au lieu de user1:user1, ce qui signifie que tous les fichiers sont en lecture seule.

Avez-vous une idée de la façon d’obtenir les autorisations appropriées dans le répertoire monté?

4
ghetto

Si, en effet, mycontainer n'est pas privilégié, son propriétaire pourrait ne pas avoir accès au chemin /pool/mydataset. Les utilisateurs des conteneurs non privilégiés ont leur uid décalé sur l'hôte par l'uid du propriétaire du conteneur. Ainsi, user1 à l'intérieur du conteneur n'est pas identique à user1 sur l'hôte.

  1. Vous pouvez vérifier quel utilisateur de l'hôte du conteneur appartient à l'hôte avec Sudo ls -l /pool/lxc | grep mycontainer (_ (Sudo) n'est peut-être pas nécessaire, selon les autorisations de /pool/lxc, mais ls devrait être suffisamment sûr pour s'exécuter en tant que Dans l’avenir, omettez Sudo si vous le souhaitez si les autorisations le permettent. Par exemple, je reçois

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

    montrant que l'ID utilisateur et le gid du propriétaire du conteneur sont 100000 (nous voyons un ID utilisateur au lieu d'un nom, car l'utilisateur n'existe pas sur l'hôte).

  2. Testez les autorisations de /pool/mydataset avec Sudo ls -l /pool | grep mydataset (ou Sudo ls -l /pool/mydataset pour son contenu).

    Si vous voulez que les fichiers puissent être écrits à partir du conteneur, vous devez simplement vous assurer que l'utilisateur situé dans mycontainer que vous souhaitez pouvoir écrire sur /pool/mydataset dispose des autorisations nécessaires pour le faire sur l'hôte. Par exemple, root sur mycontainer a un ID utilisateur 100000 sur l’hôte, et si user1 dans mycontainer a un ID utilisateur 1001 (à tester avec id user1dans le conteneur) alors sur l'hôte son uid serait 101001.


Vous pouvez le faire en permettant à tout le monde sur l'hôte d'écrire sur /pool/mydataset avec

Sudo chmod -R o+w /pool/mydataset

(Remarque: ceci ajoutera des autorisations de manière récursive dans /pool/mydataset), ou peut-être mieux pour vous assurer que les utilisateurs du groupe user1 ont des autorisations en écriture (définissez-le récursivement avec Sudo chmod -R g+w /pool/mydataset si pas), puis ajoutez le paramètre suivant. propriétaire du conteneur à grouper user1 avec

Sudo usermod -a -G user1 <username>

(Dans mon cas ci-dessus, nous avons vu qu'aucun utilisateur de l'hôte ne possède le conteneur. Nous devons donc d'abord créer un utilisateur avec uid et gid 100000 avec

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

Bien sûr, vous pouvez souhaiter donner des autorisations uniquement à user1 à l'intérieur du conteneur. Créez donc un utilisateur avec son hôte uid et ajoutez-le au groupe user1 sur l'hôte, par exemple, 101001.)

Vous pouvez aussi vous lancer dans le nucléaire et donner la propriété de la racine de /pool/mydataset à mycontainer avec

Sudo chown -R 100000:100000 /pool/mydataset

mais cela pourrait déranger d'autres utilisateurs de l'hôte accédant aux données.


Une fois que vous avez terminé, le montage que vous avez défini doit autoriser les autorisations d'écriture dans mycontaier, comme vous le souhaitez.

4
Jonathan Y.