Cluster with libvirt » Historique » Version 17
Version 16 (Matthieu Herrb, 16/09/2020 08:54) → Version 17/22 (Matthieu Herrb, 16/09/2020 09:00)
{{>toc}}
h1. Cluster with libvirt
h2. Tooling
<pre>
# cd /root/tools/libvirt/
# ./autovirsh domuuid gizmo.sileht.net
Domain gizmo.sileht.net is on g3
4baace2f-6d7c-4575-8982-bedb6065ab6b
# ./where www.tetaneutral.net
Domain www.tetaneutral.net is on g1
# ./create-vm --help
usage: create-vm --ip IP NAME
--image debian-buster-scsi
--ram 1 # SIZE in GiB
--vcpu 1
--ip <IPV4>
--disk 20 # SIZE in GiB
--on g1 # short name of the host
# ./migrate --help
usage: migrate NAME DEST
# ./info gizmo.sileht.net
Domain gizmo.sileht.net is on g3
Interface Type Source Model MAC
-------------------------------------------------------
tap249cbb03-b8 ethernet - virtio fa:16:3e:88:4d:0b
Target Source
------------------------------------------------
hda ssds/97c925e4-9f3e-4b92-96b9-6190e0fc4b88_disk.config
sda ssds/volume-0973c10d-79c8-4906-9f9c-9ba33118203d
sdb disks/volume-3657e47a-07d8-4052-8dcf-cb7a0fb19b20
<config>
<tap name="tap249cbb03-b8">91.224.149.214</tap>
</config>
</pre>
h2. Fontionnement
Les VM utilisent le mode ethernet de libvirt. En gros libvirt s'attends à trouver un tap tout près pour y accrocher la VM
Just avant le boot de la VM libvirt lance:
<pre> /etc/libvirt/hooks/qemu <VM_NAME> prepare begin</pre>
Et juste après l'arret de la VM libvirt lance:
<pre> /etc/libvirt/hooks/qemu <VM_NAME> release end</pre>
Le script /etc/libvirt/hooks/qemu de ttnn se trouve ici: https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster/revisions/master/entry/environments/production/manifests/files/openstack/libvirt-hooks-qemu
Ce script va lire les metadatas TTNN de <VM_NAME> (e.g: virsh metadata <VM_NAME> http://tetaneutral.net/)
<pre>
$ virsh metadata ns2.tetaneutral.net http://tetaneutral.net/
<config>
<network mode="routed">
<tap name="tapb0b4a106-d0">89.234.156.248</tap>
<tap name="tapabababab-aa">89.234.156.45</tap>
</network>
</config>
</pre>
Ensuite il va créé le tap et configurer les routes dessus avec les infos des metadata.
h2. git
https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools
libvirt
h2. Misc
h3. Editer le disque d'une VM
Mode lecture seule (sans danger) :
<pre>
VM=xxx
virsh shutdown $VM
virsh destroy $VM # si shutdown marche pas
guestfish --ro -i -d $VM
</pre>
Pour par exemple desactiver cloud-init qui peut bloquer le boot :
<pre>
guestfish -i -d $VM
ll /etc/cloud
touch /etc/cloud/cloud-init.disabled
exit
</pre>
h3. Voir la console graphique sans spice-html5:
Copier le script suivant 'ttnn-viewer' sur sa machine:
<pre>
#!/bin/bash
vm=$1
info=$(ssh g1.tetaneutral.net -p 2222 -l root -- "tools/libvirt/where $vm|cut -d' ' -f5")
if [ x"${info}" == "x" ]; then
echo "Error VM $vm not found"
exit 1
fi
hypervisor=${info}.tetaneutral.net
spice_port=$(ssh ${hypervisor} -p 2222 -l root virsh domdisplay ${vm} | awk -F: '{print $3}')
echo "$vm on $hypervisor port $spice_port"
ssh -N $hypervisor -p 2222 -l root -L 5910:localhost:${spice_port} &
pid=$!
cleanup(){
kill $pid
}
trap cleanup EXIT
sleep 2
remote-viewer spice://localhost:5910/
</pre>
Puis
<pre>
sudo apt-get install virt-viewer
./ttnn-viewer puppet.tetaeutral.net
</pre>
h3. Réinstallation/Réparation grub d'un VM
Récuperer l'id et l'hyperviseur de la VM
<pre>
g1# ./tools/libvirt/info VMNAME.tetaneutral.net | grep UUID
g1# ./tools/libvirt/where VMNAME.tetaneutral.net
</pre>
Aller sur l'hyperviseur en question et arreter la VM (ici on considère qu'elle est plantée shutdown ne marche pas -> destroy)
<pre>
ssh -p 2222 root@gN
gN# virsh destroy VMNAME.tetaneutral.net
</pre>
Bien attendre que la VM soit éteinte et taper
<pre>
gN# virt-customize -v -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 --run-command 'update-grub ; grub-install /dev/sda;'
</pre>
Enfin, restart la VM
<pre>
gN# virsh start VMNAME.tetaneutral.net
</pre>
h1. Cluster with libvirt
h2. Tooling
<pre>
# cd /root/tools/libvirt/
# ./autovirsh domuuid gizmo.sileht.net
Domain gizmo.sileht.net is on g3
4baace2f-6d7c-4575-8982-bedb6065ab6b
# ./where www.tetaneutral.net
Domain www.tetaneutral.net is on g1
# ./create-vm --help
usage: create-vm --ip IP NAME
--image debian-buster-scsi
--ram 1 # SIZE in GiB
--vcpu 1
--ip <IPV4>
--disk 20 # SIZE in GiB
--on g1 # short name of the host
# ./migrate --help
usage: migrate NAME DEST
# ./info gizmo.sileht.net
Domain gizmo.sileht.net is on g3
Interface Type Source Model MAC
-------------------------------------------------------
tap249cbb03-b8 ethernet - virtio fa:16:3e:88:4d:0b
Target Source
------------------------------------------------
hda ssds/97c925e4-9f3e-4b92-96b9-6190e0fc4b88_disk.config
sda ssds/volume-0973c10d-79c8-4906-9f9c-9ba33118203d
sdb disks/volume-3657e47a-07d8-4052-8dcf-cb7a0fb19b20
<config>
<tap name="tap249cbb03-b8">91.224.149.214</tap>
</config>
</pre>
h2. Fontionnement
Les VM utilisent le mode ethernet de libvirt. En gros libvirt s'attends à trouver un tap tout près pour y accrocher la VM
Just avant le boot de la VM libvirt lance:
<pre> /etc/libvirt/hooks/qemu <VM_NAME> prepare begin</pre>
Et juste après l'arret de la VM libvirt lance:
<pre> /etc/libvirt/hooks/qemu <VM_NAME> release end</pre>
Le script /etc/libvirt/hooks/qemu de ttnn se trouve ici: https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/puppetmaster/revisions/master/entry/environments/production/manifests/files/openstack/libvirt-hooks-qemu
Ce script va lire les metadatas TTNN de <VM_NAME> (e.g: virsh metadata <VM_NAME> http://tetaneutral.net/)
<pre>
$ virsh metadata ns2.tetaneutral.net http://tetaneutral.net/
<config>
<network mode="routed">
<tap name="tapb0b4a106-d0">89.234.156.248</tap>
<tap name="tapabababab-aa">89.234.156.45</tap>
</network>
</config>
</pre>
Ensuite il va créé le tap et configurer les routes dessus avec les infos des metadata.
h2. git
https://chiliproject.tetaneutral.net/projects/git-tetaneutral-net/repository/openstack-tools
libvirt
h2. Misc
h3. Editer le disque d'une VM
Mode lecture seule (sans danger) :
<pre>
VM=xxx
virsh shutdown $VM
virsh destroy $VM # si shutdown marche pas
guestfish --ro -i -d $VM
</pre>
Pour par exemple desactiver cloud-init qui peut bloquer le boot :
<pre>
guestfish -i -d $VM
ll /etc/cloud
touch /etc/cloud/cloud-init.disabled
exit
</pre>
h3. Voir la console graphique sans spice-html5:
Copier le script suivant 'ttnn-viewer' sur sa machine:
<pre>
#!/bin/bash
vm=$1
info=$(ssh g1.tetaneutral.net -p 2222 -l root -- "tools/libvirt/where $vm|cut -d' ' -f5")
if [ x"${info}" == "x" ]; then
echo "Error VM $vm not found"
exit 1
fi
hypervisor=${info}.tetaneutral.net
spice_port=$(ssh ${hypervisor} -p 2222 -l root virsh domdisplay ${vm} | awk -F: '{print $3}')
echo "$vm on $hypervisor port $spice_port"
ssh -N $hypervisor -p 2222 -l root -L 5910:localhost:${spice_port} &
pid=$!
cleanup(){
kill $pid
}
trap cleanup EXIT
sleep 2
remote-viewer spice://localhost:5910/
</pre>
Puis
<pre>
sudo apt-get install virt-viewer
./ttnn-viewer puppet.tetaeutral.net
</pre>
h3. Réinstallation/Réparation grub d'un VM
Récuperer l'id et l'hyperviseur de la VM
<pre>
g1# ./tools/libvirt/info VMNAME.tetaneutral.net | grep UUID
g1# ./tools/libvirt/where VMNAME.tetaneutral.net
</pre>
Aller sur l'hyperviseur en question et arreter la VM (ici on considère qu'elle est plantée shutdown ne marche pas -> destroy)
<pre>
ssh -p 2222 root@gN
gN# virsh destroy VMNAME.tetaneutral.net
</pre>
Bien attendre que la VM soit éteinte et taper
<pre>
gN# virt-customize -v -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 --run-command 'update-grub ; grub-install /dev/sda;'
</pre>
Enfin, restart la VM
<pre>
gN# virsh start VMNAME.tetaneutral.net
</pre>