Aller au contenu

Installation lxc sur debian 8 ou 9:

Prérequis:

apt install lxc bridge-utils

Création de l'interface réseau bridge

Afin que les containers puissent communiquer avec le réseau local: (éditer le fichier /etc/network/interfaces)

 auto lo
 iface lo inet loopback

 auto eth0
 iface eth0 inet manual

 auto br0
 iface br0 inet static
 bridge_ports eth0
 address 192.168.1.254
 netmask 255.255.255.0
 gateway 192.168.1.1
 broadcast 192.168.1.255
 dns-nameservers 192.168.1.249
Afin de paramétrer le réseau avec un mtu de 9000 (jumbo frames), pour accélérer la copie de gros fichiers, il faut ajouter à la config réseau:

post-up ifconfig eth0 mtu 9000

Édition du fichier /etc/lxc/default.conf

Afin de gagner du temps pour la création d'un container d'un point de vu réseau

 lxc.network.type = veth                                      
 lxc.network.link = br0
 lxc.network.hwaddr = 00:3e:4d:xx:xx:xx
 lxc.network.flags = up

Pour la version 3 de LXC:

 lxc.net.0.type = veth
 lxc.net.0.link = br0
 lxc.net.0.flags = up
 lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
 **lxc.apparmor.profile = generated**
 **lxc.apparmor.allow_nesting = 1**
Important: Bien ajouter les lignes ci-dessus concernant apparmor ! Sinon il y a des soucis de droits sur les services systemd !

Création d'un container debian 9 par exemple

lxc-create -n debian-ct -t debian -- -a amd64 --release=stretch

Paramétrage réseau du conteneur

Il faudra éditer le fichier /var/lib/lxc/nom-du-conteneur/config

 lxc.network.type = veth
 lxc.network.link = br0
 lxc.network.hwaddr = 00:3e:4d:3f:ad:74
 lxc.network.flags = up
 lxc.network.ipv4 = 192.168.1.248/24 192.168.1.255
 lxc.network.ipv4.gateway = 192.168.1.1

Pour la version 3 de lxc:

 lxc.net.0.ipv4.address = 192.168.1.5/24 192.168.1.255
 lxc.net.0.ipv4.gateway = 192.168.1.1
  • Ajouter lxc.start.auto = 1 pour un démarrage auto du conteneur

  • Bien penser à éditer la config réseau "(/etc/network/interfaces)" du conteneur en mettant l'option manual pour l'attribution de l'adressage IP.

  • Ajouter si nécessaire l'adresse du serveur dns dans le fichier "/etc/resolv.conf du conteneur"

Monter un répertoire de la machine hôte (host) dans un conteneur

Il faudra utiliser l'option lxc.mount.entry dans le fichier de configuration du container

lxc.mount.entry=/export/library mnt/montage-perso none bind 0 0
  • On peut rajouter l'option rw "ex: ...none bind,rw" afin d'obtenir les droits de lire et écrire à l'intérieur du container
  • Avec l'option create=dir, on peut créer le répertoire à l'intérieur du container sans le créer manuellement

ex:

lxc.mount.entry=/export/library mnt/montage-perso none bind,create=dir 0 0

Passthrough d'un périphérique usb

Pour monter un périphérique usb dans un container lxc, ça se passe là aussi dans le fichier de configuration du conteneur:

  • Exemple pour un tuner tnt usb:
 lxc.cgroup.devices.allow = c 212:* rwm
 lxc.mount.entry = /dev/dvb dev/dvb none bind,optional,create=dir

ps: Un lien vers une vidéo (allemand) https://www.youtube.com/watch?v=5ipAI-iee8I

Du changement dans LXC V3.0

Changement de syntaxe dans les fichiers de configuration des containers à partir de la version 3 de LXC

Pour modifier les fichiers de config pour chaque container, un script a été créée, il suffit de faire:

lxc-update-config -h|--help [-c|--config]

exemple:

lxc-update-config -c tv-ct

La nouvelle syntaxe, pour la version 3 de lxc resemble à ça:

