«

»

fév 18 2014

VirtualBox: Démarrage & Arrêt des VMs en même temps que l’OS hôte

 
VirtualBox

Cette fonction est implémentée depuis la version 4.2 de VirtualBox, mais son fonctionnement ne me convient pas. L’arrêt des VM’s s’exécutent bien mais d’une façon que je qualifierai de brutal, l’arrêt se fait de la manière suivante, mise en pose des VM’s puis arrêt des VM’s en utilisant la fonction extinction de VirtualBox, cette fonction à le même effet sur les VM’s que de débrancher le câble d’alimentation d’un vrai ordinateur. Ce n’ai vraiment pas idéal en sachant que la plupart des OS moderne sont compatibles ACPI et que VirtualBox a une commande afin d’envoyer un signal ACPI à des OS virtualisés.

J’ai donc décidé de créer un système d’arrêt personnalisé afin d’arrêter le système hôte et les VM’s VirtualBox de façon coordonnés.


 

I Présentation du concept

J’ai écris 3 scripts en Bash, le premier (2) sert au démarrage des VM’s (3) lorsque le système Hôte est opérationnel, ce script est le plus simple, il est exécuté automatiquement par l’OS hôte de type UNIX (Linux, BSD, Solaris, etc …). Il démarre les VM’s dans un ordre défini, les une après les autres ou en même temps.

Vbox Script1

 

Pour l’arrêt des VM’s j’ai écrit 2 scripts un maître (2) et un esclave (3), ce dernier est associé aux VM’s (4), il est générique il en faut un par VM’s. J’ai créé 2 scripts maître, un sert à créer une commande simple (un mot) afin d’arrêter les VM’s et l’OS hôte de façon manuel en utilisant un terminal, il est bavard c’est à dire qu’il interagi avec celui qui exécute la commande (1) . L’autre est en tout point identique sauf qu’il ne comporte pas de bla bla, il est exécuté de façon automatique par une tache CRON par mon serveur (1) et il est aussi utilisé par mon onduleur lorsqu’une coupure de courant survient et dure au delà d’un temps défini.

Vbox Script2

 

Il y a sans doute plus simple, mais je n’ai démarrer l’apprentissage du Bash et la création de Scripts qu’en juillet 2013, donc mon code peut être nettoyé et amélioré, mais c’est totalement fonctionnel.

Les Script qui vont suivre sont donc susceptibles d’évoluer et d’être mis à jour. Je les utilise sur mon serveur, vous devrez les adaptez à vos propres besoins.

 

 

II Rappel

Seul la session où a été démarrée une machine virtuel VirtualBox peut contrôler cette VM, même le super utilisateur (root) ne le peut, sauf si il fait partie du groupe vboxser, mais je ne le conseil pas car une mauvaise manipe est vite arrivée.

Pour illustrer cette état de fait, démarrez une VM, et nous allons essayer, dans un terminal, de lister les VM’s démarrées, d’abord en tant qu’ utilisateur et puis en tant que root. Tapez en tant qu’utilisateur.

$ VBoxManage list runningvms

Vous devez obtenir le nom de la ou des VM’s démarrées

Vbox Script3.1

Si vous essayez la même commande en tant que root vous n’obtiendrez aucun résultat, bien sur c’est la cas avec toutes les commandes VirtualBox.

 

VirtualBox peut exécuter les VM’s en 2 modes:

  • La VM est démarrée et s’affiche dans une fenêtre (mode graphique),
  • La VM est démarrée et n’est pas affichée dans une fenêtre même si l’os invité comporte une interface graphique.

 

Afin de rendre un script exécutable, il faut utiliser la commande en tant qu’utilisateur dans un terminal chmod +x suivit du nom du script.

exemple $ chmod +x Start_VM

Afin d’exécuter un script manuellement il faut taper point slash attachés au nom du script.

exemple $ ./Start_VM

 

 

III Le Script de démarrage

Si vous utilisez des VM’s en mode graphique, l’exécution du script devra être lancé après que l’interface graphique de l’OS hôte soit démarrée. Utilisez les fonctions décrites ICI selon l’interface graphique.

Si le système hôte n’a pas d’interface graphique utilisez le processus de démarrage Linux en veillant à faire exécuter le script après que le kernel VirtualBox soit chargé.
 

 »Afficher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#! /bin/bash
 
PATH=/usr/sbin:/usr/bin:/sbin:/bin
 
