LXC sur Debian Jessie

ven. 03 mars 2017 by Marmotte

LXC, pour Linux Containers, permet de lancer plusieurs environnements Linux sur une même machine, de manière isolée, comme le fait OpenVZ. Par rapport à des machines virtuelles, les performances sont donc bien meilleures, puisque les différents systèmes fonctionnent directement sur le noyau, sans couche de virtualisation intermédiaire. Cela implique aussi qu'on ne peut pas utiliser d'autre système que Linux dans LXC.

Il y a plusieurs manières de mettre en place des containers LXC. Dans cette note, j'explique comment mettre en place des containers connectés à l'hôte par une interface réseau bridge virtuelle, et installés dans des sous-volumes BTRFS.

Attention : N'ayant encore jamais configuré de machine en utilisant le protocole IPv6, cette note d'installation se limite pour le moment à IPv4.

Note : Cet article est une mise à jour de celui qui expliquait la mise en place de LXC sur Debian Wheezy.

Différences avec l'article sur la mise en place sur Debian Wheezy

Les principales différences ici sont :

  • Utilisation du système de fichiers BTRFS au lieu de lvm+ext4.
  • Configuration des adresses IP des containers de manière statique, plutôt que d'utiliser un serveur DHCP local.
  • Configuration de l'interface bridge en utilisant les outils de la suite systemd, plutôt que bridge-utils.

Préparation du système hôte

Installation

Sous Debian, il faut installer les paquets suivants :

$ sudo apt-get install --no-install-recommends lxc debootstrap rsync openssl iptables-persistent

Note : Le paquet iptables-persistent permet de charger automatiquement des règles iptables lors du démarrage de la machine. Cela nous servira pour définir les règles de NAT indispensables pour permettre la communication entre les containers et l'extérieur.

Note : Les paquets rsync et openssl sont nécessaires, puisqu'ils sont utilisés dans le script de création de containers debian.

Configuration du réseau

La configuration du réseau au niveau du système hôte se fait en trois étapes :

  • Création des interfaces bridge, sur lesquels les containers se connecteront
  • Autorisation du NAT, afin de permettre aux containers de dialoguer avec l'extérieur du serveur

Création des interfaces bridge

La configuration de l'interface bridge se fait par la création de deux fichiers.

Il faut tout d'abord un nouveau périphérique virtuel, de type bridge, dans le fichier /etc/systemd/network/10-lxcbr0.netdev :

[NetDev]
Name=lxcbr0
Kind=bridge

Une fois ce périphérique déclaré, il faut lui attribuer une adresse IP, dans le fichier /etc/systemd/network/10-lxcbr0.network. On en profite pour activer le routage sur cette interface, avec le paramètre IPForward.

[Match]
Name=lxcbr0

[Network]
Address=10.0.0.254/24
IPForward=yes

Note : S'il doit y avoir plusieurs réseaux LXC différents, il faut ajouter une interface bridge par réseau, en adaptant le nom des interfaces (brX), et les adresses IP.

Il faut ensuite redémarrer le service systemd-networkd pour prendre les modifications en compte.

Autorisation du NAT

Pour permettre les connexions sortantes des containers, il faut ajouter une règle MASQUERADE, dans le fichier /etc/iptables/rules.v4.

-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

Note : L'interface eth0 est ici l'interface par laquelle sortiront les requêtes des containers vers l'extérieur du serveur.

Pour activer cette règle iptables, il suffit de lancer le script iptables-persistent.

$ sudo iptables-restore < /etc/iptables/rules.v4

Création d'un container

Le script de création de containers peut prendre un fichier de configuration en paramètre. Le contenu de ce fichier est ajouté au fichier de configuration du container pendant l'installation. Cela permet de prédéfinir une partie de la configuration.

Dans le fichier de configuration de base, je mets habituellement la configuration réseau, qui est absente du fichier de configuration par défaut, puisqu'elle diffère selon la manière de gérer le réseau dans les containers. Dans ce fichier, il faut principalement modifier la configuration réseau du container (interface bridge utilisée, adresse IP, adresse de la passerelle, etc.).

lxc.start.auto = 1
lxc.network.type = veth
lxc.network.name = veth0
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.ipv4 = 10.0.0.1/24
lxc.network.ipv4.gateway = 10.0.0.254

