Pour gérer un nombre relativement important de machines virtuelles, j'ai décidé d'en automatiser la production par un script bash sur la base de l'organisation suivante :
toutes les machines, MV${i}, i variant de 1 à N, sont construites à partir d'une machine de base, "Windows XP.vbox" dont la configuration contient un disque dur "Windows XP.vdi", et deux lecteurs de CD, vides
pour chacune je définis un répertoire d'enregistrement (VBOX_USER_HOME) et un répertoire pour la machine virtuelle ("MV${i}.Windows XP")
je construis chaque machine en recopiant le fichier "Windows XP.vbox" vers "MV${i}.Windows XP" sous le nom MV${i}.vbox, et en l'enregistrant dans son propre répertoire
je prends un instantané de la machine, instantané qui me sert à installer les logiciels spécifiques à la machine à partir soit d'une image iso, soit d'un CD
comme je veux ultérieurement encore déplacer l'ensemble pour particulariser chaque machine pour chaque futur utilisateur en créant un second instantané, je sors l'instantané que je viens de créer du répertoire Snapshots pour le remplacer par un lien symbolique absolu
Jusqu'à ce point de mon script, tout fonctionne parfaitement, les liens entre les fichiers sont correctement gérés, soit par des adressages absolus (depuis MV${i}.vbox vers "Windows XP.vdi") ou relatifs (depuis Virtualbox.xml vers MV${i}.vbox)
if ${loquace}; then
zenity --info --window-icon="info" --text="Création de la machine virtuelle"; fi
mkdir -p "${varctx}/"{r,Snapshots,log,vbx}
export VBOX_USER_HOME="${varctx}/r
cp --preserve=all "/.ciel/${mv}/${mv}.vbox" "${varctx}"
VBoxManage registervm "../${mv}.vbox"
vbx_mv_uuid=$(VBoxManage list vms | grep "${mv}" | sed -e s/.*{// -e s/}//)
VBoxManage modifyvm "${vbx_mv_uuid}" --name "${Jeu}"
VBoxManage unregistervm "${vbx_mv_uuid}"
VBoxManage registervm "../${Jeu}.vbox"
VBoxManage snapshot "${vbx_mv_uuid}" take "${mv}"
cp "${varctx}/Snapshots/"*.vdi "${varctx}/vbx"
ln -f --symbolic "${varctx}/vbx"/*.vdi "${varctx}/Snapshots"
Pour procéder à l'installation de ces logiciels, et c'est là que tout se gâte, je veux utiliser le premier lecteur de CD de la machine soit pour y monter l'image iso, soit lui faire correspondre le lecteur CD de l'hôte. Je n'ai pour l'instant pas encore tester ce deuxième besoin, car mes machines "perdent" leurs disques dans les manipulations que je fais et qui sont les suivantes :
if ${loquace}; then zenity --info --window-icon="info" --text="Installation de la machine VirtualBox"; fi
if ${cdrom}; then
medium="host:/dev/sr0"
else
medium="${varjeu}/${Jeu}.iso"
fi
VBoxManage storageattach "${vbx_mv_uuid}" \
--storagectl "Contrôleur IDE" \
--port 0 \
--device 1 \
--type dvddrive \
--medium "${medium}"
scriptinstall
VBoxManage storageattach "${vbx_mv_uuid}" \
--storagectl "Contrôleur IDE" \
--port 1 \
--device 0 \
--type dvddrive \
--medium "/.ciel/scripts/CielWindows.iso"
VirtualBox --startvm "${vbx_mv_uuid}" --fullscreen
VBoxManage storageattach "${vbx_mv_uuid}" \
--storagectl "Contrôleur IDE" \
--port 0 \
--device 1 \
--type dvddrive \
--medium emptydrive
VBoxManage storageattach "${vbx_mv_uuid}" \
--storagectl "Contrôleur IDE" \
--port 1 \
--device 0 \
--type dvddrive \
--medium emptydrive
scriptinstall crée l'image "CielWindows" que la machine hôte exécute au démarrage
A partir de là, je constate un comportement qui me paraît aléatoire, et mes machines virtuelles deviennent inacessibles. Le fichier vbox se vide de ses HardDisks. J'y retrouve en effet le code suivant
<HardDisks/>
<DVDImages>
<Image uuid="{7bc889cd-4a1f-46d6-ab85-66f48d246fab}" location="/media/Multimedia/Ciel_Iconiochore/Justine et la pierre de feu/Justine et la pierre de feu.iso"/>
<Image uuid="{866ca08c-fe76-43bd-823f-dff9ef01e713}" location="/.ciel/scripts/CielWindows.iso"/>
</DVDImages>
Merci à quiconque pourra me donner des pistes d'investigation.
Arbiel