#---------------------------------------------------Action-------------------------------------------------------
## Démarrage des VM's
 
        # Démarrage du routeur
 
                VBoxManage startvm "le non de la VM1" --type headless
                sleep 20
 
        # Vérification que l'interface réseau eth1 est démarrée et que le routeur puisse récupérer L'IP et que le routage eh0 vers eth1 fonctionne. 
 
                StatusRoute=`ping -c 1 google.fr | grep "0% packet loss" | wc -l`
 
              while [ $StatusRoute -eq 0 ]
 
          do
                VBoxManage controlvm "le non de la VM1" poweroff
                sleep 2
                VBoxManage startvm "le non de la VM1" --type headless
                sleep 30
                StatusRoute=`ping -c 1 google.fr | grep "0% packet loss" | wc -l`
          done
 
        # Démarrage du NAS
 
		VBoxManage startvm "le non de la VM2" --type headless
		sleep 45
 
	# Démarrage des autres VM's
 
                VBoxManage startvm "le non de la VM3" --type headless
		VBoxManage startvm "le non de la VM4" --type headless
exit


 
Les lignes de 8 à 25 servent à démarrer ma VM routeur et à vérifier qu’elle est bien interfacée avec mes cartes Ethernet, l’une étant connectée à ma box (eth1) et l’autre à mon réseau local (eth0), et si ce n’est pas le cas j’arrête la VM (ligne 20, c’est un arrêt brutal) et je la redémarre. Cette section peut être supprimée, elle est spécifique à ma configuration.

A la ligne 27 le script lance le démarrage d’une autre VM (mon NAS), après 45 secondes 2 autres sont démarrées (ligne 34 ,35) au même moment.

Le démarrage des VM’s se fait grâce à la commande VBoxManage startvm (ligne 10, 22, 29, 34, 34), entre les guillemets renseignez le nom exacte de la VM, faite attention à la syntaxe, vous pouvez rajoutez le paramètre –type headless ce dernier indique à VirtualBox qu’il faut démarrer la VM sans qu’elle apparaisse dans une fenêtre.

Afin de connaître le nom exacte des VM’s attachées à VirtualBox (les VM’s ne sont pas obligées d’être démarrées) tapez la commande suivante.

$ VBoxManage list vms

Vous obtiendrez une liste avec les noms et l’UUID de chaque VM’s, l’UUID est un n° unique, vous pouvez l’utiliser à la place du nom de la VM.

 

 

IV Les Scripts d’arrêt

4.1 Le Script esclave

Il est affecté à une VM, il gère sont arrêt, il est commandé par le script maître, il doit être placé dans un dossier qui contiendra les autres scripts esclave.

Important!

Les Scripts esclaves du dossier seront exécutés les uns après les autres, dans l’ordre alphabétique.

 
 »Afficher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#! /bin/bash
 
PATH=/usr/sbin:/usr/bin:/sbin:/bin
 
#!!# VM_NAME sera le nom exact de la VM tel que VirtualBox le connaît
 
VM_NAME="le nom de la VM"
 
#-------------------------------------------------Les Variables--------------------------------------------------
 
Rapport_Dir="/home/xxxxx/texte.txt"
 
#---------------------------------------------------Les messages-------------------------------------------------
 
Message='Arrêt de la VM'
Message2='.........................................................................[ OK ]'
Message3='.........................................................................[ ERREUR ]'
Message4='est forcé'
Message5='.........................................................................[ FORCE ]'
Message6="n'est pas en fonctionnement" 
 
#---------------------------------------------------Action-------------------------------------------------------
 
                echo "   "
 
## Intégration de l'heure d'arrêt au rapport
date +--%Hh%Mmin%Ss-- >> $Rapport_Dir 
 
## Arrêt de la VM par ACPI.
 
        # On teste si la VM est déjà stoppée
 
                StatusVM=`VBoxManage list runningvms | grep "$VM_NAME" | wc -l` 
 
                if [ $StatusVM -eq 0 ]
 
		then
                echo "=================>> $VM_NAME $Message6" >> $Rapport_Dir
                echo "$Message $VM_NAME $Message2" >> $Rapport_Dir
                echo "=================>> $VM_NAME $Message6"
                echo "$Message $VM_NAME $Message2"
                exit
 
        # Si elle n'est pas stoppée, on lance l'extinction de la VM
 
                else 
                echo "=================>> $Message $VM_NAME en cour..." >> $Rapport_Dir
                echo "=================>> $Message $VM_NAME en cour..."
                VBoxManage controlvm "$VM_NAME" acpipowerbutton
	        fi   
 