Note : Si vous avez oublié d'ajuster les paramètres dans ce fichier avant de créer le container, il est bien sûr possible de modifier le fichier de configuration du container après son installation.

Nous pouvons maintenant lancer la création du container proprement dite.

Attention : Il ne faut pas mettre d'underscore dans le nom du container. Je ne sais pas si c'est le résultat d'un bug, mais quand j'ai essayé, les containers dont le nom contenait un underscore étaient inutilisables.

$ sudo lxc-create -t debian -n <container-name> -f <BaseConfigFilePath> -B btrfs

Note : La valeur à donner au paramètre -t est le nom du template, sans le préfix lxc-.

Note : Un sous-volume BTRFS nommé rootfs, et placé dans le répertoire /var/lib/lxc/<container-name>/, sera créé pour chaque container.

Une fois le container créé, vous pouvez vérifier la configuration, qui se trouve dans le fichier /var/lib/lxc/<container-name>/config, et l'adapter si nécessaire.

La dernière étape consiste à créer un utilisateur dans le système du container. Pour cela, il faut le démarrer, puis ouvrir un shell dans ce container.

$ sudo lxc-start -n <container-name> -d
$ sudo lxc-attach -n <container-name>
(container) # adduser <username>

Configurations supplémentaires

  • Pour rediriger un port du serveur vers une machine LXC, il suffit d'ajouter une règle de DNAT dans le fichier /etc/iptables/rules.v4.
  • Dans le cas de plusieurs réseaux LXC, s'ils ne doivent pas pouvoir se contacter entre eux, il est possible de bloquer les communications avec de simples règles iptables, dans le fichier /etc/iptables/rules.v4.

    -A FORWARD -i br0 -o br1 -j DROP
    -A FORWARD -i br1 -o br0 -j DROP
    

    Attention : Il faut bien bloquer les paquets dans les deux sens. Bloquer la réponse à une requête n'empêche pas le traitement de cette requête par le serveur qui la recevrait.

Manipulation des containers

LXC propose quelques commandes permettant de manipuler les containers. J'ai présenté la commande lxc-create dans la partie précédente, qui permet de créer des containers. Ce paragraphe passe en revue les autres commandes lxc souvent utilisées.

Démarrage

Comme montré précédemment, la commande permettant de démarrer un container est lxc-start.

$ sudo lxc-start -n <container-name> -d

Note : Le paramètre -d démarre le container en mode démon. Sans ce paramètre, le container démarrera dans le shell courant, et il y sera lié. La fermeture du shell entraînera donc l'arrêt du container.

Arrêt

Un container peut être arrêté, simplement en utilisant la commande lxc-stop.

$ sudo lxc-stop -n <container-name>

Destruction

La destruction d'un container avec la commande lxc-destroy est définitive. Dans le cas de l'utilisation de sous-volumes BTRFS, elle supprime aussi le sous-volume du container.

$ sudo lxc-destroy -n <container-name>

Ouverture d'un terminal dans le container

Lorsque le container ne répond plus sur le réseau, il peut être utile d'y ouvrir un terminal, pour inspecter, et corriger, les problèmes. Cela se fait avec la commande lxc-attach.

$ sudo lxc-attach -n <container-name>

Installer Debian Jessie avec debootstrap

ven. 03 mars 2017 by Marmotte

Sur la plupart de mes machines, j'utilise la version stable de Debian, soit Jessie actuellement. J'explique ici la manière dont j'installe un système avec Debootstrap.

Note : Cet article est une mise à jour de celui qui expliquait l'installation de Debian Wheezy.

Pourquoi ne pas utiliser l'installeur Debian ?

L'installeur ajoute …

read more

Migration du SheevaPlug de Debian Wheezy vers Jessie

sam. 27 févr. 2016 by Marmotte

Après la migration du système Debian Wheezy vers Jessie sur mon SheevaPlug, j'ai eu la mauvaise surprise de me rendre compte que le système ne démarrait plus.

J'explique ici l'origine du problème qui l'empêchait de démarrer, ainsi que la solution que j'ai appliquée pour le corriger.

L'erreur

Après quelques dizaines …

read more