===== Installation du système de virtualisation lxc (linux containers) ===== {{:systeme:lxc.png?nolink&80 |}}Voyons comment fonctionne LXC, qui est un système de virtualisation utilisant l'isolation... \\ \\ ~~READMORE~~ ==== Qu’est ce que LXC ? ==== Wikipedia le fait très bien. Voici la définition de LXC : //**LXC**, contraction de l’anglais Linux Containers1 est un système de 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 et une plus ou moins grande partie du système hôte. 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.\\ Ce système est similaire aux autres systèmes de virtualisations au niveau du système d'exploitation comme openVZ, Linux-VServer sur Linux ou comme les BSD jails de FreeBSD, ou encore les zones Solaris.\\ LXC repose sur les fonctionnalités des Cgroups du noyau Linux disponibles depuis la version 2.6.24 du noyau. Il repose également sur d'autres fonctionnalités de cloisonnement comme le cloisonnement des espaces de nommage du noyau, permettant d'éviter à un système de connaître les ressources utilisées par le système hôte ou un autre conteneur.\\// ==== Installation ==== Paquets requis pour l'installation apt-get install lxc Paquets optionnels pour l'installation apt-get install bridge-utils libvirt-bin debootstrap LXC est maintenant installé. \\ Voici, comment tester la configuration.\\ lxc-checkconfig Kernel config /proc/config.gz not found, looking in other places... Found kernel config file /boot/config-3.2.0-4-amd64 --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled --- Control groups --- Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabled Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig tous doit être au vert. ==== Création d'un conteneur LXC : ==== LXC vient avec des Templates, c'est à dire des scripts permettant l'installation simple d'un système. Il en existe pour Debian, Archlinux, Fedora, OpenSuse et Ubuntu. Création d'un conteneur avec le système debian jessie : lxc-create -n MyName -t debian -- -r jessie **-n** : définit le nom de votre conteneur \\ **-t** : définit votre template\\ ** -- -r jessie** : Cela passera les options ''-r jessie'' comme arguments au template ''debian''.\\ Pour afficher la liste des options prises en charge par le template, vous pouvez faire : lxc-create -t debian -h Dans mon exemple je suis partie sur le template ''debian''. ==== Configuration du conteneur ==== Le fichier est situé dans ''/var/lib/lxc/MyName/config'' et il pourrait ressembler à ça : **MyName** dans le chemin est le nom de votre conteneur lxc.utsname = MyName lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.name = lxcnet0 lxc.network.hwaddr = 00:FF:AA:00:00:01 lxc.network.ipv4 = 192.168.1.6/24 lxc.network.ipv4.gateway = 192.168.1.1 lxc.start.auto = 1 lxc.arch = amd64 lxc.mount = /var/lib/lxc/MyName/fstab lxc.include = /usr/share/lxc/config/debian.common.conf lxc.rootfs = /var/lib/lxc/MyName/rootfs lxc.kmsg = 0 **lxc.utsname** : définit le nom de votre conteneur **lxc.network.type** : définit le type de virtualisation réseau à utiliser pour votre conteneur.\\ Plusieurs type sont possible : * **none** : Le conteneur se partagera l'espace de noms réseau de l'hôte. * **veth** : création d'une interface Ethernet virtuelle avec un coté affecté au conteneur et l'autre attaché à un pont spécifié par l'option ''lxc.network.link'' * **vlan** : Une interface vlan est liée à l'interface spécifiée par ''lxc.network.link'' et affectée au conteneur.\\ L'identifiant vlan est spécifié avec l'option ''lxc.network.vlan.id'' * **macvlan** : Une interface ''macvlan'' est liée à l'interface spécifiée par ''lxc.network.link'' et affectée au conteneur * **phys** : une interface existant est assigné au conteneur par ''lxc.network.link'' **lxc.network.flags** : définit une action à faire pour le réseau ''up'' permet d'activer l'interface\\ **lxc.network.link** : définit l'interface qui va être utilisé sur votre hôte\\ **lxc.network.name** : Nom de l’interface réseau dans le conteneur\\ **lxc.network.hwaddr** : L'adresse MAC de l'interface est allouée dynamiquement par défaut à l'interface virtuelle, mais dans certains cas, ceci est nécessaire pour résoudre un conflit d'adresse MAC ou pour avoir toujours la même adresse ipv6 locale de lien. \\ **lxc.network.ipv4** : assigne une adresse IPV4 à l'interface virtuelle\\ **lxc.network.ipv4.gateway** : définit l'adresse IPV4 qui est utilisé comme passerelle par défaut, celle-ci sera inséré dans le conteneur\\ **lxc.start.auto** : définit si le conteneur doit être démarrer automatiquement, 0 = éteint et 1 = allumé\\ **lxc.arch ** : définit l'architecture du conteneur les options valide sont : x86, i686, x86_64, amd64\\ **lxc.mount** : définit l'endroit ou se situe le fichier contenant les information de montage au format''fstab''\\ **lxc.include** : spécifie le fichier a inclure, le fichier inclue peut être dans le même format de configuration lxc.\\ **lxc.rootfs** : spécifie le chemin du système de fichier du conteneur\\ **lxc.kmsg** : Définissez cette valeur sur 1 pour activer les Liens symboliques ''/dev/kmsg''.\\ ==== Configuration réseau ==== Comme vu dans le fichier de configuration, nous avons choisis une interface bridge comme lien avec le réseau.\\ Donc nous devons créer cette interface de pont. Dans le fichier ''/etc/network/interfaces'' de l’hôte Requiert le paquet ''bridge-utils''. auto br0 iface br0 inet static bridge_ports eth0 bridge_fd 0 bridge_stp off bridge_maxwait 0 address 192.168.1.20 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.254 # les options dns-* sont implémentées par le paquet resolvconf package, si installé dns-nameservers 192.168.1.1 192.168.1.2 dns-search ksh-linux.info Relancez les connections réseaux: /etc/init.d/networking restart L’interface Ethernet virtuelle ''veth'' accède au réseau via le bridge créé sur l’hôte.\\ Par défaut, le container n’est pas visible en dehors de l'hôte.\\ Je vais vous montrez comment mettre à disposition de vos utilisateurs un conteneur:\\ **C'est un exemple, il y plusieurs possibilité** \\ Nous devons activer le routage sur le serveur:\\ la première méthode, vous permet d'activer le routage instantanément, mais au premier redémarrage cela ne tiendra pas. echo 1 > /proc/sys/net/ipv4/ip_forward Pour que ce soit fait à chaque démarrage : vim /etc/sysctl.conf puis dé-commenter la ligne suivante : net.ipv4.ip_forward=1 ensuite nous pouvons masquer l'IP et rediriger le trafic de notre interface ''192.168.1.20'' vers notre conteneur ''192.168.1.5'' : iptables -t nat -A POSTROUTING -s 192.168.1.5 -o br0 -j MASQUERADE iptables -t nat -A PREROUTING -d 192.168.1.20/32 -j DNAT --to-destination 192.168.1.5 ==== Administrer vos conteneur LXC ==== **Démarrer un container : ** lxc-start -n MyName -d **-n**: indique le nom de votre conteneur **-d**: pour lancer le conteneur comme un daemon sans l'option **-d**, il ne sera pas possible de sortir du conteneur **Démarrage automatique de lxc, et donc de vos conteneur :** systemctl enable lxc ou update-rc.d lxc defaults ajouter cela dans le fichier de configuration de vos conteneurs: lxc.start.auto = 1 **Se connecter au conteneur : ** lxc-console -n MyName pour en sortir faire ctrl+a puis q **Arrêter un conteneur : ** lxc-stop -n MyName **Mettre en pause un conteneur : ** lxc-freeze -n MyName **Sortir de pause un conteneur : ** lxc-unfreeze -n MyName **Détruire un conteneur : ** lxc-destroy -n MyName **Lister les conteneurs : ** lxc-ls **Afficher l’état (démarré/arrêté/en pause) et l’IP de tous les conteneurs : ** lxc-ls --fancy ou lxc-ls -f **Afficher des informations sur un conteneur : ** lxc-info -n MyName **Purger le cache d’une image : ** /usr/share/lxc/templates/lxc-debian --clean