## Temps avant vérification de l'arrêt des VM's
 
                sleep 20
                echo "   "
 
## Mise à l'heure des événements
date +--%Hh%Mmin%Ss-- >> $Rapport_Dir
 
## Arrêt forcé de la VM            
 
         # On teste si la VM est en fonctionnement        
 
                StatusVM=`VBoxManage list runningvms | grep "$VM_NAME" | wc -l`
 
                if [ $StatusVM -eq 1 ]
 
                then
                echo "$Message $VM_NAME $Message3" >> $Rapport_Dir
                echo "$Message $VM_NAME $Message3"
                VBoxManage controlvm "$VM_NAME" poweroff
                sleep 1
                echo "=================>> $Message $VM_NAME $Message4" >> $Rapport_Dir
                echo "=================>> $Message $VM_NAME $Message4"
                sleep 3
                echo "$Message $VM_NAME $Message5" >> $Rapport_Dir
                echo "$Message $VM_NAME $Message5"
                echo "   "
 
         # Si elle est stoppée,le message d'extinction apparaît      
                else
                echo "$Message $VM_NAME $Message2" >> $Rapport_Dir 
                echo "$Message $VM_NAME $Message2"
                echo "   "
                fi
 
exit


 

Ce script a pour but d’arrêter la VM ainsi que de donner des informations sur le déroulement du cycle d’extinction soit au travers du terminal lors d’un arrêt manuel ou par mail si l’arrêt est automatique.

Pour l’utiliser, il suffit de modifier

  • Le nom de la VM à la ligne 7,
  • De remplacer les xxxx à la ligne 11 afin d’indiquer l’emplacement où sera créer le rapport d’arrêt lors d’une extinction automatique.

Afin de recevoir un mail lors de l’arrêt automatique, il faut que le système hôte ait un serveur de messagerie de configuré, si vous ne savez pas comment faire, faite un tour ICI, il faudra adapté selon votre système. Si cette fonction ne vous est pas utile, alors commentez le début des lignes avec un # ou effacez les. (ligne 11, 27, 38, 39, 47, 58, 69, 73, 76, 82).

 

 

4.2 Le Script maître en commande manuel

Placez le script ou vous le souhaitez et donnez lui un nom assez simple, par exemple StopHote, c’est ce nom qui servira à créer la commande sans avoir besoin de taper ./le nom du script.
 
 

 »Afficher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#! /bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
 
#---------------------------------------------------Les VM's-----------------------------------------------------
## Ici on liste toute les VM's à arrêter 
 
VM_NAME1="Le nom de la VM1"
VM_NAME2="Le nom de la VM2"
VM_NAME3="Le nom de la VM3"
VM_NAME4="Le nom de la VM4"
 
#-------------------------------------------------Les Variables--------------------------------------------------
## Non modifiable
 
CMD_DIR="/sbin/shutdown -hP now"
CMD_DIR2="/sbin/reboot"
 
## modifiable
 
User='Le nom utilisateur de la session'
SCRIPTS_DIR="/home/emplacement ou se trouve les scripts d'arrêt"
Rapport_Dir="/home/xxxxx/texte.txt"
 
## A incrémenter selon le nombre de VM, faire de même dans la section ## Vérification du statut de toute les VM's
 
StatusVM1=`VBoxManage list runningvms | grep "$VM_NAME1" | wc -l`
StatusVM2=`VBoxManage list runningvms | grep "$VM_NAME2"  | wc -l` 
StatusVM3=`VBoxManage list runningvms | grep "$VM_NAME3"  | wc -l` 
 
#---------------------------------------------------Les messages-------------------------------------------------
 
MServeur='                           ****  Le serveur hôte poursuit son arrêt  ****'
MServeur1='                             ****  Patientez arrêt des VMs cour  ****'
MServeur2="                    ****  Arrêt du serveur hôte demandé par l'opérateur  ****"
MServeur3="                       ****  Arrêt du serveur annulé par l'opérateur  ****"
MServeur4='                                ****  Arrêt du serveur annulé  ****'
MServeur5='                             ****  Le serveur hôte va redémarrer  ****'
 
