Dans cette deuxième partie de la série sur KVM, nous allons créer notre première VM de la façon la plus simple que soit : à partir d’une image ISO.
I – Préparatifs
On va commencer par télécharger l’ISO que l’on veut installer, au hasard … une Debian :
# mkdir /img # cd /img # wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.4.0-amd64-netinst.iso # mv debian-10.4.0-amd64-netinst.iso debian.iso # cd
On pourrait tout à fait choisir de tester FreeBSD, CentOS, Fedora ou tout autre distribution.
Pour créer les VMs, on va utiliser virt-install qui s’installe de la sorte :
# apt install virtinst --no-install-recommends
II – KVM et le stockage
Niveau stockage, KVM peut utiliser différents formats.
Son format à lui, c’est le qcow2, mais il gère aussi les disques virtuels venant de Vmware, le stockage en NFS, etc, … et également ce que j’affectionne : LVM.
A – Vite fait sur Qcow2
Dans mes articles, j’utilise exclusivement LVM, mais pour info, si vous voulez utiliser qcow2, il faut déjà installer ceci :
# apt install qemu-utils
Puis pour créer votre fichier image :
# qemu-img create -f qcow2 /imgvms/test1.qcow2 5G
Et ensuite, dans les commande virt-inst, vous remplacez les LVs par vos fichiers qcow2 avec par ex :
--file /imgvms/test1.qcow2
B – LVM
Comme on part sur du LVM, on va déjà devoir l’installer :
# apt install lvm2
Virsh permet de builder automatiquement PV, VG, etc.. mais je préfère le faire à la main avant.
Admettons que ce soit la partition sda2 qui va servir.
On va la marquer comme LVM (8E) avec cfdisk par ex :
# cfdisk /dev/sda
La, vous changez le type, puis écrivez les modifications.
Ensuite, on créé le PV et le VG :
# pvcreate /dev/sda2 # vgcreate vg0 /dev/sda2
C – Création du pool LVM dans KVM
Maintenant, on peut passer à la définition du VG dans virsh :
# virsh pool-define-as kvm-lvm logical --source-name vg0 --target /dev/vg0
Notez bien que le nom de mon VG dans virsh est différent de son vrai nom.
Ensuite, on active :
# virsh pool-start kvm-lvm # virsh pool-autostart kvm-lvm
On peut lister
# virsh pool-list
Les autres pools ne gênent pas, on va les garder (le img sert pour indexer les ISOs, je n’ai pas encore eu le temps de creuser cet aspect…)
Avoir un pool de stockage défini dans KVM est tout à fait optionnel. On pourrait tout à fait s’en passer et créer les LVs à la main mais pour certaines manipulations qu’on verra plus tard (clone par exemple, c’est nécessaire, enfin, si on passe par le clonage via virsh… bref, ça ne mange pas de pain…)
III – La première VM
A – Installation
On peut enfin lancer la création et l’installation de notre première VM avec :
virt-install --name debianmano \ --vcpus 1 \ --cpu host \ --ram 1024 \ --location /img/debian.iso \ --disk pool=kvm-lvm,size=4,bus=virtio \ --network network:ovs-front,model=virtio,mac=52:54:00:11:11:11,target=debianmano.0 \ --graphics none \ --console pty,target_type=serial \ --extra-args='console=ttyS0' \ --os-variant debian10
Au niveau des paramètres :
- name : sérieusement ?
- vcpus : indique le nombre de cpus virtuels
- cpu host : permet de passer tout le jeu d’instruction du processeur hôte vers le(s) vcpu(s).
- location : indique où se trouve notre ISO
- disk : permet de créer directement le LV dans le pool. On aurait pu créer le LV avant et donner ici son chemin
- network : indique le réseau KVM sur lequel est branché la VM, le driver, l’adresse MAC et le nom de l’interface qui sera connectée à openvswitch (sans, ce serait du genre vnet0…)
- graphic : none désactive la console graphique
- console et extra-args : active la console série
- os-variant : permet d’activer des fonctions avancées durant l’install (acpid par exemple)
Plus d’infos ici : https://linux.die.net/man/1/virt-install
WARNING MAC :
Si vous êtes sur un serveur dédié, voyez avec votre prestataire comment gérer les Macs. Chez Online par ex, il faut la générer et faire en sorte que l’interface de VM qui sort avec l’IP FO soit bien configurée avec la MAC générée au préalable.
Chez soi, on s’en « cogne, » mais on peut tout à fait donc forcer une MAC (sans, ce sera au hasard, avec cependant toujours 52:54:00 qui correspond à KVM.
B – Installeur Debian
Une fois lancé et passé les messages de boot, on se retrouve avec un installeur Debian classique.
Choix de langue : C, puis on définit sa localisation.
Configuration du réseau (votre VM sera donc dans le même network que l’hyperviseur, par exemple une IP publique en cas de serveur dédié ou une IP en 192.168… si vous êtes chez vous).
Pour le partitionnement, on va prendre auto mais sans LVM, et on poursuit l’installation.
A la question GRUB : on l’installe sur /dev/vda.
Il se peut qu’à la fin, la VM ne se relance pas (je n’ai pas compris pourquoi, vu que ça ne le fait pas systématiquement)
La commande qui permet de se connecter à la console :
# virsh console debianmano
vous dira que le domaine est coupé.
Dans ce cas, pour le démarrer :
# virsh start debianmano
Et si vous voulez la console en même temps.
# virsh start debianmano --console
On voit Grub puis le chargement initial. Les autres messages ne s’affichent pas (configuration par défaut de Grub)
Et à un moment, on arrive sur l’invite de connexion.
Vous pouvez alors vous connecter sur votre VM et cette dernière doit communiquer correctement sur le réseau (ping, etc…)
Pour quitter la console, c’est CTRL + ] (en physique car en ssh, je dois faire CTRL ¤)
IV – Commandes Virsh
Au passage, une liste (non exhaustive) de commande utile :
# virsh autostart debianmano
Active le démarrage automatique de la VM.
# virsh reboot debianmano
Reboot de la machine (via ACPI)
# virsh shutdown debianmano
Shutdown de la machine (via ACPI)
# virsh destroy debianmano
Simule le coup de la prise…
# virsh suspend debianmano # virsh resume debianmano
Met en pause et réactive la VM
# virsh edit debianmano
Permet d’éditer le fichier de conf de la VM
# virsh dumpxml debianmano > file.xml
Dump la configuration de la VM dans un fichier
# virsh define file.xml
Créer une nouvelle machine selon un fichier
# virsh create file.xml
La même chose, mais démarre en plus la machine.
# virsh undefine debianmano
Supprime la VM (mais ne l’arrête pas si elle tourne…)
Pour supprimer aussi le LV créé automatiquement :
# virsh vol-delete debianmano kvm-lvm
V – Détails de la VM
Bon que remarque t’on avec cette VM ?
Contrairement aux VMs de Xen qui, si on n’utilise pas PyGrub (ou PVGRUB), utilisent le kernel/initramfs de l’hyperviseur, ici, on a une machine « complète » : Grub, chargement du noyau…
Une machine en quelque sorte plus « autonome ». Il sera ainsi possible de faire des modifications du noyau directement dans la VM.
En parlant de Grub, sur la VM, on va éditer le fichier /etc/default/grub pour y modifier les deux lignes :
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0" GRUB_TERMINAL="serial console"
Puis :
debianmano# update-grub
Ceci nous permettra de voir les messages du kernel au boot.
Au niveau Openvswitch :
# ovs-vsctl show
nous montre bien le port nommé debianmano.0 connecté sur le br0
Et en ce qui concerne le LV :
# virsh vol-list kvm-lvm
Qu’on peut le voir aussi avec :
# lvs
Tout est en ordre.
Et si vous voulez voir le fichier de configuration de la VM :
#virsh edit debianmano
Ho, le joli XML… (je ne suis pas fan, mais ca n’engage que moi…)
VI – Le p’tit truc en plus
Admettons que la VM soit coupée et que vous souhaitiez accéder à ses fichiers.
Avec Xen et mon système de VMS, le FS (ext4) est directement sur le LV, je peux donc le monter directement :
# mount /dev/vg0/monvol /mnt
Mais ici, ce n’est pas le cas. Le LV contient la(les) partitions créées pendant l’installation de la Debian.
On verra plus tard comment s’y connecter de façon « bas niveau », mais en attendant, voila un outil pratique …
Cela s’installe avec :
# apt install libguestfs-tools --no-install-recommends
On va couper la VM :
virsh shutdown debianmano
Puis :
# guestmount -d debianmano -i /mnt
La, on patiente un peu..
Et on a le FS de la VM monté dans /mnt… Tada…
Pour démonter :
# guestunmount /mnt
On peut relancer la VM, on va en avoir besoin pour la suite :
# virsh start debianmano
VII – Conclusion
Voila, vous savez maintenant comment créer une VM à partir d’une ISO. Simple non ?
Avant de voir l’autre façon de faire à l’aide de debootstrap, nous allons discuter réseau dans la partie suivante.