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
doc:autres:vm:lxc:mode-utilisateur [16/06/2018 19:09]
captnfab [Préparation]
doc:autres:vm:lxc:mode-utilisateur [18/11/2020 20:51] (Version actuelle)
captnfab [Création du conteneur]
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
 +    * Testé et mis à jour par jeremyp3 le 18/11/2020
   * 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 22:
  
 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 32:
 ===== 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 43:
 <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 60:
 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 80:
  
 ==== 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 daemon-reload
 systemctl start lxc-cgroups</​code>​ systemctl start lxc-cgroups</​code>​
-===== 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. +===== Création du conteneur =====
-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 129: Ligne 161:
  
 Dans le dossier ''​~lxcuser-test/​.config/​lxc/''​ (probablement à créer), créer un fichier ''​default.conf''​ contenant la configuration suivante : Dans le dossier ''​~lxcuser-test/​.config/​lxc/''​ (probablement à créer), créer un fichier ''​default.conf''​ contenant la configuration suivante :
 +
 +depuis Debian buster :
 +
 +<code ini ~lxcuser-test/​.config/​lxc/​default.conf>​lxc.net.0.type = veth
 +lxc.net.0.link = lxcbr0
 +lxc.net.0.flags = up
 +# À compléter pour définir une adresse mac
 +#​lxc.net.0.hwaddr = 00:​16:​3e:​xx:​xx:​xx
 +lxc.idmap = u 0 624288 65536
 +lxc.idmap = g 0 624288 65536</​code>​
 +Remplacer //624288// sur les deux dernières lignes par les valeurs du premier sous-uid/​gid alloué à l'​utilisateur.
 +
 +Pour les anciennes version de Debian ou de LXC:
 <code ini ~lxcuser-test/​.config/​lxc/​default.conf>​lxc.network.type = veth <code ini ~lxcuser-test/​.config/​lxc/​default.conf>​lxc.network.type = veth
 lxc.network.link = lxcbr0 lxc.network.link = lxcbr0
Ligne 138: Ligne 183:
 Remplacer //624288// sur les deux dernières lignes par les valeurs du premier sous-uid/​gid alloué à l'​utilisateur. Remplacer //624288// sur les deux dernières lignes par les valeurs du premier sous-uid/​gid alloué à l'​utilisateur.
  
-<code user>​lxc-create ​-t download ​-n test -- -d debian</​code>​+<code user>​lxc-create -n test -t download ​-- -d debian ​-r buster -a amd64</​code>​
  
-==== Méthode root + chown ==== +Petit résumé des options : 
- +  ​* ​-n: Nom du conteneur 
-<code user>​mkdir ​-p ~/​.local/​share/​lxc</​code>​ +  ​* ​-t : template a utiliser, ici download 
- +après les //--// on donne les paramètres du template : 
-<code root>​lxc-create ​-t debian -n test -- -d debian +  * -d : Nom de la distribution dans notre cas: Debian.  
-mv /var/lib/lxc/test ~lxcuser-test/.local/​share/​lxc/​ +  ​* ​-rle nom de la release par exemple : busterstretchsid, testing ...  
-chown lxcuser-test~lxcuser-test/​.local/​share/​lxc/​test{,/config,/fstab} +  ​* ​-architecture ​de la distribution qui doit être la même que le système dans notre cas: amd64.
-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 =====
  
 Le fichier de configuration ''​~/​.local/​share/​lxc/​test/​config''​ doit ressembler à ça : Le fichier de configuration ''​~/​.local/​share/​lxc/​test/​config''​ doit ressembler à ça :
 +
 +Depuis Debian buster : 
 <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 -r buster -a amd64
 # 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
 +lxc.include = /​usr/​share/​lxc/​config/​common.conf
 +lxc.include = /​usr/​share/​lxc/​config/​userns.conf
 +lxc.arch = linux64
 +
 +# Container specific configuration
 +lxc.idmap = u 0 624288 65536
 +lxc.idmap = g 0 624288 65536
 +lxc.rootfs.path = dir:/​home/​lxcuser-test/​.local/​share/​lxc/​test/​rootfs
 +lxc.uts.name = test
 +
 +# Network configuration
 +lxc.net.0.type = veth
 +lxc.net.0.link = lxcbr0
 +lxc.net.0.flags = up
 +#​lxc.network.hwaddr = 00:​16:​3e:​xx:​xx:​xx
 +</​code>​
 +
 +Pour les anciennes version de Debian ou de LXC:
 +<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)
 +
 +# 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 168: Ligne 249:
 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 176: Ligne 257:
 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
Ligne 256: Ligne 337:
 Vérifier que le fichier ''​~lxcuser-test/​.local/​share/​lxc/​test/​config''​ contient bien la ligne Vérifier que le fichier ''​~lxcuser-test/​.local/​share/​lxc/​test/​config''​ contient bien la ligne
 <​code>​lxc.include = /​usr/​share/​lxc/​config/​debian.userns.conf</​code>​ <​code>​lxc.include = /​usr/​share/​lxc/​config/​debian.userns.conf</​code>​
 +
 +  * ''​Set hostname to <​test>​.
 +Failed to create /init.scope control group: Permission denied
 +Failed to allocate manager object: Permission denied
 +[!!!!!!] Failed to allocate manager object.
 +Exiting PID 1...''​
 +cela arrive quand le paquet ''​libpam-cgfs''​ n'est pas installé.
 ===== Sources ===== ===== Sources =====
  
doc/autres/vm/lxc/mode-utilisateur.1529168981.txt.gz · Dernière modification: 16/06/2018 19:09 par captnfab

Pied de page des forums

Propulsé par FluxBB