Service1='Vous voulez arrêter le serveur?' 
Service2="Vous avez 30s pour répondre, l'arrêt est annulé au dela"
Service3='Les 30s sont écoulées'
Service4='Tapez oui ou non :'
Service5='Que voulez-vous faire?: Redémarrer (reboot) ou Arrêter (poweroff)'
Service6='Tapez reboot ou poweroff'
Service7='Vous voulez redémarrer le serveur?'
 
#---------------------------------------------------Action-------------------------------------------------------             
 
## Information à  l'opérateur
 
                echo "   "
                echo "$MServeur2" 
                echo "   "
                echo "$Service5"
                echo "   "
 
## Demande de redémarrage ou d'arrêt
 
                echo "$Service6 ... $Service2" 
                read -t30 Rep 
 
           case "$Rep" in
 
              "reboot")
                echo "  "
                echo "$Service7"
                ;;
 
              "poweroff")
                echo "  "
                echo "$Service1"
                ;;
 
              *)
                echo "$Service3"
                echo "   "
                echo "$MServeur4"
                exit
                ;;
           esac    
 
## Demande de confirmation de l'arrêt
                echo "  "
                echo "$Service4 ... $Service2"
                read -t30 Rep2 
 
           case "$Rep2" in
 
              "oui")
                echo "  "
                echo "$MServeur1"
                ;;
 
              "non")
                echo "  "
                echo "$MServeur3"
                exit
                ;;
 
              *)
                echo "  "
                echo "$Service3"
                echo "   "
                echo "$MServeur4"
                exit
                ;;
           esac    
 
## Arrêt des VM's 
 
        # Démarrage d'une boucle pour lister les scripts contenu dans le répertoire
 
              for script in $(ls $SCRIPTS_DIR)
          do
 
        # si le fichier est exécutable…
                if [ -x "$SCRIPTS_DIR/$script" ]
 
                then
        # on l’exécute ; le $@ permet de passer à chaque script les arguments passés à *ce* script
                $SCRIPTS_DIR/$script $@
                fi
          done
 
## Vérification du statu de toutes les VM's (A incrémenter avec le nb de VM)               
 
              while [ $StatusVM1 -eq 1 ] || [ $StatusVM2 -eq 1 ] || [ $StatusVM3 -eq 1 ]
          do
	        StatusVM1=`VBoxManage list runningvms | grep "$VM_NAME1" | wc -l`
                StatusVM2=`VBoxManage list runningvms | grep "$VM_NAME2"  | wc -l` 
                StatusVM3=`VBoxManage list runningvms | grep "$VM_NAME3"  | wc -l` 
	        sleep 10   
	  done  
 
        # Suppression du fichier texte 
                rm $Rapport_Dir
 
## Extinction du serveur Hote et de la VM Routeur
 
                echo "   "
		echo "La VM $VM_NAME4 va être stopée ..."
	        echo "   "
 
       	   case "$Rep" in
 
              "reboot")
                echo "$MServeur5"
                VBoxManage controlvm "$VM_NAME4" poweroff
                sleep 10
                sudo $CMD_DIR2 <<< $User
                ;;
 
              "poweroff")
                echo "$MServeur"
                VBoxManage controlvm "$VM_NAME4" poweroff
                sleep 10
                sudo $CMD_DIR <<< $User
                ;;
           esac    
 
exit

 
 

Pour l’utiliser, il suffit de modifier

  • Les sections , 5, 18, 24, 125, selon votre situation,
  • Vous pouvez commenter ou supprimer les lignes 141, 142, 148, 155, qui commande l’arrêt de ma VM routeur.
  • Vous pouvez commenter ou supprimer la section 135 si vous n’utilisez pas l’envoi du rapport par mail.

Comme pour le script précèdent il faut le rendre exécutable.

 

Afin de permettre à l’utilisateur d’exécuter les commandes reboot et shutdown, vous pouvez utiliser sudo, il est installable sur la plupart des distributions et il est possible d’éviter à l’utilisateur de renseigner le mot passe root en modifiant le fichier /etc/sudoers. Une fois les modifications apportées, les deux commandes seront exécutées sans intervention de votre part.

Après l’installation de sudo, éditez son fichier de configuration avec la commande suivante visudo, en tant que root dans un terminal, je vous conseil d’en faire une copie et d’ouvrir 2 terminaux que vous aurez passé en mode root, un servira à l’édition et l’essai des modifications et l’autre sera un secours si une erreur est arrivée.

Ouvrir le terminal et le passer en mode root tapez,

$ sudo -i

