KVM : script d'init

KVM : script d'init jpp

Pour utiliser KVM comme j'en avais envie il fallait que ces machines puissent démarrer lors de la séquence de boot de la machine hôte. Or, a priori, le lancement demande un écran ! Heureusement l'option 
--nographic est là. 
Cette machine virtuelle est destinée à contenir la MV qui héberge ce site, vu qu'il y a peu de machines et services à surveiller une puissance importante n'est pas nécessaire. 
Le script de lancement devient alors :

#!/bin/bash 
PATH=/root/bin:$PATH 
ORIG=$(dirname $0) 
cd ${ORIG} 
ORIG=$(pwd) 
echo 'ORIG=('$ORIG')' 
cd $ORIG

HDA=/dev/mapper/VG00-WEB_PHP7 
DISKA=' -drive file='${HDA}',if=virtio,format=raw,cache=none,aio=native  '

HDB=/dev/mapper/VG01-WEB_PHP7_SAUVE 
DISKB=' -drive file='${HDB}',if=virtio,format=raw,cache=none,aio=native  '

EXEC='qemu-system-x86_64 -enable-kvm -machine type=pc,accel=kvm:tcg -mem-path /dev/hugepages ' 
EXEC=${EXEC}' --mem-prealloc'

NOM=web-php7 
RAM=1792M 

OPTION=' ' 
# clavier FR 
OPTION=' -k fr -smp 2'    
# Pas de daemon (car nographic 
DEMON=' -daemonize ' 
DEMON=' ' 
# Appel des scripts de gestion de la "carte réseau" ces scripts sont présentés un peu plus loin 
sudo ./bin/qemu-ifdown br1 tap10 
sleep 1 
sync 
sudo ./bin/qemu-ifup br1 tap10 
sudo /sbin/brctl show

# Creation port "Monitor" pour arrêt machine 
GUEST=' -monitor unix:/tmp/monitor_web,server,nowait '

RESEAU=' -net nic,macaddr=00:16:3e:31:31:01 -net tap,ifname=tap10,script=no,downscript=no '

# Normal launch 
COMMANDE="$EXEC $DEMON $SNAPSHOT -boot c $DISKA $DISKB -name $NOM -m $RAM $OPTION $RESEAU ${GUEST} " 
# machine affectée sur les "processeurs" 10 et 11, la "belle" machine physique en a 12 
taskset --cpu-list 10,11 ${COMMANDE} -nographic & 
ret=$? 
echo 'Retour:'${ret}

xxxxxxxxx

KVM : script d'init ancien

KVM : script d'init ancien jpp

Pour utiliser KVM comme j'en avais envie il fallait que ces machines puissent démarrer lors de la séquence de boot de la machine hôte. Or, a priori, le lancement demande un écran ! Heureusement l'option --nographic est là. 
La machine virtuelle est destinée à contenir une instance de Shinken (analogue au célèbre Nagios mais avec une architecture bien plus souple et évoluée), vu qu'il y a peu de machines et services à surveiller une puissance importante n'est pas nécessaire. 
Le script de lancement devient alors :

#!/bin/bash 
HDA=/dev/mapper/VG00-SHINKEN_SYS
NOM=kvm-shinken
RAM=420M
# clavier FR
OPTION=' -k fr '   
OPTION=$OPTION' -nographic '
DEMON=' -daemonize '
# appel script de creation de l'interface "tap"
./qemu-ifup br0 tap1
RESEAU=' -net nic,macaddr=00:16:3e:90:03:01 -net tap, \ ifname=tap1,script=no,downscript=no '
kvm $DEMON -hda $HDA -boot c -name $NOM -m $RAM $OPTION $RESEAU 
Ce script permet de lancer ma machine virtuelle sans ouvrir d'écran.
Nouvelle version (2016) du script tenant compte des évolutions de Linux et Qemu/kvm (virtio par exemple), (l'option "nographic" n'existe plus ?) :
#!/bin/bash

HDA=/dev/mapper/VG00-COM--WEB 
# On "perfectionne le disque (partition LVM) 
DISK=' -drive file='$HDA',if=virtio,format=raw ' 
# On "précise" les paramètres QEMU 
EXEC='qemu-system-x86_64 -cpu host -enable-kvm -machine type=pc,accel=kvm:tcg -mem-path /hugepages '

NOM=toto 
RAM=1280M 
# clavier FR et un processeur 
OPTION=' -k fr -smp 1 '  

# Appel du script de création de l'interface réseau 
./bin/qemu-ifup br1 tap2

# Paramétrage réseau 
RESEAU=' -net nic,macaddr=00:16:3e:31:31:01,model=virtio -net tap,ifname=tap2,script=no,downscript=no '

# On lance en background avec l'oprion -nographic 
$EXEC $DEMON $SNAPSHOT -boot c $DISK -name $NOM -m $RAM $OPTION $RESEAU -nographic &

Cette dernière version de script tourne parfaitement sur "Jessie" et "unstable".

