logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
doc:autres:vm:lxc:mode-utilisateur [03/11/2016 15:33]
bendia [Utilisation de LXC en mode utilisateur non-privilégié] Mise à jour des tags de suivi
doc:autres:vm:lxc:mode-utilisateur [12/07/2018 11:28]
captnfab [Préparation]
Ligne 7: Ligne 7:
     * Création par [[user>​captnfab]] 09/12/2015     * Création par [[user>​captnfab]] 09/12/2015
     * Testé par captnfab le 09/12/2015     * Testé par captnfab le 09/12/2015
 +    * Testé et mis à jour par captnfab le 17/06/2018
   * Commentaires sur le forum : [[https://​debian-facile.org/​viewtopic.php?​pid=151771#​p151771 | ici]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))   * Commentaires sur le forum : [[https://​debian-facile.org/​viewtopic.php?​pid=151771#​p151771 | ici]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
  
Ligne 20: Ligne 21:
  
 Les outils de gestion lxc : Les outils de gestion lxc :
-<code root>​apt-get install lxc cgmanager ​uidmap</​code>​+<code root>​apt-get install lxc uidmap</​code>​
  
 D'​autres outils normalement présents par défaut : D'​autres outils normalement présents par défaut :
Ligne 30: Ligne 31:
 ===== Préparation ===== ===== Préparation =====
  
-Nous allons créer un conteneur Test, qui appartiendra à l'​utilisateur lxcuser-test,​ et accèdera ​au réseau via le pont lxcbr0.+Nous allons créer un conteneur Test, qui appartiendra à l'​utilisateur lxcuser-test,​ et accédera ​au réseau via le pont lxcbr0.
 Cette opération sera à répéter pour chaque utilisateur devant pouvoir créer un ou plusieurs conteneurs. C'est la seule partie du tutoriel qui doit nécessairement être effectuée en root. Cette opération sera à répéter pour chaque utilisateur devant pouvoir créer un ou plusieurs conteneurs. C'est la seule partie du tutoriel qui doit nécessairement être effectuée en root.
  
Ligne 41: Ligne 42:
 <note important>​Comme vous devrez vous connecter à cet utilisateur via ssh, je vous conseille de créer dès maintenant une paire de clefs via ssh-keygen, et de rajouter la clef publique aux clefs autorisées pour cet utilisateur.</​note>​ <note important>​Comme vous devrez vous connecter à cet utilisateur via ssh, je vous conseille de créer dès maintenant une paire de clefs via ssh-keygen, et de rajouter la clef publique aux clefs autorisées pour cet utilisateur.</​note>​
  
-=== Identification d'une plage d'​uid/​gid libre ===+Nous devons ensuite nous assurer qu'une plage de sous-uid/​sous-gid a été affectée à l'​utilisateur. 
 + 
 +=== Identification ​et affectation ​d'une plage d'​uid/​gid libre ===
 <code user>cat /​etc/​subuid</​code>​ <code user>cat /​etc/​subuid</​code>​
 Exemple : Exemple :
Ligne 56: Ligne 59:
 Voir le man <code user>man subuid</​code>​ Voir le man <code user>man subuid</​code>​
  
 +Si lxcuser-test **n'​apparaît pas dans la liste**, alors on va l'​ajouter,​ sinon, passer directement au paragraphe suivant.
 Dans notre exemple, le premier uid de libre est le 558752+65536=624288,​ donc notre utilisateur utilisera la plage d'uuid 624288 à 689823 (624288+65535). Dans notre exemple, le premier uid de libre est le 558752+65536=624288,​ donc notre utilisateur utilisera la plage d'uuid 624288 à 689823 (624288+65535).
 Nous faisons ensuite la même opération pour les gid, en consultant /​etc/​subgid. Nous faisons ensuite la même opération pour les gid, en consultant /​etc/​subgid.
 Dans notre exemple, on considèrera que le fichier /etc/subgid est identique au fichier /​etc/​subuid,​ ce qui est en général le cas. Dans notre exemple, on considèrera que le fichier /etc/subgid est identique au fichier /​etc/​subuid,​ ce qui est en général le cas.
  
-=== Affectation des sous-{u,​g}id à l'​utilisateur === 
 Nous allouons alors les sous-uid et sous-gid à l'​utilisateur test via la commande (**à modifier en fonction de vos propres ''/​etc/​sub{u,​g}id''​ !**) : Nous allouons alors les sous-uid et sous-gid à l'​utilisateur test via la commande (**à modifier en fonction de vos propres ''/​etc/​sub{u,​g}id''​ !**) :
 <code root>​usermod lxcuser-test --add-subuids 624288-689823 --add-subgids 624288-689823</​code>​ <code root>​usermod lxcuser-test --add-subuids 624288-689823 --add-subgids 624288-689823</​code>​
Ligne 76: Ligne 79:
  
 ==== Configuration cgroups ==== ==== Configuration cgroups ====
 +Il faut activer certaines fonctionnalités des cgroups pour que l'on puisse lancer les conteneurs utilisateurs.
  
-Ceci n'est pas nécessaire sous Ubuntu, qui intègre des patchs spéciaux pour que ça marche d'entrée de jeu (mais cause des problèmes dans d'autres situations, comme par exemple l'utilisation d'un noyau RT.)+== Configuration du noyau == 
 +Vérifier ​que le fichier ​''​/​sys/​fs/​cgroup/​cpuset/​cgroup.clone_children'' ​est bien à 1 par défaut sur le système. 
 +<code root>cat /​sys/​fs/​cgroup/​cpuset/​cgroup.clone_children</​code>​
  
-Créons les fichiers suivants +Créer le fichier de configuration de sysctl suivant ​
-<​code ​bash /usr/local/etc/lxc-cgroups-users+<​code ​ini /etc/sysctl.d/​40-lxc-userns.conf
-# Liste des utilisateurs pouvant lancer des lxc +kernel.unprivileged_userns_clone=1 
-LXCUSERS="​lxcuser-test"+net.bridge.bridge-nf-call-arptables=
 +net.bridge.bridge-nf-call-iptables=0 
 +net.bridge.bridge-nf-call-ip6tables=0
 </​code>​ </​code>​
  
-<​code ​bash /​usr/​local/​sbin/​prepare-lxc-cgroups> +Et le charger dans le système : 
-#!/bin/bash+<​code ​root>​sysctl ​--sys</​code>
  
-source ​/usr/local/etc/​lxc-cgroups-users +== Création des cgroups == 
- +Pour l'​instant,​ les cgroups nécessaires ne sont pas créés par défaut. Créer les fichiers suivant : 
-echo 1 > /sys/fs/cgroup/cpuset/cgroup.clone_children +<code bash /usr/local/sbin/prepare-lxc-cgroups>​#!/bin/sh 
-echo 1 > /proc/sys/kernel/unprivileged_userns_clone +LXC_USERS=$(cat ​/etc/lxc/lxc-users) 
- +for d in /sys/fs/cgroup/*
-for u in $LXCUSERS+
 do do
-  ​cgm create all $u +  ​f=$(basename $d) 
-  ​cgm chown all $u $(id -u $u$(id -g $u)+  ​if [ "$f" = "​cpuset"​ ] 
 +  then 
 +    echo 1 > $d/​cgroup.clone_children;​ 
 +  elif [ "​$f"​ = "​memory"​ ] 
 +  then 
 +    echo 1 > $d/​memory.use_hierarchy;​ 
 +  fi 
 +  for in $LXC_USERS 
 +  do 
 +    mkdir -p $d/$u 
 +    chown -R $u $d/$u 
 +  done
 done done
 </​code>​ </​code>​
 +et
 +<code bash /​usr/​local/​bin/​move-pid-to-cgroup>#​!/​bin/​sh
 +PID=$1
 +for d in /​sys/​fs/​cgroup/​*
 +do
 +        echo $PID > $d/​$USER/​tasks
 +done</​code>​
 +à rendre exécutables :
 +<code root>​chmod a+x /​usr/​local/​sbin/​prepare-lxc-cgroups
 +chmod +x /​usr/​local/​bin/​move-pid-to-cgroup</​code>​
  
-<code ini /etc/systemd/​system/lxc-cgroups.service>[Unit] +== Accès == 
-Description=Préparation cgroups pour lxc +Et rajouter ''​lxcuser-test''​ dans le fichier ''/​etc/​lxc/​lxc-users''​. S'il y a plusieurs utilisateurs,​ ils doivent être séparés par un espace. 
-After=local-fs.target cgmanager.service +<code ini /etc/lxc/lxc-users>lxcuser-test</​code>​
-Requires=cgmanager.service+
  
 +== Automatisation ==
 +Que l'on lancera automatiquement via systemd en créant ce service :
 +<code ini /​etc/​systemd/​system/​lxc-cgroups.service>​
 +[Unit]
 +Description=Préparation cgroups pour lxc
 +After=local-fs.target
 + 
 [Service] [Service]
 Type=oneshot Type=oneshot
 RemainAfterExit=yes RemainAfterExit=yes
 ExecStart=/​usr/​local/​sbin/​prepare-lxc-cgroups ExecStart=/​usr/​local/​sbin/​prepare-lxc-cgroups
 +  ​
 [Install] [Install]
-WantedBy=multi-user.target</​code>​+WantedBy=multi-user.target 
 +</​code>​
  
-<code root>chmod a+x /​usr/​local/​sbin/​prepare-lxc-cgroups +Et en l'​activant : 
-systemctl enable /​etc/​systemd/​system/​lxc-cgroups.service+<code root>​systemctl enable /​etc/​systemd/​system/​lxc-cgroups.service 
 +systemctl daemon-reload
 systemctl start lxc-cgroups</​code>​ systemctl start lxc-cgroups</​code>​
 +
 ===== Création du conteneur ===== ===== Création du conteneur =====
- 
-Il existe plusieurs méthodes pour installer une Debian/​Ubuntu/​Whatever dans un dossier. L'​ennui est que la plupart requiert les droits super-utilisateurs pour lancer debootstrap. 
-Ceci-dit, cette opération n'est a priori à faire qu'une fois, et l'​alternative n'est pas forcément réjouissante. Nous présentons les deux possibilités les plus intéressantes. 
- 
-==== Méthode template download ==== 
  
 Le code à faire en tant qu'​utilisateur est à faire en tant que ''​lxcuser-test''​. Le code à faire en tant qu'​utilisateur est à faire en tant que ''​lxcuser-test''​.
Ligne 138: Ligne 170:
  
 <code user>​lxc-create -t download -n test -- -d debian</​code>​ <code user>​lxc-create -t download -n test -- -d debian</​code>​
- 
-==== Méthode root + chown ==== 
- 
-<code user>​mkdir -p ~/​.local/​share/​lxc</​code>​ 
- 
-<code root>​lxc-create -t debian -n test -- -d debian 
-mv /​var/​lib/​lxc/​test ~lxcuser-test/​.local/​share/​lxc/​ 
-chown lxcuser-test:​ ~lxcuser-test/​.local/​share/​lxc/​test{,/​config,/​fstab} 
-find ~lxcuser-test/​.local/​share/​lxc/​test/​rootfs/​ -exec sh -c 'chown $(echo $(stat -c %u "​{}"​)+624288 | bc):$(echo $(stat -c %g "​{}"​)+624288 | bc) "​{}"'​ \; 
-</​code>​ 
-En remplaçant 624288 par les numéro initiaux des plages de sous-uid/​gid respectifs de votre user. 
  
 ===== Configuration du conteneur ===== ===== Configuration du conteneur =====
Ligne 154: Ligne 175:
 Le fichier de configuration ''​~/​.local/​share/​lxc/​test/​config''​ doit ressembler à ça : Le fichier de configuration ''​~/​.local/​share/​lxc/​test/​config''​ doit ressembler à ça :
 <code ini ~/​.local/​share/​lxc/​test/​config>​ <code ini ~/​.local/​share/​lxc/​test/​config>​
 +# Template used to create this container: /​usr/​share/​lxc/​templates/​lxc-download
 +# Parameters passed to the template: -d debian
 +# Template script checksum (SHA-1): 01d100d3f1129082777c82a0e3a66adcaeb5c37f
 # For additional config options, please look at lxc.container.conf(5) # For additional config options, please look at lxc.container.conf(5)
 +
 +# Uncomment the following line to support nesting containers:
 +#​lxc.include = /​usr/​share/​lxc/​config/​nesting.conf
 +# (Be aware this has security implications)
 +
 +# À compléter pour définir une adresse mac
  
 # Distribution configuration # Distribution configuration
 lxc.include = /​usr/​share/​lxc/​config/​debian.common.conf lxc.include = /​usr/​share/​lxc/​config/​debian.common.conf
 lxc.include = /​usr/​share/​lxc/​config/​debian.userns.conf lxc.include = /​usr/​share/​lxc/​config/​debian.userns.conf
-lxc.arch = x86_64 +lxc.arch = linux64
- +
-lxc.autodev = 0+
  
 # Container specific configuration # Container specific configuration
Ligne 167: Ligne 195:
 lxc.id_map = g 0 624288 65536 lxc.id_map = g 0 624288 65536
 lxc.rootfs = /​home/​lxcuser-test/​.local/​share/​lxc/​test/​rootfs lxc.rootfs = /​home/​lxcuser-test/​.local/​share/​lxc/​test/​rootfs
-#lxc.mount /​home/​lxcuser-test/​.local/​share/​lxc/​test/​fstab+lxc.rootfs.backend ​dir
 lxc.utsname = test lxc.utsname = test
  
Ligne 175: Ligne 203:
 lxc.network.link = lxcbr0 lxc.network.link = lxcbr0
 #​lxc.network.hwaddr = 00:​16:​3e:​xx:​xx:​xx</​code>​ #​lxc.network.hwaddr = 00:​16:​3e:​xx:​xx:​xx</​code>​
- 
-<note warning>​Si vous avez utilisé la méthode « root » pour créer le conteneur, il vous faudra compléter votre fichier. 
-  * Vérifier les ''​lxc.id_map''​ et le include de ''​debian.userns.conf''​. 
-  * Les chemins ''​lxc.rootfs''​ et éventuellement ''​lxc.mount''​ doivent être les bons (si vous avez déplacé le dossier du conteneur dans votre home…) 
-  * Les options ''​lxc.network.''​* doivent être cohérentes avec ce qui a été indiqué dans ''/​etc/​lxc/​lxc-usernet''​ : 
-<​code>​lxcuser-test veth lxcbr0 1</​code>​ 
-</​note>​ 
  
 Les droits des dossiers doivent ressembler à cela : Les droits des dossiers doivent ressembler à cela :
 <code user>ls -lhd /​home{,/​lxcuser-test{,/​.local{,/​share{,/​lxc{,/​test}}}}}</​code>​ <code user>ls -lhd /​home{,/​lxcuser-test{,/​.local{,/​share{,/​lxc{,/​test}}}}}</​code>​
 <​code>​drwxr-xr-x 5 root    root    4,0K déc.  17 00:07 /home <​code>​drwxr-xr-x 5 root    root    4,0K déc.  17 00:07 /home
-drwxr-xr-x 3 lxcuser lxcuser 4,0K déc.  17 00:56 /​home/​lxcuser-test +drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc.  17 00:56 /​home/​lxcuser-test 
-drwxr-xr-x 3 lxcuser lxcuser 4,0K déc.  17 00:56 /​home/​lxcuser-test/​.local +drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc.  17 00:56 /​home/​lxcuser-test/​.local 
-drwxr-xr-x 3 lxcuser lxcuser 4,0K déc.  19 13:49 /​home/​lxcuser-test/​.local/​share +drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc.  19 13:49 /​home/​lxcuser-test/​.local/​share 
-drwxr-xr-x 3 lxcuser lxcuser 4,0K déc.  19 13:53 /​home/​lxcuser-test/​.local/​share/​lxc +drwxr-xr-x 3 lxcuser-test lxcuser-test 4,0K déc.  19 13:53 /​home/​lxcuser-test/​.local/​share/​lxc 
-drwxrwx--x 3 lxcuser ​lxcuser ​4,0K déc.  19 13:51 /​home/​lxcuser-test/​.local/​share/​lxc/​test</​code>​ +drwxrwx--x 3       624288 ​lxcuser-test 4,0K déc.  19 13:51 /​home/​lxcuser-test/​.local/​share/​lxc/​test</​code>​
-(Le o+x est le point crucial ici.)+
  
 <code user>ls -lh /​home/​lxcuser-test/​.local/​share/​lxc/​test</​code>​ <code user>ls -lh /​home/​lxcuser-test/​.local/​share/​lxc/​test</​code>​
 <​code>​total 8,0K <​code>​total 8,0K
--rw-r--r-- ​ 1 lxcuser lxcuser ​ 488 déc.  19 13:51 config +-rw-r--r-- ​ 1 lxcuser-test lxcuser-test  488 déc.  19 13:51 config 
--rw-r--r-- ​ 1 lxcuser lxcuser ​   0 déc.  19 13:51 fstab +-rw-r--r-- ​ 1 lxcuser-test lxcuser-test    0 déc.  19 13:51 fstab 
-drwxr-xr-x 22 624288 624288 ​  ​4,0K déc.  19 13:51 rootfs</​code>​ +drwxr-xr-x 22       ​624288 ​      ​624288 4,0K déc.  19 13:51 rootfs</​code>​ 
-(Vérifier les propriétaires suivant ses propres sous-uid/​sous-gid.)+ 
 +Vérifier les propriétaires suivant ses propres sous-uid/​sous-gid. 
 +Vérifiez bien les droits de lecture/​écriture/​exécution pour l'​utilisateur,​ le groupe et les autres. 
 ===== Utilisation du conteneur ===== ===== Utilisation du conteneur =====
  
-<note warning>​Ne vous loguez pas en tant que ''​lxcuser-test'' ​via **su** ou **sudo**la suite ne fonctionnera pas. Vous devez impérativement vous connecter via ''​ssh''​ ou directement sur un ''​getty''​. En effet, cgm et lxc-start s'​appuient sur les sessions PAM, qui ne sont pas créées via su ou sudo… +Il faut, en tant que ''​lxcuser-test'',​ et dans le shell qui lancera le conteneurexécuter la commande suivante (qui ajoutera le shell au cgroup) : 
-</note+<code user>​move-pid-to-cgroup $$</code> 
-<code user>cgm movepid all $USER $$ + 
-lxc-start -n test -d</​code>​+  * Lancement 
 +<code user>​lxc-start -n test -d</code
 + 
 +  * Shell 
 +<code user>​lxc-attach --set-var PATH=/​usr/​local/​sbin:/​usr/​local/​bin:/​usr/​sbin:/​usr/​bin:/​sbin:/​bin -n test</​code>​ 
 + 
 +<note info>​Sans l'​option ''​--clear-env'',​ vous conservez les variables d'​environnement de votre utilisateur. Ce n'est en général pas gênant, mais ces variables incluent aussi le PATH… Cependant, clear-env enlève aussi des variables intéressantes comme TERM. Pour ne pas vous retrouver avec un shell root avec un path utilisateur (ne contenant pas sbin) ce qui peut facilement générer des erreurs, ou un terminal mal configuré, utilisez l'​option ''​--set-var''​.</​note>
  
-Attention, la première commande peut renvoyer une erreur tout en fonctionnant correctement,​ donc ne pas utiliser ''&&''​. 
 ===== FAQ / Problèmes rencontrés ===== ===== FAQ / Problèmes rencontrés =====
 Messages d'​erreur rencontrés en lançant les différentes commandes du tuto, ou encore journalctl -xe Messages d'​erreur rencontrés en lançant les différentes commandes du tuto, ou encore journalctl -xe
doc/autres/vm/lxc/mode-utilisateur.txt · Dernière modification: 18/11/2020 20:51 par captnfab

Pied de page des forums

Propulsé par FluxBB