Copie du fichier

# cp /etc/sudoers /etc/sudoers.back

Edition du fichier

# visudo

Copiez les lignes suivantes dans le fichier en remplaçant les xxxx par le nom de l’utilisateur de la session.
 

#Commande d'arrêt sans mots de passe
xxxx ALL=(root) NOPASSWD:/sbin/shutdown -hP now
 
#Commande Reboot sans mots de pass
xxxx ALL=(root) NOPASSWD:/sbin/reboot

Au moment d’enregistrer le système vous propose de modifier le nom sudoers en sudoers.tmp, enlevez l’extension, puis validez. Faite un essai en tant qu’utilisateur d’une des deux commandes, par exemple reboot il faut taper la commande avec son PATH, le mot de passe root n’est pas demandé.

$ /sbin/reboot

Si cela fonctionne, c’est que vous avez bien respectez la syntaxe, si un problème apparaît alors rééditez le fichier ou si vous n’êtes pas sure, remplacez le par sa copie, en utilisant le terminal que vous avez laissé en mode root.

Error!

Si le fichier est inutilisable par sudo, la commande ne fonctionnera plus. N’utilisez pas votre éditeur de texte habituel, seul la commande visudo peut correctement éditer le fichier sudoers, et ainsi conserver l’encodage du fichier,

 

Maintenant il faut créer la commande qui exécutera le script, on appel ça créer un PATH, il suffit de déplacer ou de copier le script dans un de ces dossiers, /bin, /usr/bin, /usr/local/bin ou dans un autre dossier PATH. Il est aussi possible de créer un lien symbolique entre l’emplacement actuel du script et un des dossiers PATH, ce qui rend toutes modifications du script plus facile car les dossiers PATH ne sont accessibles quand tant que root.

Affin de créer le lien symbolique entre le script et par exemple /bin, ouvrez un terminal et éxécutez la commande suivante en tant que root,

# ln -s /home/emplacement/du/script/StopHote /bin/StopHote

Sortez du mode root en appuyant simultanément sur le touche Ctrl C et commencez à taper les 3 premières lettres du nom de votre script en respectant la casse, puis appuyez sur la touche tabulation qui complétera les lettres manquantes, si ce n’est pas le cas, redémarrez pour que la commande soit prise en compte.

 

 

4.3 Fonctionnement du couple Script maître d’arrêt manuel et du script esclave

Dès que vous aurez tapé la commande d’arrêt (1) dans un terminal, vous devrez faire le choix, soit vous souhaitez redémarrer ou arrêter (2) le système hôte et les VM’s. Vous devrez confirmer ou infirmer votre choix (3), si vous confirmez votre choix, l’arrêt des VM’s commencent.

Le délais de vérification de l’arrêt de la VM (4) est à définir dans le Script esclave à la section (52). Une fois toutes les VM’s arrêtées, la commande d’arrêt ou de redémarrage de la machine est exécutée.

Compo Script arrêt VM

 

 

4.4 Le Script maître en commande automatique

Placez le script où vous le souhaitez, il n’est pas évident que vous ayez besoin de ce script, il est plus simple que le précédant, il est spécifique à ma configuration. Comme évoqué plus haut, il est commandé par une tache CRON et par NUT qui gère mon onduleur.
 
 

 »Afficher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#! /bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
 
#---------------------------------------------------Les VM's-----------------------------------------------------
## Ici on liste toute les VM's à arrêter 
 
VM_NAME1="Le nom de la VM1"
VM_NAME2="Le nom de la VM2"
VM_NAME3="Le nom de la VM3"
VM_NAME4="Le nom de la VM4"
 
#-------------------------------------------------Les Variables--------------------------------------------------
## Non modifiable
 
CMD_DIR="/sbin/shutdown -hP now"
 
## modifiable
 
User='Le nom utilisateur de la session'
SCRIPTS_DIR="/home/emplacement ou se trouve les scripts d'arrêt"
Rapport_Dir="/home/xxxxx/texte.txt"
Label="Rapport d'extintion du serveur et des VM's du"
Date=`date +%Y-%m-%d`
 
## A incrémenter selon le nombre de VM, faire de même dans la section ## Vérification du statut de toute les VM's
 
StatusVM1=`VBoxManage list runningvms | grep "$VM_NAME1" | wc -l`
StatusVM2=`VBoxManage list runningvms | grep "$VM_NAME2"  | wc -l` 
StatusVM3=`VBoxManage list runningvms | grep "$VM_NAME3"  | wc -l` 
 