Legacy Key (removed from LXC master) | New Key                       |
-------------------------------------|-------------------------------|
lxc.aa_profile                       | lxc.apparmor.profile          |
lxc.aa_allow_incomplete              | lxc.apparmor.allow_incomplete |
lxc.console                          | lxc.console.path              |
lxc.devttydir                        | lxc.tty.dir                   |
lxc.haltsignal                       | lxc.signal.halt               |
lxc.id_map                           | lxc.idmap                     |
lxc.init_cmd                         | lxc.init.cmd                  |
lxc.init_gid                         | lxc.init.gid                  |
lxc.init_uid                         | lxc.init.uid                  |
lxc.limit                            | lxc.prlimit                   |
lxc.logfile                          | lxc.log.file                  |
lxc.loglevel                         | lxc.log.level                 |
lxc.mount                            | lxc.mount.fstab               |
lxc.network                          | lxc.net                       |
lxc.network.                         | lxc.net.[i].                  |
lxc.network.flags                    | lxc.net.[i].flags             |
lxc.network.hwaddr                   | lxc.net.[i].hwaddr            |
lxc.network.ipv4                     | lxc.net.[i].ipv4.address      |
lxc.network.ipv4.gateway             | lxc.net.[i].ipv4.gateway      |
lxc.network.ipv6                     | lxc.net.[i].ipv6.address      |
lxc.network.ipv6.gateway             | lxc.net.[i].ipv6.gateway      |
lxc.network.link                     | lxc.net.[i].link              |
lxc.network.macvlan.mode             | lxc.net.[i].macvlan.mode      |
lxc.network.mtu                      | lxc.net.[i].mtu               |
lxc.network.name                     | lxc.net.[i].name              |
lxc.network.script.down              | lxc.net.[i].script.down       |
lxc.network.script.up                | lxc.net.[i].script.up         |
lxc.network.type                     | lxc.net.[i].type              |
lxc.network.veth.pair                | lxc.net.[i].veth.pair         |
lxc.network.vlan.id                  | lxc.net.[i].vlan.id           |
lxc.pts                              | lxc.pty.max                   |
lxc.rebootsignal                     | lxc.signal.reboot             |
lxc.rootfs                           | lxc.rootfs.path               |
lxc.se_context                       | lxc.selinux.context           |
lxc.seccomp                          | lxc.seccomp.profile           |
lxc.stopsignal                       | lxc.signal.stop               |
lxc.syslog                           | lxc.log.syslog                |
lxc.tty                              | lxc.tty.max                   |
lxc.utsname                          | lxc.uts.name                  |

Fonctionnement avec zerotier ou openvpn

Il faudra ajouter les lignes suivantes au fichier de configuration du container (/var/lib/ct/config), afin d'autoriser le container à utiliser les cartes réseaux virtuels:

 lxc.cgroup.devices.allow = c 10:200 rwm
 lxc.hook.autodev = sh -c "modprobe tun; cd ${LXC_ROOTFS_MOUNT}/dev; mkdir net; mknod net/tun c 10 200; chmod 0666 net/tun"
Il pourrait être nécessaire de préciser cgroups en version 2 si jamais zerotier ou un programme de vpn ne démarre pas dans un lxc, comme ceci:

lxc.cgroup2.devices.allow = c 10:200 rwm lxc.hook.autodev = sh -c "modprobe tun; cd ${LXC_ROOTFS_MOUNT}/dev; mkdir net; mknod net/tun c 10 200; chmod 0666 net/tun" Site pour fonctionnement avec zerotier: https://forum.level1techs.com/t/zerotier-in-lxc-proxmox/155515/2

Site de référence pour les modification de la v3: https://lists.linuxcontainers.org/pipermail/lxc-users/2018-February/014041.html

Site intéressant 1: https://www.linuxembedded.fr/2013/07/configuration-reseau-de-lxc/

Site intéressant 2: https://debian-facile.org/doc:autres:vm:lxc:reseau-bridge

Site intéressant 3: https://askubuntu.com/questions/743620/where-is-the-configuration-file-of-a-lxc-container