Debianlibvirt hypervisor » Historique » Version 2

Bruno STEVANT, 02/10/2018 22:10

1 1 Bruno STEVANT
h1. Debian/libvirt hypervisor
2 1 Bruno STEVANT
3 1 Bruno STEVANT
Cet hyperviseur a été initialement créé par Benjamin Cama en 2012 pour tester une alternative au hyperviseurs VMWare ESXi déjà en place. Il héberge un certain nombre de VM pour les doctorants et les ingénieurs de RSM.
4 1 Bruno STEVANT
5 1 Bruno STEVANT
La machine utilisée s'appelle (historiquement) virtualc5-3, qui était auparavant un hyperviseur VMWare, et est située en A17b. C'est une Debian originellement squeeze, mise à jour en wheezy, avec comme outil principal de virtualisation "libvirt":http://libvirt.org/.
6 1 Bruno STEVANT
7 2 Bruno STEVANT
L'installation spécifique de la machine est décrite dans installation de l'[[Rapport d'installation de l'hyperviseur libvirt|hyperviseur Debian/libvirt]].
8 2 Bruno STEVANT
9 2 Bruno STEVANT
Un paquet spécifique est utilisé pour avoir des VM qui peuvent fonctionner uniquement avec un port série (sans partie graphique) : celui d'iPXE, où on active le port série au boot, afin qu'on puisse voir dans la console le boot PXE s'effectuer. En effet, l'installation se fait en bootant par le réseau, en PXE, sur la [[VM d'installation]]. Le code est dispo dans ce projet:https://redmine.telecom-bretagne.eu/projects/ipxe-custom.
10 2 Bruno STEVANT
11 2 Bruno STEVANT
h2. Création d'une VM
12 2 Bruno STEVANT
13 2 Bruno STEVANT
J'utilise les scripts du projet que j'ai créé "ici":https://redmine.telecom-bretagne.eu/projects/vm-creation-scripts. Presque tout peut se faire depuis sa propre machine, avec le contrôle à distance par SSH offert par libvirt.
14 2 Bruno STEVANT
15 2 Bruno STEVANT
Il faut d'abord s'assurer que la variable d'environnement de ''virsh'' de l'URI de l'hyperviseur est bien positionnée :
16 2 Bruno STEVANT
17 2 Bruno STEVANT
  export VIRSH_DEFAULT_CONNECT_URI=qemu+ssh://virtual-a17-1.ipv6.enstb.fr/system
18 2 Bruno STEVANT
19 2 Bruno STEVANT
Pour la création même de la VM, on fait un ''make'' avec le nom de la machine qu'on veut en argument (nom court, sans espace), ce qui va créer le XML correspondant dans 'libvirt/' et lancer immédiatement la création (la *définition* pour être précis sur la terminologie libvirt) sur l'hyperviseur. Par exemple :
20 2 Bruno STEVANT
21 2 Bruno STEVANT
  make machine-de-test
22 2 Bruno STEVANT
23 2 Bruno STEVANT
Le script demande quelques informations comme la taille de RAM, disque, nombre de vCPU, nom du responsable, etc. J'avais également préparé une cible pour créer un deuxième disque à la volée, qui serait utilisé comme PV (Physical Volume) LVM sans table des partitions car c'est plus simple à redimensionner :
24 2 Bruno STEVANT
25 2 Bruno STEVANT
  make machine-de-test/second-disk
26 2 Bruno STEVANT
27 2 Bruno STEVANT
On peut effacer une machine ('''attention, c'est rapide, sans confirmation, et ça efface également tout le stockage (disque)''') avec :
28 2 Bruno STEVANT
29 2 Bruno STEVANT
  make machine-de-test/delete
30 2 Bruno STEVANT
31 2 Bruno STEVANT
Il y a également des scripts de tentative de migration de VM VMWare, mais non finis ; regarder dans le Makefile et les XSLT ovf-libvirt-*.
32 2 Bruno STEVANT
33 2 Bruno STEVANT
Ensuite, on utilise les commandes standard de libvirt. Pour démarrer une VM :
34 2 Bruno STEVANT
35 2 Bruno STEVANT
  virsh start --console machine-de-test
36 2 Bruno STEVANT
37 2 Bruno STEVANT
L'option ''--console'' permet d'obtenir tout de suite la console série. Elle boot par le réseau et peut démarrer un des installeurs offert sur le réseau. Attention, un petit ''bug'' fait que des fois, le nom de l'interface réseau est trop long pour l'OS ; il faut le corriger avec :
38 2 Bruno STEVANT
39 2 Bruno STEVANT
  virsh edit machine-de-test # chercher domain/devices/interface/target et le raccourcir
40 2 Bruno STEVANT
41 2 Bruno STEVANT
h3. Gestion des utilisateurs
42 2 Bruno STEVANT
43 2 Bruno STEVANT
Elle se fait uniquement depuis l'hyperviseur.
44 2 Bruno STEVANT
45 2 Bruno STEVANT
Si on veut donner un accès à la VM aux utilisateurs depuis l'hyperviseur, j'ai créé un script qui permet de le faire, dont le code est disponible "ici":https://redmine.telecom-bretagne.eu/projects/manage-vm. Pour qu'il s'exécute, il faut d'abord créer un utilisateur de manière adéquate :
46 2 Bruno STEVANT
47 2 Bruno STEVANT
  adduser --disabled-password --ingroup vm-users test-user
48 2 Bruno STEVANT
49 2 Bruno STEVANT
Le groupe "vm-users" a été créé afin d'identifier quels utilisateurs ont besoin de sudo sans mot de passe pour effectuer les tâches de gestion (c.f. fichier "allow-vm-management" du code ci-dessus).
50 2 Bruno STEVANT
51 2 Bruno STEVANT
Ensuite, on leur donne accès par SSH à l'hyperviseur, mais uniquement pour lancer le script de gestion de VM, en ajoutant dans ~test-user/.ssh/authorized_keys :
52 2 Bruno STEVANT
53 2 Bruno STEVANT
  command="/usr/bin/manage-vm machine-de-test" ssh-rsa AAAA…
54 2 Bruno STEVANT
55 2 Bruno STEVANT
Ici, c'est la clé RSA publique qui permet d'authentifier l'utilisateur (je n'offre pas de login avec mdp). On peut rajouter plusieurs machines en argument à la commande, également. C'est ce fichier qui fait la « liaison » entre les utilisateurs et les machines qu'ils auront le droit d'administrer.
56 2 Bruno STEVANT
57 2 Bruno STEVANT
Notez que cet accès est fait pour la gestion à l'installation et en cas de dépannage ; le reste du temps, l'utilisateur gère sa machine en s'y connectant directement par le réseau, pas par l'hyperviseur.
58 2 Bruno STEVANT
59 2 Bruno STEVANT
h3. IP publique
60 2 Bruno STEVANT
61 2 Bruno STEVANT
Depuis l'hyperviseur uniquement, pareillement.
62 2 Bruno STEVANT
63 2 Bruno STEVANT
Une demande récurrente est d'offrir une IP publique à la VM. Je ne l'ai jamais automatisée car les demandes répétées sont récentes. Pour offrir cette possibilité, l'hyperviseur est relié au VLAN 5 (ou 50 également) qui sert à adresser des machines qui veulent une IPv4 publique comme décrit "ici":http://redmine.rsm.enstb.fr/projects/rsmcorenet/wiki/Public_IPv4_Addresses. C.f. la config du switch "switcha17b.ipv6.enstb.fr".
64 2 Bruno STEVANT
65 2 Bruno STEVANT
La manière de le faire passer (ou non) aux VMs est d'utiliser le filtrage offert par ''ebtables'' (qui est le filtre de niveau 2 des bridges Linux). En effet, le brige ''br0'' de l'hyperviseur est utilisé par les VMs quand elles sont reliées au réseau "bridged". Par défaut, tous les VLAN taggés sont filtrés (c.f. "ebtables -L FORWARD"), mais on peut ajouter une exception pour une machine donnée (en nommant l'interface désirée, et en indiquant le VLAN voulu) :
66 2 Bruno STEVANT
67 2 Bruno STEVANT
  ebtables -t filter -I FORWARD -o test-vnet0 -p 802_1Q --vlan-id 5 -j ACCEPT
68 2 Bruno STEVANT
  ebtables -t filter -I FORWARD -i test-vnet0 -p 802_1Q --vlan-id 5 -j ACCEPT
69 2 Bruno STEVANT
  service ebtables save
70 2 Bruno STEVANT
71 2 Bruno STEVANT
La dernière commande sert à sauvegarder les changements pour le prochain reboot.
72 2 Bruno STEVANT
73 2 Bruno STEVANT
h3. Stockage
74 2 Bruno STEVANT
75 2 Bruno STEVANT
C'est depuis l'hyperviseur aussi.
76 2 Bruno STEVANT
77 2 Bruno STEVANT
Les VMs sont stockées par défaut dans le partage iSCSI de la DISI. Celui-ci (appelé "iscsi-disi-rsm" comme indiqué dans le [[Rapport d'installation de l'hyperviseur libvirt|rapport d'installation]]) est partitionné en GPT car très gros, et que la DISI n'offrait pas d'autre moyen de partager l'espace (LUN séparé par exemple). Ça n'est pas idéal s'il était partagé entre plusieurs machines (problèmes de synchronisation), mais c'est pour l'instant la seule à l'utiliser. Dans chaque partition (qui fait 1 To pour le moment), je crée un PV LVM, qui fait partie du VG "iscsi-disi-rsm". C'est dans celui-ci que sont stockées les VMs.
78 2 Bruno STEVANT
79 2 Bruno STEVANT
Pour redimensionner un disque, ça n'est pas toujours simple : il y a ''l'extérieur'' de la VM, sur l'hyperviseur, et ce qu'il se passe ''à l'intérieur'' de la VM. Pour l'hyperviseur, généralement un coup de "lvresize" (attention, je parle là ''sur l'hyperviseur'', je n'ai pas testé les fonctions de virsh pour ça) et c'est bon : si le kernel de la VM n'est pas trop vieux, il recevra une notification (par ACPI ? IO-APIC ? PCI-truc ? un truc du genre) et verra le volume plus grand. Pour que la VM puisse utiliser cet espace, je conseille de mettre un second disque qui servira de PV (''dans la VM'') '''sans''' partitionnement, ce qui permettra de faire d'abord un "pvresize" puis un classique "lvresize" ''dans'' la VM.