tuto:virtualisation:virt_scripts

Ceci est une ancienne révision du document !


FIXME: 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"

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

FIXME:

  • 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
modprobe ksm
chown :$KVMUSER /dev/ksm
ksmctl start $NBPAGES $SLEEP 2>&1 > /dev/null

FIXME:

  • 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)
  • tuto/virtualisation/virt_scripts.1342128739.txt.gz
  • Dernière modification: 12/07/2012 23:32
  • de dani