: cette page est obsolète, et n'a été utilisé que pour la création du paquet virt-stack
Contenue du paquet:
- script de sauvegarde virt-backup.pl
- script init virt-state pour hiberner/réveiller les VM lors de l'arrêt/démarrage de l'hôte
- script init virt-perm pour mettre les permissions qui vont bien (DAC et SELinux) sur les différentes ressources
- script init ksm pour lancer le scanner KSM (attendre correctif du module qui supprime le leak ?)
Script d'hibernation/réveil des VM lors de l'arrête/démarrage de l'hôte
Ce script ne devrait plus être nécessaire à partit de libvirt-0.8.0 (qui intègre de façon native une fonction “managed save” qui permet de réveiller une VM depuis un fichier state, simplement en démarrant le domaine)
#!/bin/sh # the following is chkconfig init header # # virt-helper: save and restore VM state # # chkconfig: 345 99 01 # description: Libvirt helper script to save and load VM # state when the host shutdown and start # ensure also correct permissions and SELinux # # Source function library. . /etc/rc.d/init.d/functions . /etc/sysconfig/virt-addons VIRSH=$(which virsh) VIRSH=$VIRSH" -c "$LIBVIRT_URI RETVAL=0 ERROR=0 hibernate(){ echo -n $"Saving Virtual Machines states: " # For each running VM (or paused ones), save the state in $STATE_DIR for VM in $(LANG=C $VIRSH list | egrep '(running|paused)' | awk {'print $2'}); do echo -n $"Saving $VM state: " $VIRSH save $VM $STATE_DIR/$VM.state 2>&1 > /dev/null if [ $? = 0 ]; then success; echo else ERROR=1 error; echo fi done } wakup(){ ERROR=0 # For each state file found in $STATE_DIR, try to restore it # and remove the file if we succed, else report an error for VM in $(ls $STATE_DIR/*.state 2>/dev/null); do echo -n $"Restoring $VM state: " $VIRSH restore $VM 2>&1 > /dev/null if [ $? = 0 ]; then sucess; echo rm -f $VM else error; echo ERROR=1 fi done } set_perms(){ for DIR in /var/lib/libvirt/qemu /var/run/libvirt/qemu /var/cache/libvirt/qemu; do [ -d $DIR ] || mkdir -p $DIR chown $KVMUSER:$KVMGROUP $DIR || ERROR=1 done } set_selinux(){ # Fix SELinux context for all storage support used by a VM echo -n $"Fixing SELinux contexts: " VMS=$(LANG=C virsh list --all | egrep '(running|shut off|paused)' | awk {'print $2'}) VOLS=$(for VM in $VMS;do virsh dumpxml $VM | xmlstarlet sel -t -m \ "/domain/devices/disk/source" -v @dev -v @file -n; done | grep '/') for VOL in $VOLS;do chcon -t virt_image_t $VOL || ERROR=1 done if [ $(grep -c virt-addons $(semodule -l)) = 0]; then semodule -i /usr/share/selinux/targeted/virt-addons.pp || ERROR=1 fi if [ $ERROR = 0 ]; then sucess; echo rm -f $VM else error; echo ERROR=1 fi } start_ksm(){ modprobe ksm 2>&1 > /dev/null chown :$KVMUSER /dev/ksm chmod 660 /dev/ksm ksmctl start $NBPAGES $SLEEP 2>&1 > /dev/null } stop_ksm(){ ksmctl stop 2&1 > /dev/null } start(){ [ $STATE ] && wakup [ $SET_PERM ] && set_perms [ $SET_SELINUX ] && set_selinux [ $KSM ] && start_ksm if [ $ERROR = 1 ]; then RETVAL=1 fi } stop(){ [ $STATE ] && hibernate [ $KSM ] && stop_ksm if [ $ERROR = 1 ]; then RETVAL=1 fi } restart(){ stop && start } case "$1" in start|stop|restart) $1 ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 ;; esac exit $RETVAL
/etc/sysconfig/virt-addons:
# Should VM states should be saved when host shutdown and restored when started # This acts as an auto hibernate function for VM, and make rebooting guests # independantly from the host STATE=true # Should permissions should be set on some directory SET_PERM=true # Should SELinux functions (fixing context on devices, and allowing save/restore on # systems using SELinux enforcing SET_SELINUX=true # Enable KSM KSM=true # Default URI for libvirt LIBVIRT_URI="qemu:///system" # User and group kvm runs as (as configured in /etc/libvirt/qemu.conf) KVMUSER="qemu" KVMGROUP="qemu"
Script de configuration des permissions qui vont bien
Hook script pour qemu (/etc/libvirt/hook/qemu)
#!/bin/bash VM=shift OP=shift SUBOP=shift VOLS=(cat /dev/stdin | xmlstarlet sel -t -m \ "/domain/devices/disk/source" -v @dev -v @file -n; done | grep '/') if [ $OP == "start" ]; then for VOL in $VOLS;do chcon -t virt_image_t $VOL done fi exit 0
Hook script pour le démon (/etc/libvirt/hook/daemon)
#!/bin/bash OBJ=shift OP=shift if [ $OP == "start" ]; then for DIR in /var/lib/libvirt/qemu /var/run/libvirt/qemu /var/cache/libvirt/qemu; do [ -d $DIR ] || mkdir -p $DIR chown qemu:qemu $DIR done fi exit 0
Un chcon tout les supports utilisés par une VM:
# Fix SELinux context for all storage support used by a VM VMS=$(LANG=C virsh list --all | egrep '(running|shut off|paused)' | awk {'print $2'}) VOLS=$(for VM in $VMS;do virsh dumpxml $VM | xmlstarlet sel -t -m \ "/domain/devices/disk/source" -v @dev -v @file -n; done | grep '/') for VOL in $VOLS;do chcon -t virt_image_t $VOL done # And fix permissions on some directories for DIR in /var/lib/libvirt/qemu /var/run/libvirt/qemu /var/cache/libvirt/qemu; do [ -d $DIR ] || mkdir -p $DIR chown $KVMUSER:$KVMGROUP $DIR done
:
- Et pour les volumes créés après le démarrage ? il faut lancer à la mains le script :/
- Ça serait probablement plus élégant d'utiliser les nouveaux Hooks (synchrones): on chcon uniquement les volumes utilisé par le domaine démarré, juste avant qu'il ne démarre. En espérant que ces hooks soient intégrés à libvirt 0.7.8. Les permissions sur les répertoires pourraient être vérifiés sur le hook du démon, alors que les permissions sur les volumes utiliseraient les hooks qemu
Lancement de KSM
modprobe ksm chown :$KVMUSER /dev/ksm ksmctl start $NBPAGES $SLEEP 2>&1 > /dev/null
:
- Dommage qu'on ait pas les stats de KSM disponibles dans /sys, ça permettrait d'utiliser les scripts ksm et ksmtuned de fedora (adaptation auto de l'agressivité de ksm en fonction de la charge du serveur)