Virtualisation domestique – Tutoriel DEBIAN 9 (KVM et LXC) – Dernière Partie

Jeudi, 02 Août 2018 06:00 Okimi
Imprimer
Note des utilisateurs: / 11
MauvaisTrès bien 

Après avoir vu précédemment comment créer une machine virtuelle Debian 9 (Stretch) avec KVM dans Proxmox, je vais vous montrer une autre facette de Proxmox : la possibilité de créer des conteneurs (CT) Linux avec LXC.

 

 

Différences entre machine virtuelle KVM et conteneur LXC :

Proxmox est avant tout un hyperviseur mais il est aussi capable de travailler en isolateur. Comme je vous l'ai déjà expliqué dans l'article 2 sur la définition des différents modes de virtualisation, l'isolateur va utiliser une partie du système d'exploitation de l'hôte pour faire tourner chaque conteneur comme une simple application, isolée des autres processus de l'ordinateur.

En théorie, un conteneur étant étroitement lié au noyau Linux de l'hôte, il devrait être plus rapide qu'une machine virtuelle. En pratique l'utilisation d'un conteneur plutôt qu'une machine virtuelle sous Proxmox va effectivement apporter un gain de performances pour l'application virtualisée mais ne vous attendez pas à un écart conséquent.
Je vous invite d'ailleurs à lire l'article de Patrick Dufresne qui a comparé les performances de LXC et KVM sur un serveur puissant (2x intel Xeon E5620 4c/8t @ 2.4 Ghz) : http://www.patrikdufresne.com/fr/proxmox-kvm-vs-lxc/

Sur un petit serveur domestique, LXC vous apportera surtout une économie appréciable au niveau des ressources CPU et mémoire consommées sur l'hôte. Voici à titre indicatif le résumé Proxmox d'une machine virtuelle KVM et d'un conteneur LXC fraichement installés et mis à jour avec Debian 9.4 :

Certes 4 à 5% d'économie CPU ce n'est pas énorme mais multiplié par le nombre de VM remplacées par un conteneur, ce n'est pas négligeable. Et coté mémoire il n'y a pas photo. Attention, mon comparatif est très sommaire et ne reflète pas forcément l'usage qui sera fait par la suite de Debian.

A la vue de ces chiffres, vous allez me dire : conteneur, conteneur, conteneur !  Seulement voilà, tout n'est pas parfait. S'il y a de nombreux avantages à utiliser des conteneurs LXC sous Proxmox plutôt que des VM, il y a aussi des contraintes, et pas des moindres.


Les avantages :

- Moins de ressources consommées sur l'hôte (CPU, mémoire, espace disque).
- Gain de performance pour l'application.
- Interface réseau plus facile à paramétrer.
- Gestion de la mémoire allouée plus simple et modifiable à chaud.

Les contraintes :

