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"
===== 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
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
===== Lancement de KSM =====
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)