
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.
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.
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
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é.
»Afficher1
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.
»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.
»Afficher1
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.
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.
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.
»Afficher1
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
DocGreen
7 avril 2014 à 18 h 29 min (UTC 2) Lier vers ce commentaire
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.
Gaguc
7 avril 2014 à 22 h 56 min (UTC 2) Lier vers ce commentaire
Salut,
Merci pour ce commentaire qui m’encourage à continuer.
Phytoceramide supplement
27 avril 2014 à 21 h 14 min (UTC 2) Lier vers ce commentaire
This is my first time pay a quick visit at here and i am in fact pleassant to read everthing at alone place.