#-------------------------------------------------Action--------------------------------------------------                
 
## Vérification de qui a lancé le script 
 
        # Stockage de  l'identifiant de l'utilisateur qui a lancé le script
 
                Id=$(whoami) 
 
        # Si le contenu de "Id" est "root"        
                if [ $Id = "root" ] 
 
                then   
        # On va exécuter le script en sortant du mode root
                su $User $(echo $0)  # la commande "echo $0" permet de récupérer le nom du fichier, 
                                     # qui contient notre script, ainsi que son chemin d'accès 
                                     # et on le relance en le préfixant de la commande de sorti du mode root  
 
        # Si le contenu de "Id" n'est pas "root" on poursuit le script   
   else
 
## Création du rapport d'extinction
cat << EOF >> $Rapport_Dir 
$Label $Date 
EOF
 
## Arrêt des VM's 
 
        # Démarrage d'une boucle pour lister les scripts contenu dans le répertoire
 
              for script in $(ls $SCRIPTS_DIR)
          do
 
        # si le fichier est exécutable…
                if [ -x "$SCRIPTS_DIR/$script" ]
 
                then
        # on l’exécute ; le $@ permet de passer à chaque script les arguments passés à *ce* script
                $SCRIPTS_DIR/$script $@
                fi
          done
 
## Vérification du statu de toute les VM's (A incrémenter avec le nb de VM)      
 
              while [ $StatusVM1 -eq 1 ] || [ $StatusVM2 -eq 1 ] || [ $StatusVM3 -eq 1 ]
          do
	        StatusVM1=`VBoxManage list runningvms | grep "$VM_NAME1" | wc -l`
                StatusVM2=`VBoxManage list runningvms | grep "$VM_NAME2"  | wc -l` 
                StatusVM3=`VBoxManage list runningvms | grep "$VM_NAME3"  | wc -l` 
	        sleep 10   
	  done  
 
## Extinction du serveur Hote et de la VM Routeur
 
        # Envoi du rapport par mail
                mail -s "Arrêt serveur" votre mail < $Rapport_Dir
                sleep 6
        # Arrêt du routeur
                VBoxManage controlvm "$VM_NAME4" poweroff
                sleep 4
 
        # Supprission du fichier texte 
                rm $Rapport_Dir
 
        # Arrêt du VPS  
                sudo $CMD_DIR <<< $User
 
   fi           
 
exit

 
 

Pour l’utiliser, il suffit de modifier

  • Les sections 5, 17, 25, 72, selon votre situation,
  • Vous pouvez commenter ou supprimer la section 87, qui commande l’arrêt de ma VM routeur.
  • Vous pouvez commenter ou supprimer la section 51, 84 et 91, si vous n’utilisez pas l’envoi du rapport par mail.

Comme pour le script précèdent il faut le rendre exécutable

Un petit mot quand même concernant la section 32,comme je l’évoque dans la chapitre rappel seul l’utilisateur qui lance VirtualBox et les VM’s a le contrôle. Le programme NUT, lui, exécute ses commandes en tant que root, si je souhaite faire arrêter mon serveur et le VM’s de façon propre, lors d’une coupure de courant prolongée, il faut que le script soit relancé en tant qu’utilisateur, vu que mes VM’s sont lancées au démarrage dans ce mode. Cette section vérifie l’identité de l’exécutant du script, et si c’est root, le script est relancé pour être exécuté en tant qu’utilisateur;

 

Voilà c’est fini, vous pouvez bien entendu mixer les scripts pour les adapter à vos besoins, il n’est pas besoin d’avoir un script maître esclave si vous n’arrêter qu’une seul VM en même temps que votre machine, leurs fusions est plus appropriée.

Si vous avez des questions ou des suggestions n’hésitez pas à laisser un commentaire, votre mail n’est pas obligatoire, je les inhibé même si le champ apparaît dans le formulaire.

3 comments

  1. DocGreen

    Salut,

    super article, exactement ce que je cherchais pour automatiser le lancement et l’arrêt d’une VM Windows sur un hôte Linux.

    1. Gaguc

      Salut,

      Merci pour ce commentaire qui m’encourage à continuer.

  2. Phytoceramide supplement

    This is my first time pay a quick visit at here and i am in fact pleassant to read everthing at alone place.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser les balises HTML suivantes : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>