- Seul un système Linux pourra être conteneurisé (c'est la base mais je préfère le redire).
- Faible sécurité due à la dépendance du conteneur au noyau système de l'hôte.
- Assignation d'un périphérique USB au conteneur complexe et parfois impossible.
- Assignation d'un disque physique très difficile et même déconseillée par Proxmox.
- Pas de lecteur CD et donc pas de boot possible sur une image ISO.
- Pas de clonage possible. Il faut passer par une sauvegarde et une restauration.
- Pas de migration possible du conteneur vers un autre logiciel de virtualisation.

La faiblesse de sécurité de la conteneurisation, est un point important à ne pas négliger. Un conteneur utilise une partie du noyau système de l'hôte et de ce fait est étroitement lié à lui. Une erreur ou une attaque sur un conteneur risquent donc de se répercuter à tout le serveur. Pour limiter le risque il faut définir le conteneur en "non privilégié" (unprivileged) au moment de sa création. Le conteneur n'aura alors plus les droits superutilisateur Root pour accéder à l'hôte ce qui va limiter ou compliquer certaines utilisations.


Quand peut-on utiliser un conteneur LXC :


Deux points importants peuvent vous aider à choisir entre la virtualisation KVM et la conteneurisation LXC : la sécurité et le stockage. Si l'un des deux est un critère important pour vous, optez pour la virtualisation KVM.

Jeedom et Domoticz fonctionnent sur conteneur "unprivileged" (Domoticz sur Debian 8 pour le moment) mais le passage des périphériques USB est plus complexe voire parfois impossible notamment pour les dongles Bluetooth. Je détaillerai la procédure pour une clé Z-Wave et une clé 3G, à la fin de cet article.
Plus généralement vous pouvez installer sur un conteneur, de préférence non privilégié pour améliorer la sécurité, des services Linux n'ayant pas besoin d'accéder à un espace de stockage de l'hôte autre que celui défini à la création du conteneur, comme par exemple un serveur LAMP (Apache, MySQL ou MariaDB, PHP) ou des serveurs DHCP (réseau), Mail, SMS, NUT (onduleur), etc..


LXC – Création d'un conteneur non privilégié Debian 9.4 :


Pour créer un conteneur sous Proxmox, vous devez commencer par télécharger un template. C'est un système Linux pré-configuré qui va servir de base à sa création.

Pour récupérer un template Debian 9, rendez-vous sur un espace de stockage de votre serveur Proxmox (par exemple local) et cliquez sur l'onglet Templates.
Choisissez le paquet  LXC debian-9.0-standard et téléchargez-le.

Vous pouvez maintenant commencer à créer le conteneur en cliquant sur Créer CT en haut à droite de l'interface. Comme pour une VM, donnez un numéro ID et un nom au conteneur. Mais en plus vous devez renseigner un mot de passe pour le compte superutilisateur Root et cocher la case Unprivileged container pour améliorer la sécurité du conteneur et du serveur.

Dans l'onglet Modèle, choisissez l'espace de stockage et le template de Debian 9.

Définissez ensuite la taille du disque Root. Pour la plupart des applications 4 Go suffisent. Vous pourrez facilement augmenter l'espace disque par la suite en cas de besoin.

Renseignez le nombre de cœur du CPU de l'hôte que vous souhaitez affecter au conteneur,

et la part de mémoire vive et Swap que vous voulez lui réserver. Tenez compte que le Swap du conteneur est déduit de la partition Swap de l'hôte.

Dans l'onglet Réseau donnez un nom à l'interface (par exemple eth0 pour la première interface Ethernet) et rentrez une adresse IP v4 pour le conteneur au format CIDR (où /24 correspond à un masque de sous-réseau 255.255.255.0) et l'adresse de la passerelle.

Passez l'étape suivante sauf si vous souhaitez utiliser un DNS différent de celui de l'hôte.

Le dernier onglet résume les paramètres de création du conteneur.

Une fois validé, Proxmox va générer le conteneur à partir du template. Le conteneur Debian 9 est maintenant exploitable mais vous allez vite vous apercevoir que le système est en anglais. Pour remédier à ce petit problème linguistique, tapez la commande suivante (connexion console VNC en superutilisateur root) :   dpkg-reconfigure locales

Sélectionnez ensuite la ligne fr_FR.UTF-8 UTF-8 en appuyant sur la barre d'espace de votre clavier puis sur tabulation pour atteindre la case Ok et Entrée pour valider. A l'étape suivante sélectionnez fr_FR.UTF-8.

Sur le même principe, vous devrez aussi modifier la zone géographique qui sert à définir le fuseau horaire.
Tapez dpkg-reconfigure tzdata et choisissez Europe puis Paris.


Je vous conseille également de modifier les sources de téléchargement des paquets. Pour cela éditez le fichier sources.list avec la commande suivante :  nano /etc/apt/sources.list

Sur les 2 premières lignes ajoutez .fr après ftp puis enregistrez en tapant CTRL et O et quittez en tapant CTRL et X.

Tapez ensuite la commande ci-dessous pour mettre à jour le système dans la dernière version :

apt-get update && apt-get dist-upgrade -y

Vous pouvez vérifier la version de Debian en tapant la commande cat /etc/debian_version ou uname –a pour connaitre la version du kernel.

Dernier point qui va vous permettre de vous retrouver pratiquement avec la même configuration que l'installation KVM de Debian 9 : la création d'un utilisateur "non-root". En effet le template Debian 9 ne contient pas d'utilisateur pré-créé (ce qui est assez logique) et il est quasi indispensable d'en disposer d'un, ne serait-ce que pour se connecter en SSH avec Putty (accès root désactivé par défaut).
Tapez adduser suivi du nom de l'utilisateur à créer et renseignez au minimum son mot de passe.

Votre conteneur est désormais configuré.





Installation de Jeedom (sur conteneur LXC unprivileged) :


La procédure d'installation sur un conteneur LXC Debian 9 (privilégié ou non) est la même que pour une machine virtuelle KVM. Une fois connecté avec le compte superutilisateur root à votre conteneur Debian 9 et après avoir mis à jour le système, tapez ces commandes pour télécharger le script d'installation de Jeedom, le rendre exécutable et l'exécuter :

wget https://raw.githubusercontent.com/jeedom/core/stable/install/install.sh
chmod +x install.sh
./install.sh


Vous pouvez personnaliser l'installation avec les options suivantes : -w = dossier webserver
-z = installation dépendances Z-Wave   -m = mot de passe root mysql désiré.
Exemple :   ./install.sh -w /var/www/html -z -m Jeedom

Jeedom est ensuite accessible en tapant l'adresse IP de la machine virtuelle dans un navigateur Internet. Normalement par défaut le nom d'utilisateur est admin et le mot de passe admin. Mais ne me demandez pas pourquoi, dans le cas d'une installation de Jeedom sur un conteneur LXC, il faut taper le nom d'utilisateur en majuscule, soit ADMIN. Le mot de passe reste admin (en minuscule).

Vous retrouverez la procédure d'installation sur la documentation officielle (dernière rubrique Autres) : https://jeedom.github.io/documentation/installation/fr_FR/#tocAnchor-1-27 et je vous invite à lire également la page https://jeedom.github.io/documentation/premiers-pas/fr_FR/index pour une première prise en main.



Installation de Domoticz :


Que ce soit sur machine virtuelle KVM ou sur conteneur LXC, si vous tentez actuellement d'installer Domoticz sur Debian 9 vous rencontrerez un problème de connexion à l'interface, alors que sur la dernière version de Raspian (Raspberry Pi) Domoticz fonctionne très bien.
Je vous conseille donc, en attendant que le problème soit solutionné, d'installer Domoticz sur un conteneur Debian 8 (Jessie), la procédure étant la même que pour Debian 9, et de taper ces 2 commandes pour installer ensuite Domoticz :

apt-get install curl
curl -L install.domoticz.com | bash
La documentation est disponible sur le wiki : https://www.domoticz.com/wiki/Main_Page



Rattachement d'un périphérique USB au conteneur :


Comme je vous le disais précédemment, 3 ou 4 clics de souris ne vont pas suffire, comme pour une machine virtuelle KVM, pour rattacher un périphérique USB à votre conteneur. Vous allez devoir mettre les mains dans le cambouis.

Pour ce tutoriel, j'ai refait l'installation de Jeedom 3 sur un conteneur LXC unprivileged et j'ai branché sur mon serveur Q1900 une clé Z-Wave Plus Aeotec Z-Stick Gen5 et une clé modem 2G/3G HSDPA compatible gammu (reconnue comme un modem Huawei E169).

Commencez par vous connecter en SSH à votre serveur hôte (avec Putty ou le Shell de Proxmox) avec le compte superutilisateur root. Tapez la commande lsusb pour lister les périphériques USB présents et  lsusb -t pour les voir sous forme d'arborescence matérielle. Normalement les utilitaires USB, dont fait partie lsusb, sont déjà installés sur Proxmox mais en cas de commande inconnue tapez apt-get update && apt-get install usbutils –y pour les installer.

Mon serveur Q1900 dispose de 4 prises USB 2.0 et 4 prises USB 3.0 où sont déjà raccordés 2 disques 3.5" montés dans des boitiers Orico USB 3.0. J'ai connecté la clé Z-Wave sur une prise USB 2.0 mais j'ai préféré utiliser un port USB 3.0 pour brancher la clé 3G, souvent plus énergivore. Les ports USB 3.0 délivrent en effet 900mA contre 500mA maximum pour un port USB 2.0.

Ma clé Z-Wave apparait donc sur le bus 1 (port 2.1) et porte le numéro device 5. Ma clé 3G apparait sur le bus 1 (port 1.3) et porte le numéro device 12. Ces numéros sont bien sûr propres à mon serveur et seront certainement différents sur le votre. Pour vous faciliter la recherche, je vous conseille de ne brancher qu'un périphérique USB à la fois.

Un 2ème critère rentre en compte dans la détection et le rattachement de la clé USB : le port série (tty) affecté au périphérique par le système. Sans un port série valide, il ne sera généralement pas possible d'utiliser le périphérique USB dans les applications installées dans le conteneur (Jeedom par exemple).
Pour voir la liste des ports tty affectés aux périphériques USB, tapez la commande suivante :  dmesg | grep -i tty (la barre verticale s'obtient avec les touches AltGr et 6)

Ma clé Z-Wave raccordée au bus 1, port 2.1 (1-2.1) porte l'identifiant ttyACM0. Ma clé 3G (bus 1, port 1.3) génère, comme souvent pour ce type de périphérique, 3 identifiants ttyUSB0 à ttyUSB2. Si votre clé 3G est reconnue comme un simple périphérique de stockage, essayez cette commande pour activer le mode modem puis redémarrez le serveur :

apt-get update && apt-get -y install ppp usb-modeswitch wvdial

Passons maintenant au rattachement de la clé Z-Wave. Vous devez encore récupérer 2 numéros identifiants du périphérique que vous obtiendrez avec la commande suivante :

ls -l /dev/bus/usb/001/005 (les nombres correspondent au bus 1 device 5 de ma clé Z-Wave)

Le "major device number" que je traduirais par numéro principal du périphérique correspond au premier nombre de la ligne (189 dans mon cas). Le "minor device number" (numéro secondaire) correspond au nombre suivant, après la virgule (4 dans mon cas).


Ensuite il faut donner les droits d'accès complets à ce périphérique, surtout dans le cas d'un conteneur en mode unprivileged :  chmod 777 /dev/bus/usb/001/005

Les droits du fichier apparaissent sous forme de 3 groupes de lettres en début de ligne. Pour plus d'explications sur la signification de ces lettres et des droits Linux, je vous invite à lire le chapitre Chmod sur cette page : https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux/39044-les-utilisateurs-et-les-droits#/id/r-39043
Vous pouvez ensuite relancer la commande ls pour vérifier que les nouveaux droits ont bien été appliqués.

On refait ensuite les mêmes manipulations sur l'identifiant tty :

ls -l /dev/ttyACM0
chmod 777 /dev/ttyACM0


Vous pouvez aussi noter le major device number (166 chez moi) et le minor device number (0 chez moi) mais à priori les nombres précédents doivent suffire pour le rattachement de la clé USB (cela a toujours était le cas chez moi dans mes nombreux tests).
A ce stade vous devez commencer à vous demander à quoi vont bien pouvoir servir toutes ces commandes et tous ces nombres notés. Je vous avais dit que le rattachement d'un périphérique USB à un conteneur n'était pas aussi simple que sur une machine virtuelle KVM. Mais courage, on approche du but.

Nous allons maintenant éditer le fichier de configuration du conteneur LXC pour ajouter le premier périphérique USB (ma clé Z-Wave). Tapez pour cela la commande suivante :

nano /etc/pve/nodes/Q1900/lxc/133.conf (où Q1900 est le nom du serveur et 133 le n° ID du conteneur)

Voici à quoi ressemble le fichier de configuration de mon conteneur Jeedom :

arch: amd64
cores: 2
hostname: Jeedom3.x
memory: 768
net0: name=eth0,bridge=vmbr0,gw=192.168.1.1,hwaddr=EA:EC:64:46:B9:D9,ip=192.168.1.133/24,ty$
onboot: 1
ostype: debian
rootfs: local-lvm:vm-133-disk-1,size=5G
swap: 256
unprivileged: 1

Et voici les lignes que j'ai ajoutées pour rattacher ma clé USB Z-Wave :

lxc.cgroup.devices.allow: c 189:4 rwm
lxc.mount.entry: /dev/bus/usb/001/005 dev/bus/usb/001/005 none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file


Enregistrez le fichier avec les touches CTRL et O puis Entrée et CTRL et X pour quitter. Il ne vous reste plus qu'à démarrer le conteneur et à tester la connectivité de votre clé USB.
Je vais maintenant refaire la manipulation avec la clé modem 3G, histoire d'insister un peu sur cette procédure un peu lourde. Rappel : ma clé est raccordée au bus 1, port 1.3 et porte le numéro de device 12. Trois noms de périphériques tty ont été créés par le système : ttyUSB0, ttyUSB1 et ttyUSB2. Tapez la commande suivante pour récupérer le numéro de périphérique principal et le secondaire :

ls -l /dev/bus/usb/001/012 (les nombres correspondent au bus 1 device 12 de ma clé 3G)

Dans mon cas, le "major device number" est 189 et le "minor device number" est 11. Tapez ensuite chmod 777 /dev/bus/usb/001/012 pour donner les droits d'accès complets au périphérique.

On applique ensuite le même principe sur les 3 noms de périphérique ttyUSB avec les commandes suivantes :

ls -l /dev/ttyUSB* (vous pouvez aussi remplacer l'étoile alternativement par les chiffres 0, 1 et 2)
chmod 777 /dev/ttyUSB*

Puis on édite à nouveau le fichier de configuration du conteneur pour ajouter les lignes qui vont permettre de rattacher la clé modem 3G :

nano /etc/pve/nodes/Q1900/lxc/133.conf (où Q1900 est le nom du serveur et 133 le n° ID du conteneur)

Voici le contenu du fichier de configuration de mon conteneur Jeedom avec la clé Z-Wave :

arch: amd64
cores: 2
hostname: Jeedom3.x
memory: 768
net0: name=eth0,bridge=vmbr0,gw=192.168.1.1,hwaddr=EA:EC:64:46:B9:D9,ip=192.168.1.133/24,ty$
onboot: 1
ostype: debian
rootfs: local-lvm:vm-133-disk-1,size=5G
swap: 256
unprivileged: 1
lxc.cgroup.devices.allow: c 189:4 rwm
lxc.mount.entry: /dev/bus/usb/001/005 dev/bus/usb/001/005 none bind,optional,create=file
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file

Et voici les lignes que j'ai ajoutées pour rattacher ma clé modem 3G :

lxc.cgroup.devices.allow: c 189:11 rwm
lxc.mount.entry: /dev/bus/usb/001/012 dev/bus/usb/001/012 none bind,optional,create=file
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
lxc.mount.entry: /dev/ttyUSB2 dev/ttyUSB2 none bind,optional,create=file


Enregistrez le fichier avec les touches CTRL et O puis Entrée et CTRL et X pour quitter. Il ne vous reste plus qu'à (re)démarrer le conteneur et à tester la connectivité de votre clé 3G.

Je n'ai pas pu tester le rattachement d'un RFXcom, n'en possédant pas. Et je n'ai pas réussi à rattacher une clé Bluetooth. Après avoir longuement parcouru le Net, il semble que ce ne soit pas possible. Si un jour je trouve une solution, je ne manquerai pas de vous en faire part sur le forum.


Sauvegarde et restauration d'un conteneur LXC unprivileged :

Après avoir créé et configuré un conteneur LXC Debian 9, vous allez surement souhaiter le sauvegarder et le dupliquer pour tester différentes applications. Le clonage n'étant pas possible, il faut passer par une sauvegarde puis une restauration.

Si vous avez défini un espace de stockage sur un dossier partagé NFS de votre NAS Synology, vous allez devoir modifier le mappage du compte root sur admin pour autoriser les sauvegardes d'un conteneur en mode unprivileged. Pour un conteneur "privilégié", cette manipulation n'est pas nécessaire.

La sauvegarde d'un conteneur est identique à celle d'une machine virtuelle à la différence près que le nom de la sauvegarde commencera par vzdump-lxc au lieu de vzdump-qemu.

La restauration est elle aussi classique mais il faudra penser à cocher la case Unprivileged container si vous souhaitez continuer à utiliser ce mode.

Si vous sauvegardez et restaurez un conteneur en vu de le cloner, vous aurez 2 manipulations indispensables à faire après la restauration : changer le nom du conteneur et modifier son interface réseau pour éviter un conflit d'adresses Mac et IP.

Vous pourrez éditer le nom du conteneur dans le menu DNS.
Pour le réseau, je vous conseille de supprimer l'interface définie dans le conteneur et de la recréer. Une nouvelle adresse Mac sera ainsi automatiquement régénérée.

Comme vous avez pu le voir, l'utilisation d'un conteneur est quand même plus complexe qu'une machine virtuelle. A vous de voir si le petit gain de ressources apporté vaut le temps à passer à configurer le conteneur qui ne sera de toute façon jamais aussi sécurisé qu'une VM.



A suivre :

Je suis arrivé au terme de cette suite d'article sur Proxmox et la virtualisation domestique. Mon but était de vous faire découvrir cet hyperviseur et de vous donner les bases pour créer les VM et CT qui pourront ensuite servir à toutes sortes d'usages, notamment la domotique. J'espère que ces articles vous auront donnés envie de passer à la virtualisation. J'ai encore quelques idées de tutoriels mais ce ne sera pas pour tout de suite.

Vous retrouverez le sommaire et d'autres informations dans le sujet dédié à cette suite d'article sur le forum :  http://www.touteladomotique.com/forum/viewtopic.php?f=18&t=19434

 

NOUVEAU : Retrouvez nos articles en Vidéos sur YouTube

Mise à jour le Mercredi, 01 Août 2018 21:43