Pour l'arrêt le meilleur système est d'exécuter un "init 0" ... Pour réaliser cette opération il suffit de se connecter en ssh et de lancer un simple "init 0". Ce petit miracle s'obtient sans trop de problèmes en générant et partageant une clef SSH. Je ne développerais pas la manière de l'obtenir ici car la recette se trouve très facilement sur Internet.
Mais tout ceci ne permet pas de lancer et de stopper automatiquement et de manière commode la machine virtuelle depuis un script d'init un peu classique.
Un script d'init complet et "classique", compatible avec les autres, peut être celui-ci :
#!/bin/bash 
### BEGIN INIT INFO
# Provides:       shinken
# Required-Start: $network $remote_fs $syslog $time cron
# Default-Stop:  0 1 2 3 6  
# Default-Start:   5
# Required-Stop:
# Description:    shinken through KVM 
### END INIT INFO
 
FCMD=/tmp/FCMD
case "$1" in
start)
echo 'cd /etc/kvm' >$FCMD
echo './script-noscreen '  >>$FCMD
# Lancement différé pour ne pas surcharger le démarrage de l'hote
cat $FCMD | at now +2 minutes 
RETVAL=$?
rm $FCMD
;;
stop)
ssh -i /root/.ssh/la_belle_clef root@machine 'init 0 '
RETVAL=$?
# on laisse à la MV le temps de stopper
echo $0' sleeping 20 sec'
sleep 20
;;
reload|status)
echo 'Not implemented'
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
RETVAL=1
esac
exit $RETVAL
Et cela marche fort bien !

Script init systemd

Script init systemd jpp

ARTICLE EN COURS DE REALISATION. 
Les scripts d'init "old fashion" c'est fini, il faut passer par "systemd" pour que tout se passe bien au démarrage de la machine "support". 
Afin de pouvoir automatiser totalement le start/stop des machines j'ai choisi d'utiliser les possibilités de gestion liées à qemu (installer "qemu-agent" sur les machines virtuelles) en utilisant un "socket" qui permet de transmettre des ordres tels "powerdown" depuis un script externe, ici lancé par "systemctl stop xxxxxxx". 
Il nous faut d'abord créer un fichier "service" à placer dans /lib/systemd/system selon le modèle suivant :

# Manually generated by myself  
[Unit] 
Description=Lancement VM Web 
# After network After=networking.target nss-lookup.target 
[Service] 
Type=forking 
Restart=no 
TimeoutSec=20s 
# 
GuessMainPID=no 
RemainAfterExit=yes 
# 
ExecStart=/etc/kvm_n-portail/LANCE web 
ExecStop=/etc/kvm_n-portail/STOPVM web [Install] 
WantedBy=multi-user.target

Il faut ajouter dans le script de démarrage de la machine virtuelle mettre en place le socket de communication avec le "guest-agent':

# Creation port "Monitor" pour arrêt machine 
GUEST=' -monitor unix:/tmp/monitor_web,server,nowait '

Ce paramètre "GUEST" est à ajouter dans la commande de lancement : 
qemu-system-x86_64 -enable-kvm ...... ${GUEST}

Le script "systemd" fait appel à des scripts bash "simples" pour lancer et stopper les machines.

Script LANCE :

#!/bin/bash
#
#
RFER=/etc/kvm_n-portail
FCMD='/tmp/CDE_'$1

ret=0
case "$1" in 
    web)
        echo "cd ${RFER} "        >${FCMD}
        echo ./web-php7-noscreen    >>${FCMD}
        echo /root/bin/KVMNICE        >>${FCMD}        
        echo 'sleep 5'            >>${FCMD}
        # cat ${FCMD} # at now +1 minute
        chmod u+x ${FCMD}
        ${FCMD}
        ;;
    new-shinken)
        echo "cd ${RFER} "        >${FCMD}
        echo ./new-shinken-noscreen    >>${FCMD}
        echo /root/bin/KVMNICE        >>${FCMD}        
        echo 'sleep 5'            >>${FCMD}
        #  cat ${FCMD} # at now +2 minute
        chmod u+x ${FCMD}
        echo '---------------'${FCMD}
        ${FCMD}
        echo '---------------'
        ;;
    *)    
        echo 'VM ('${1}') not implemented yet'
        ret=1
        ;;
esac
sleep 2
rm -f ${FCMD}
exit $ret
 

Le script pour stopper une machine est bati sur le même principe, STOP  :

#!/bin/bash
SOCK=/tmp/monitor
ret=0
case "$1" in
web)
SOCK=${SOCK}'_web'
if [ -S ${SOCK} ]
then
echo system_powerdown | socat - UNIX-CONNECT:${SOCK}
sleep 10
else
echo ${SOCK}' absent'
ret=2
fi
;;
### n paragraphes identiques
*)
echo 'Aucune machine ('$1')'
ret=1
;;
esac
exit $ret
 


That's all folks !