Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
lxc [Le 12/08/2018, 11:33] beaver |
lxc [Le 11/09/2022, 12:09] (Version actuelle) moths-art Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
====== LXC ====== | ====== LXC ====== | ||
- | **LXC** est l'acronyme de l'anglicisme **LinuX Containers**, est un système de [[virtualisation|virtualisation]], utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. Il est utilisé pour faire fonctionner des environnements Linux isolés les uns des autres dans des conteneurs partageant le même noyau. Le conteneur apporte une virtualisation de l'environnement d'exécution (processeur, mémoire vive, réseau, système de fichier…) et non pas de la machine. Pour cette raison, on parle de « conteneur » et non de « machine virtuelle ». | + | **LXC** est l'acronyme de l'anglicisme **LinuX Containers**, est un système de [[virtualisation|virtualisation]], utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. Il est utilisé pour faire fonctionner des environnements Linux isolés les uns des autres dans des conteneurs partageant le même noyau. Le conteneur apporte une virtualisation de l'environnement d'exécution (processeur, mémoire vive, réseau, système de fichier…) et non pas de la machine. Pour cette raison, on parle de « conteneur » et non de « machine virtuelle ». |
Veillez à ne pas confondre **LXC** et [[:LXD|LXD]], en effet, [[:LXD|LXD]] est une surcouche logicielle à **LXC**. [[:LXD|LXD]] est développé par Canonical pour simplifier la manipulation de vos conteneurs. | Veillez à ne pas confondre **LXC** et [[:LXD|LXD]], en effet, [[:LXD|LXD]] est une surcouche logicielle à **LXC**. [[:LXD|LXD]] est développé par Canonical pour simplifier la manipulation de vos conteneurs. | ||
Ligne 18: | Ligne 18: | ||
===== Création de notre premier container LXC (root) ===== | ===== Création de notre premier container LXC (root) ===== | ||
<note warning>Attention, bien que vos processus soient isolés de votre [[wpfr>Hôte_(informatique)|machine hôte]], via ce procédé, votre container [[apt>lxc|LXC]] nécessitera d'utiliser [[:sudo|sudo]] pour être fonctionnel. Si vous avez une faille de sécurité dans votre container, une [[wp>Privilege_escalation|escalade des privilèges]] peut être intenté sur votre container, pour accéder à votre [[wpfr>Hôte_(informatique)|machine hôte]]. L'utilisation de [[:sudo|sudo]] pourrait donc compromettre votre [[wpfr>Hôte_(informatique)|système hôte]] !.</note> | <note warning>Attention, bien que vos processus soient isolés de votre [[wpfr>Hôte_(informatique)|machine hôte]], via ce procédé, votre container [[apt>lxc|LXC]] nécessitera d'utiliser [[:sudo|sudo]] pour être fonctionnel. Si vous avez une faille de sécurité dans votre container, une [[wp>Privilege_escalation|escalade des privilèges]] peut être intenté sur votre container, pour accéder à votre [[wpfr>Hôte_(informatique)|machine hôte]]. L'utilisation de [[:sudo|sudo]] pourrait donc compromettre votre [[wpfr>Hôte_(informatique)|système hôte]] !.</note> | ||
+ | |||
Pour créer un container avec pour nom((Option -n.)) **container_xenial**, pour la distribution((Option -d.)) **Ubuntu**, sous la release((Option -r.)) **Xenial**, ayant une architecture((Option -a.)) **amd64**, nous utiliserons cette commande : | Pour créer un container avec pour nom((Option -n.)) **container_xenial**, pour la distribution((Option -d.)) **Ubuntu**, sous la release((Option -r.)) **Xenial**, ayant une architecture((Option -a.)) **amd64**, nous utiliserons cette commande : | ||
Ligne 55: | Ligne 56: | ||
<code bash>sudo lxc-ls --fancy</code> | <code bash>sudo lxc-ls --fancy</code> | ||
- | <code bash>beaver@home:~$ sudo lxc-ls --fancy | + | <code bash>beaver@mysweethome:~$ sudo lxc-ls --fancy |
NAME STATE AUTOSTART GROUPS IPV4 IPV6 | NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
container_xenial STOPPED 0 - 10.0.3.58 - | container_xenial STOPPED 0 - 10.0.3.58 - | ||
- | beaver@home:~$ cat /etc/lxc/default.conf | + | beaver@mysweethome:~$ cat /etc/lxc/default.conf |
lxc.network.type = veth | lxc.network.type = veth | ||
lxc.network.link = lxcbr0 | lxc.network.link = lxcbr0 | ||
Ligne 65: | Ligne 66: | ||
lxc.network.hwaddr = 00:16:3e:xx:xx:xx | lxc.network.hwaddr = 00:16:3e:xx:xx:xx | ||
- | beaver@home:~$ dpkg -l bridge-utils | + | beaver@mysweethome:~$ dpkg -l bridge-utils |
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder | Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder | ||
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements | | État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements | ||
Ligne 83: | Ligne 84: | ||
On vérifie l'état de notre container : | On vérifie l'état de notre container : | ||
- | <code bash>beaver@home:~$ sudo lxc-ls --fancy | + | <code bash>beaver@mysweethome:~$ sudo lxc-ls --fancy |
NAME STATE AUTOSTART GROUPS IPV4 IPV6 | NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
container_xenial RUNNING 0 - 10.0.3.58 - | container_xenial RUNNING 0 - 10.0.3.58 - | ||
Ligne 104: | Ligne 105: | ||
</code> | </code> | ||
- | <code bash>beaver@home:~$ ssh ubuntu@10.0.3.58 | + | <code bash>beaver@mysweethome:~$ ssh ubuntu@10.0.3.58 |
ubuntu@10.0.3.58 password: mot de passe **ubuntu** par défaut. | ubuntu@10.0.3.58 password: mot de passe **ubuntu** par défaut. | ||
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-130-generic x86_64) | Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-130-generic x86_64) | ||
Ligne 126: | Ligne 127: | ||
<code bash> | <code bash> | ||
- | beaver@home:~$ sudo lxc-console -n container_xenial | + | beaver@mysweethome:~$ sudo lxc-console -n container_xenial |
- | [sudo] Mot de passe de beaver : | + | [sudo] Mot de passe de beaver : |
Connected to tty 1 | Connected to tty 1 | ||
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | ||
Ligne 159: | Ligne 160: | ||
<code bash>sudo lxc-stop -n container_xenial</code> | <code bash>sudo lxc-stop -n container_xenial</code> | ||
- | Et ensuite, nous passons à la destruction : | + | Et ensuite, nous passons à la destruction : |
<code bash>sudo lxc-destroy -n container_xenial</code> | <code bash>sudo lxc-destroy -n container_xenial</code> | ||
Ligne 167: | Ligne 168: | ||
===== Configuration de LXC pour une utilisation unprivileged ===== | ===== Configuration de LXC pour une utilisation unprivileged ===== | ||
- | Pour pouvoir utiliser [[apt>lxc|LXC]] sans [[sudo|sudo]], et donc par conséquent, minimiser le risque qu'un attaquant arrive à avoir accès à votre [[wpfr>Hôte_(informatique)|hôte système]] à cause de l'utilisation de [[sudo|sudo]], nous allons déjà récupérer le **subgid** ainsi que le **subguid** de notre utilisateur courant : | + | Pour pouvoir utiliser [[apt>lxc|LXC]] sans [[sudo|sudo]], et donc par conséquent, minimiser le risque qu'un attaquant arrive à avoir accès à votre [[wpfr>Hôte_(informatique)|hôte système]] à cause de l'utilisation de [[sudo|sudo]], nous allons déjà récupérer le sub**g**id ainsi que le subg**u**id de notre utilisateur courant : |
<code bash> | <code bash> | ||
- | cat /etc/sub{g,u}id | grep $USER | + | grep -h $USER /etc/sub{g,u}id |
</code> | </code> | ||
Ligne 180: | Ligne 181: | ||
Veillez de garder en tête ces deux lignes, maintenant, nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service** : | Veillez de garder en tête ces deux lignes, maintenant, nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service** : | ||
- | <code bash>sudo systemctl stop lxc*.service</code> | + | <code bash>sudo systemctl stop lxcfs.service lxc-net.service lxc.service</code> |
Veuillez maintenant créer dans le [[wpfr>Fichier_et_répertoire_caché|dossier caché]] **.config/** un dossier portant le nom **lxc** : | Veuillez maintenant créer dans le [[wpfr>Fichier_et_répertoire_caché|dossier caché]] **.config/** un dossier portant le nom **lxc** : | ||
Ligne 206: | Ligne 207: | ||
Maintenant, nous [[:tutoriel:comment_modifier_un_fichier|modifions]] le fichier **lxc-usernet** dans **/etc/lxc**, et on y insère ça : | Maintenant, nous [[:tutoriel:comment_modifier_un_fichier|modifions]] le fichier **lxc-usernet** dans **/etc/lxc**, et on y insère ça : | ||
- | <code bash>nom_de_votre_utilisateur_hôte veth lxcbr0 2</code> | + | <code bash>nom_de_votre_utilisateur_hôte veth lxcbr0 10</code> |
Ou bien dans un [[terminal|terminal]]: | Ou bien dans un [[terminal|terminal]]: | ||
- | <code bash>echo $USER veth lxcbr0 2 | sudo tee --append /etc/lxc/lxc-usernet</code> | + | <code bash>echo $USER veth lxcbr0 10 | sudo tee --append /etc/lxc/lxc-usernet</code> |
[[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir nos containers LXC, et attribuons y les bonnes [[permissions|permissions]] : | [[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir nos containers LXC, et attribuons y les bonnes [[permissions|permissions]] : | ||
Ligne 238: | Ligne 239: | ||
<code bash>chmod a+x /home/$USER/</code> | <code bash>chmod a+x /home/$USER/</code> | ||
+ | |||
+ | Ou : | ||
+ | |||
+ | FIXME Dans notre exemple, le sub**u**id est **100000**. Veuillez le remplacer par le votre. Pour le récupérer, veuillez saisir :<code bash>cat /etc/subuid | grep $USER</code> | ||
+ | |||
+ | Et : | ||
+ | |||
+ | <code bash>cd $HOME && sudo setfacl -m u:100000:x . .local .local/share</code> | ||
À ce stade, il est préférable de redémarrer votre machine pour être certain, que les modifications apportées soient effectives : | À ce stade, il est préférable de redémarrer votre machine pour être certain, que les modifications apportées soient effectives : | ||
Ligne 255: | Ligne 264: | ||
<code bash> | <code bash> | ||
- | beaver@home:~$ lxc-create -t download -n container_unprivileged -- -d ubuntu -r xenial -a amd64 | + | beaver@mysweethome:~$ lxc-create -t download -n container_unprivileged -- -d ubuntu -r xenial -a amd64 |
Using image from local cache | Using image from local cache | ||
Unpacking the rootfs | Unpacking the rootfs | ||
Ligne 271: | Ligne 280: | ||
<code bash>lxc-ls --fancy</code> | <code bash>lxc-ls --fancy</code> | ||
- | <code bash>beaver@home:~$ lxc-ls --fancy | + | <code bash>beaver@mysweethome:~$ lxc-ls --fancy |
NAME STATE AUTOSTART GROUPS IPV4 IPV6 | NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
- | container_unprivileged STOPPED 0 - 10.0.3.42 - | + | container_unprivileged STOPPED 0 - 10.0.3.58 - |
</code> | </code> | ||
- | Vous noterez qu'il y'a ni mot de passe attribué, ni rien, impossible donc de se connecter à notre container **container_unprivileged** ni via la méthode [[ssh|ssh]], ni via la méthode **lxc-console**. Voici un moyen pour attribuer un mot de passe à l'utilisateur **ubuntu**. Nous allons déjà démarrer notre container fraîchement installé : | + | Vous noterez qu'il n'y a ni mot de passe attribué, ni rien, impossible donc de se connecter à notre container **container_unprivileged** ni via la méthode [[ssh|ssh]], ni via la méthode **lxc-console**. Voici un moyen pour attribuer un mot de passe à l'utilisateur **ubuntu**. Nous allons déjà démarrer notre container fraîchement installé : |
<code bash>lxc-start -n container_unprivileged</code> | <code bash>lxc-start -n container_unprivileged</code> | ||
Ligne 331: | Ligne 340: | ||
<code bash> | <code bash> | ||
- | beaver@home:~$ lxc-console -n container_unprivileged | + | beaver@mysweethome:~$ lxc-console -n container_unprivileged |
Connected to tty 1 | Connected to tty 1 | ||
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | ||
Ligne 357: | Ligne 366: | ||
<code bash>lxc-stop -n container_unprivileged</code> | <code bash>lxc-stop -n container_unprivileged</code> | ||
- | Et ensuite, nous passons à la destruction : | + | Et ensuite, nous passons à la destruction : |
<code bash>lxc-destroy -n container_unprivileged</code> | <code bash>lxc-destroy -n container_unprivileged</code> | ||
Ligne 379: | Ligne 388: | ||
Ou bien : | Ou bien : | ||
- | <code bash>cd /home/$USER/.local/lxc/nom_de_votre_container/</code> | + | <code bash>sudo -i && cd /home/$USER/.local/lxc/nom_de_votre_container/</code> |
- | Ensuite, nous utilisons la commande [[tar|tar]] avec son option **--numeric-owner**, qui est ici très importante. Elle va permettre de garder les **uid/gid** intactes lors de l'extraction. Nous utilisons aussi l'outil [[apt>gzip|gzip]] et son option **-9((--best-compression.))**, qui vous offrira, une compression maximale. | + | Ensuite, nous utilisons la commande [[tar|tar]] avec son option **%%--%%numeric-owner**, qui est ici très importante. Elle va permettre de garder les **uid/gid** intactes lors de l'extraction. Nous utilisons aussi l'outil [[apt>gzip|gzip]] et son option **-9((--best-compression.))**, qui vous offrira, une compression maximale. |
- | <code bash>export GZIP=-9 tar --numeric-owner -czvf mon_container.tar.gz ./*</code> | + | <code bash>GZIP=-9 tar --numeric-owner -czvf mon_container.tar.gz ./*</code> |
Vous voilà maintenant en possession d'un backup de votre container, passons maintenant à sa restauration. | Vous voilà maintenant en possession d'un backup de votre container, passons maintenant à sa restauration. | ||
Ligne 393: | Ligne 402: | ||
Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | ||
- | <code bash>sudo -i && systemctl stop lxc*.service</code> | + | <code bash>sudo -i && systemctl stop lxcfs.service lxc-net.service lxc.service</code> |
Il vous faudra ensuite [[:tutoriel:comment_modifier_un_fichier|créer un dossier]] portant le nom de votre container. | Il vous faudra ensuite [[:tutoriel:comment_modifier_un_fichier|créer un dossier]] portant le nom de votre container. | ||
Ligne 413: | Ligne 422: | ||
<code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | <code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | ||
- | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | + | C'est terminé, il n'y a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : |
- | <code bash>systemctl start lxc*.service && exit</code> | + | <code bash>systemctl start lxcfs.service lxc-net.service lxc.service && exit</code> |
Et démarrer ensuite votre container : | Et démarrer ensuite votre container : | ||
Ligne 423: | Ligne 432: | ||
=== Pour une utilisation unprivileged === | === Pour une utilisation unprivileged === | ||
- | <note tip>Nous aborderons ici, que la restauration de votre backup précédemment créé. | + | <note tip>Nous n'aborderons ici, que la restauration de votre backup précédemment créé. |
Pour la configuration d'un container [[apt>lxc|LXC]] **unprivileged**, merci de suivre le chapitre [[lxc#configuration_de_lxc_pour_une_utilisation_unprivileged|configuration de lxc pour une utilisation unprivileged]]. | Pour la configuration d'un container [[apt>lxc|LXC]] **unprivileged**, merci de suivre le chapitre [[lxc#configuration_de_lxc_pour_une_utilisation_unprivileged|configuration de lxc pour une utilisation unprivileged]]. | ||
</note> | </note> | ||
Ligne 429: | Ligne 438: | ||
Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | ||
- | <code bash>sudo systemctl stop lxc*.service</code> | + | <code bash>sudo systemctl stop lxcfs.service lxc-net.service lxc.service</code> |
[[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir notre container LXC, et attribuons y les bonnes [[permissions|permissions]] : | [[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir notre container LXC, et attribuons y les bonnes [[permissions|permissions]] : | ||
Ligne 448: | Ligne 457: | ||
<code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | <code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | ||
- | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | + | C'est terminé, il n'y a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : |
- | <code bash>sudo systemctl start lxc*.service</code> | + | <code bash>sudo systemctl start lxcfs.service lxc-net.service lxc.service</code> |
Et démarrer ensuite votre container : | Et démarrer ensuite votre container : | ||
Ligne 469: | Ligne 478: | ||
<code bash>sudo((container unprivileged ou non ?)) lxc-snapshot -n nom_de_mon_container</code> | <code bash>sudo((container unprivileged ou non ?)) lxc-snapshot -n nom_de_mon_container</code> | ||
- | <code bash>beaver@home:~$ sudo lxc-snapshot -n container_xenial | + | <code bash>beaver@mysweethome:~$ sudo lxc-snapshot -n container_xenial |
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3405 Snapshot of directory-backed container requested. | lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3405 Snapshot of directory-backed container requested. | ||
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3406 Making a copy-clone. If you do want snapshots, then | lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3406 Making a copy-clone. If you do want snapshots, then | ||
Ligne 479: | Ligne 488: | ||
<code bash>sudo((container unprivileged ou non?)) lxc-snapshot -L -n nom_de_mon_container</code> | <code bash>sudo((container unprivileged ou non?)) lxc-snapshot -L -n nom_de_mon_container</code> | ||
- | <code bash>beaver@home:~$ sudo lxc-snapshot -L -n container_xenial | + | <code bash>beaver@mysweethome:~$ sudo lxc-snapshot -L -n container_xenial |
snap0 (/var/lib/lxc/container_xenial/snaps) 2018:07:28 10:25:48 | snap0 (/var/lib/lxc/container_xenial/snaps) 2018:07:28 10:25:48 | ||
</code> | </code> | ||
Ligne 488: | Ligne 497: | ||
---- | ---- | ||
- | |||
- | ===== Création d'une image customisée LXC ===== | ||
- | |||
- | === Prérequis === | ||
- | |||
- | [[:tutoriel:comment_installer_un_paquet|Installez le paquet:]] [[apt>debootstrap|debootstrap]] ou [[apt>cdeboostrap|cdeboostrap]]. | ||
- | |||
- | ---- | ||
- | |||
- | <note> En cours --- //[[:utilisateurs:beaver|beaver]] Le 12/08/2018, 11:18//</note> | ||
- | |||
===== Voir aussi ===== | ===== Voir aussi ===== | ||
- | * [[https://www.youtube.com/watch?v=caXHwYC3tq8|3 premières minutes de cette vidéo explique ce qu'est lxc]] | + | * [[https://www.youtube.com/watch?v=caXHwYC3tq8|3 premières minutes de cette vidéo explique ce qu'est LXC]] |
- | * [[:LXD]] pour gérer les containers. [[:Docker]] décrit dans la vidéo citée précédemment n'utilise plus lxc. | + | * https://wiki.debian.org/LXC |
+ | * https://wiki.debian.org/EvgeniGolov/LXC | ||
+ | * https://askubuntu.com/questions/340055/lxc-container-no-outgoing-traffic | ||
+ | * https://lxc-webpanel.github.io/ | ||
---- | ---- | ||
Contributeur(s): [[:utilisateurs:beaver|BeAvEr]]. | Contributeur(s): [[:utilisateurs:beaver|BeAvEr]]. |