Installation de machines virtuelles

Installation de machines virtuelles

Voici le workflow que j’utilise pour la création de machine virtuelles

Installation de la machine virtuelle

Mise en place des répertoires et des disques pour la machine virtuelle

La machine virtuelle est placé dans un subvolume btrfs que je place en nodatacow

btrfs subvolume create ~/.local/share/vms/$vm
chattr +C ~/.local/share/vms/$vm

Je créé ensuite le disque virtuel et les répertoires qui accueillerons les snapshotss

qemu-img create -f qcow2 ~/.local/share/vms/$vm/main.qcow2 20G
mkdir ~/.local/share/vms/.snapshot/$vm
mkdir /srv/vms/$vm

Lancement de l’image iso

Maintenant on peu lancer l’image iso. Les options -monitor et -snapshot sont optionnelles si on a une installation automatisée.

qemu-system-x86_64 --enable-kvm                                       \ 
                   -cpu host                                          \
                   -smp 4                                             \
                   -m 4096                                            \
                   -drive file=~/.local/share/vms/$vm/main.qcow2      \
                   -cdrom /home/lomig/Téléchargements/$iso            \
                   -boot order=d                                      \
                   -display sdl                                       \
                   -usb                                               \
                   -device usb-tablet                                 \
                   -monitor unix:/tmp/qemu-monitor.sock,server,nowait \
                   -snapshot

Sauvegarde post installation

Une fois que l’installation est faite, je fige l’état dans un snapshot btrfs et j’en fait une sauvegarde sur le raid

btrfs subvolume snapshot -r ~/.local/share/vms/$vm \
                            ~/.local/share/vms/.snapshot/$vm/init
sudo btrfs send /home/lomig/.local/share/vms/.snapshots/$vm/init |\
     sudo btrfs receive /srv/vms/$vm

Sauvegarder seulement l’incrément sur le raid

Sur ma machine, /srv/vms est sur un raid5 pour les sauvegardes longues durées (Pléonasme bonjour !). Malgré la taille de près de 12To, j’aipas envie d’encrasser inutilement la chose. Je sauvegarde juste un incrément au lieu d’envoyer le fichier en entier. L’instantané initial est lui fait de façon standard. Ensuite on calcule l’incrément entre la post installation et le dernier instantané.

A partir de la, je fait toujours les incrément à partir d’init et je fait une rotation hebdomadaire.

btrfs subvolume snapshot -r ~/.local/share/vms/$vm \
                            ~/.local/share/vms/.snapshots/$vm/update-1
sudo btrfs send -p /home/lomig/.local/share/vms/.snapshots/$vm/init \
                   /home/lomig/.local/share/vms/.snapshots/ubuntu/update-1 |\
     sudo btrfs receive /srv/vms/$vm/

Utilisation de qemu monitor

J’utilise socat pour me connecter au socket du moniteur qemu

socat -,raw,echo=0 unix-connect:/tmp/qemu-monitor.sock

De là, on peu gérer des snapshots qemu pour pouvoir faire des tests et pouvoir revenir en arrière plus rapidement qu’avec un snapshot btrfs qui nous obligerai à éteindre et rallumer la VM. Si on veut faire un snapshot avant mise à jour par exemple :

# Créer un instantané
savevm pre-update

# Revenir à l'instantané
loadvm pre-update

# Effacer l'instantané
delvm pre-update

# lister les instantanés
info snapshots

Création d’un bridge réseau

Le bridge réseau va nous servir à attribuer une IP locale à la machine virtuelle.

sudo nmcli connection add type bridge ifname br0
sudo nmcli connection add type bridge-slave ifname enp11s0 master br0
sudo nmcli connection modify bridge-br0 ipv4.method auto
sudo nmcli connection up bridge-br0

Il nous suffit ensuite de rajouter ceci à /etc/qemu/bridge.conf

allow br0

Lancement de la machine virtuelle avec les bons réglages réseau

Il suffit de rajouter ces options à la ligne de commande qemu

-netdev bridge,id=net0,br=br0 \
-device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56

A savoir que pour les adresses MAC, 52:54:00 est réservé pour les machines virtuelles, donc pas de risque de doublons. Concernant l’attribution de l’adresse IP locale de la machine, j’utilise directement les réglages DHCP de la box internet en relation avec l’adresse MAC. Un dhcpcd dans la machine virtuelle, et l’adresse IP est bien réglée.

Lancement avec le copier coller fonctionnel

qemu-system-x86_64 --enable-kvm \
                   -m 4096 \
                   -cpu host \
                   -smp 4 \
                   -drive if=none,file=/home/lomig/.local/share/vms/opensuse-tw/main.qcow2,id=hd0,format=qcow2 \
                   -device virtio-blk-pci,drive=hd0 \
                   -spice port=5900,disable-ticketing=on \
                   -device virtio-serial \
                   -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
                   -chardev spicevmc,id=spicechannel0,name=vdagent \
                   -usb \
                   -device usb-tablet \
                   -monitor unix:/tmp/qemu-monitor.sock,server,nowait \
                   -netdev bridge,id=net0,br=br0 \
                   -device virtio-net-pci,netdev=net0,mac=52:54:00:00:01:02 \
                   -device qxl-vga,vgamem_mb=512,ram_size=268435456,vram_size=268435456,max_outputs=1 \
                   -display spice-app \
                   -pidfile /home/lomig/.cache/qemu-vm-opensuse-tw.pid

et dans l’hote, lancer au début de la session

/usr/bin/spice-vdagent

A ne pas lancer en root, mais avec l’utilisateur courant