#26 Le 31/03/2010, à 05:02
- dvi43
Re : Problème auto-montage USB sur VirtualBox
ah mais j'avais essayer ça mais du coup ça avait pas été bon vu uq'il faut que tout monte automatiquement
Hors ligne
#27 Le 31/03/2010, à 10:05
- JesterXhead
Re : Problème auto-montage USB sur VirtualBox
Disons que dans mon cas, une université, je me vois mal demander à tous les étudiants d'amener leur périphériques pour les cocher lol. D'où la nécessité d'une reconnaissance automatique par la VM.
Hors ligne
#28 Le 01/04/2010, à 11:26
- dvi43
Re : Problème auto-montage USB sur VirtualBox
j'ai presque trouvé ici : http://forum.ubuntu-fr.org/viewtopic.php?pid=3375763#p3375763
il me manque juste la gestion des exception (une histoire de sed)
Hors ligne
#29 Le 02/04/2010, à 10:07
- dvi43
Re : Problème auto-montage USB sur VirtualBox
ça y est les périphériques usb montent automatiquement au lancement du script, je le nettoie qu'il soit compréhensible au mieux et je le met ici, après il n'y aura normalement plus qu'à mettre une règle UDEV
Hors ligne
#30 Le 04/04/2010, à 08:55
- dvi43
Re : Problème auto-montage USB sur VirtualBox
bon j'ai un petit peu nettoyé le script je pense que pour le moment c'est plus une usine à gaz qu'autre chose mais ça à l'air de tourner donc si vous avez des simplifications ou des trucs qui pourraient être mieux ça fera pas de mal.
script :
#!/bin/bash
#V0.9.1.6 du 4 avril 2010
# nom de la machine virtuelle
VBOX="V1"
#part 1
# utilisation de awk pour avoir la liste des périphériques usb avec la commande VboxManage
USBin=`VBoxManage -nologo list usbhost | awk '
BEGIN { RS = "" ; FS = "\n" }
{
if ($1 != "Host USB Devices:") {
#si le périphérique est déjà capturé on ecrit true sinon on ecrit false
if ( index ($8,"Captured")) {
printf ("TRUE;")
} else {
printf ("FALSE;")
}
# on recupere l uid
split ($1,ret1,":"); gsub (" ","",ret1[2]);
printf("%s;", ret1[2]);
# on recupere la description
split ($5,ret5,":"); gsub (" ","",ret5[2]);
split ($6,ret6,":"); gsub (" ","",ret6[2]);
printf("%s, %s ;\n", ret5[2], ret6[2]);
}
}
'
`
# ce IFS est il utile ?
IFS=";"
#ancien morceau de programme à supprimer dans la version finale
#peut etre encore utile à la compréhension
#USBout=$(zenity \
# --list \
# --title "VboxUSB Select" \
# --text "Select device to attach or detach" \
# --checklist \
# --hide-column=2 \
# --column "Pick" \
# --column "UID" \
# --column "Device" \
# $USBin );
#part 2
#preparer tous les périphériques à etre liés
#on remplace tous les FALSE par des TRUE pour dire qu'on veut tout lier a la vm
#on rempli la variable USBout avec le contenu de USBin
USBout=$USBin
#on passe la variable usbout dans un fichier temporaire
echo $USBout > /home/virtual/usbtmp
#on fait le remplacement de false par true
sed -i "s/FALSE/TRUE/g" /home/virtual/usbtmp
#on remet le contenu du fichier temporaire dans la variable
USBout=$(cat /home/virtual/usbtmp)
#part3
#gestion des exceptions
#on remplace le TRUE sur la ligne du periph qu'on ne veut pas monter par un
#FALSE, on selectionne le peripherique par son UID
#relever au préalable l uid avec la commande VBoxManage -nologo list usbhost
#on met la variable dans un fichier temporaire
echo $USBout > /home/virtual/usbtmp42
#on recherche l uid et on remplace le true qui est sur la meme ligne que l uid recherché par un false
sed '/'"dcc8437e-819a-4396-97f2-df38c4ab7938"'/ s/TRUE/FALSE/g' /home/virtual/usbtmp42 > /home/virtual/usbtmp52
USBout=$(cat /home/virtual/usbtmp52)
#part 4
#formatage de la variable usbout
#on formate USBout pour la suite
#USBout ne doit contenir que la deuxieme colonne (uid)
#on prends toutes les lignes où il y a true et les met dans usbtmp2
grep "TRUE" <<<"$USBout" >/home/virtual/usbtmp2
#dans le fichier usbtmp2 il n'y a maintenant que les périphériques à monter(ceux qui sont true)
#il faut supprimer tout sauf les UID
#on prends que la deuxième colonne (uid) et on l'envoie dans le fichier temporaire
cut -f2 -d" " /home/virtual/usbtmp2 > /home/virtual/usbtmp3
#on met le contenu du fichier temporaire dans la variable
USBout=$(cat /home/virtual/usbtmp3)
#part 5
#debranchement des peripheriques deconnectes
#cette partie est elle encore utile ?voir avec les tests mais normalement non
### First itteration
### Compare all entries that were true and are now no longer in the return zenety list. We have to disconnect those.
IFS=$'\n'
for i in $USBin;
do
if ( echo $i | grep -q TRUE ) ; then
## If we have a connected USB device before we started then check if it was unselected
ii=`echo $i | sed s/TRUE\;//`
iii=`echo $ii | sed s/\;.*//`
if ! ( echo $USBout | grep -q $iii ) ; then
VBoxManage -nologo controlvm $VBOX usbdetach $iii
fi
fi
done
#part6
#passer chaque ligne de usbout et lier a la vm le peripherique correspondant
#le separateur est la fin de ligne (\n)
IFS=$'\n'
for i in $USBout;
do
#si le périphérique n est pas encore lié
if ( echo $USBin | grep -q FALSE\;$i ) ; then
#on l attache
VBoxManage -nologo controlvm $VBOX usbattach $i
fi
done
unset IFS
#suppression des fichiers temporaires
rm /home/virtual/usbtemp
rm /home/virtual/usbtmp42
rm /home/virtual/usbtmp52
rm /home/virtual/usbtmp2
rm /home/virtual/usbtmp3
#attention les uid changent
#qu'est ce qui declenche ce changement ?
#un periphérique branché constamment change t il d'uid ?
#faire une regle UDEV correspondante
#tester avec plein de périphs usb
#voir les droits sur le dossier tmp du système si c est ok on met les fichiers tmp du script dedans
vous ne pourrez pas utiliser le script directement, il y a des chemins de fichier à changer (/home/virtual/xxx)
le nom de la machine virtuelle aussi
la règle udev n'est pas faite mais ça devrait pas être bien compliqué, faudra s'y pencher une fois que ce programme sera bien propre ^^
Hors ligne
#31 Le 07/04/2010, à 08:23
- dvi43
Re : Problème auto-montage USB sur VirtualBox
voilà le programme raccourci :
#!/bin/bash
#script de montage automatique de périphériques USB pour virtualbox
# nom de la machine virtuelle
VBOX="V1"
#part 1
# utilisation de awk pour avoir la liste des périphériques usb avec la commande VboxManage
USBin=`VBoxManage -nologo list usbhost | awk '
BEGIN { RS = "" ; FS = "\n" }
{
if ($1 != "Host USB Devices:") {
#si le périphérique est déjà capturé on ecrit true sinon on ecrit false
if ( index ($8,"Captured")) {
printf ("TRUE;")
} else {
printf ("FALSE;")
}
# on recupere l uuid
split ($1,ret1,":"); gsub (" ","",ret1[2]);
printf("%s;", ret1[2]);
# on recupere la description
split ($5,ret5,":"); gsub (" ","",ret5[2]);
split ($6,ret6,":"); gsub (" ","",ret6[2]);
printf("%s, %s ;\n", ret5[2], ret6[2]);
}
}
'
`
# ce IFS est il utile ?
#je sais pas pourquoi mais oui il est bien utile
IFS=";"
#part 2
#preparer tous les périphériques à etre liés
#on remplace tous les FALSE par des TRUE pour dire qu'on veut tout lier a la vm
#on rempli la variable USBout avec le contenu de USBin
USBout=$USBin
#on passe la variable usbout dans un fichier temporaire
echo $USBout > /tmp/usbtmp
#on fait le remplacement de false par true
sed -i "s/FALSE/TRUE/g" /tmp/usbtmp
#on remet le contenu du fichier temporaire dans la variable
USBout=$(cat /tmp/usbtmp)
#part3
#gestion des exceptions
#on remplace le TRUE sur la ligne du periph qu'on ne veut pas monter par un
#FALSE, on selectionne le peripherique par son UUID
#relever au préalable l uuid avec la commande VBoxManage -nologo list usbhost
#on met la variable dans un fichier temporaire
echo $USBout > /tmp/usbtmp42
#on recherche l uuid et on remplace le true qui est sur la meme ligne que l uuid recherché par un false
sed '/'"16597b06-31b9-470e-a4b7-48c87f39bb00"'/ s/TRUE/FALSE/g' /tmp/usbtmp42 > /tmp/usbtmp52
USBout=$(cat /tmp/usbtmp52)
#part 4
#formatage de la variable usbout
#on formate USBout pour la suite
#USBout ne doit contenir que la deuxieme colonne (uuid)
#on prends toutes les lignes où il y a true et les met dans usbtmp2
grep "TRUE" <<<"$USBout" >/tmp/usbtmp2
#dans le fichier usbtmp2 il n'y a maintenant que les périphériques à monter(ceux qui sont true)
#il faut supprimer tout sauf les UuID
#on prends que la deuxième colonne (uuid) et on l'envoie dans le fichier temporaire
cut -f2 -d" " /tmp/usbtmp2 > /tmp/usbtmp3
#on met le contenu du fichier temporaire dans la variable
USBout=$(cat /tmp/usbtmp3)
#part5
#passer chaque ligne de usbout et lier a la vm le peripherique correspondant
#le separateur est la fin de ligne (\n)
IFS=$'\n'
for i in $USBout;
do
#si le périphérique n est pas encore lié
if ( echo $USBin | grep -q FALSE\;$i ) ; then
#on l attache
VBoxManage -nologo controlvm $VBOX usbattach $i
fi
done
unset IFS
#suppression des fichiers temporaires
rm /tmp/usbtmp
rm /tmp/usbtmp42
rm /tmp/usbtmp52
rm /tmp/usbtmp2
rm /tmp/usbtmp3
#attention les uuid changent prseque a chaque reboot
#qu'est ce qui declenche ce changement ?
#faire une regle UDEV correspondante à peu près :
#/etc/udev/rules.d/99-my.rules qui contient :
BUS=="usb", RUN+="/etc/udev/test.sh"
#/etc/udev/test.sh qui contient :
#!/bin/sh
#bash /home/virtual/Bureau/scusb
#test.sh fait bien son travail le problème est au niveau de la regle udev
#penser au chmod 777 sur test.sh et peut etre aussi sur scusb
#tester avec plein de périphs usb
il reste quelques petites erreurs mais ça marche quand on le lance à la main.
le problème c'est la règle udev je n'arrive pas à en faire une qui détecte tous les périphériques usb et qui lance la suite, une idée ?
Hors ligne
#32 Le 07/04/2010, à 10:51
- dvi43
Re : Problème auto-montage USB sur VirtualBox
le problème avec la règle udev vient du fait que la commande est lancée en root donc lors de la connexion (vboxmanage usbattach...) ça plante il faut que ce soit l'utilisateur courant qui lance sujet ouvert : http://forum.ubuntu-fr.org/viewtopic.php?id=388662
Hors ligne