Opened 8 years ago
Closed 8 years ago
#2860 closed Verbesserung (erledigt)
VirtualBox USB
| Reported by: | bau | Owned by: | Rüdiger Kupper |
|---|---|---|---|
| Priority: | bald erledigen | Milestone: | Schuljahr 2017/18 |
| Component: | Software: Ubuntu | Severity: | beeinträchtigt den Unterricht einiger Lehrer |
| Keywords: | Cc: |
Description
Problem der XP-VM ist es immer wieder, dass die Verwendung von USB-Sticks nicht funktioniert und wir im LZ z.B. den USBStick in der Linuxanmeldung sehen und dann benötigte Dateien erst in den Ordner InfoSys-Dateien kopieren müssen.
Ich habe gerade getestet, dass man per USB-Filterregel in der VBox die USB-Geräte automatisch an die VM binden kann. Normalerweise auch mit Regeln, die unspezifisch sind (ohne vendorID, productID etc / hat im PCRaum mit den LegoNxT so funktioniert). Im LZ funktioniert das aber mit einer unspezifischen Regel leider nicht, sondern nur, wenn z.B. die vendorID angegeben ist.
Irgendwie stellt der udev-Mechanismus fest, welche Konsole grade aktiv ist und öffnet den USB-Stick nur dort. Sobald ein USB-Gerät angeschlossen wird greift die VirtualBox-UDEV-Regel unter /lib/udev/rules.d/60-virtualbox.rules und legt ein vbox-Node unter /dev/vboxusb/00? an, so dass das Device in Virtualbox auftaucht und verbunden werden kann. Die Devices können mit
vboxmanage list usbhost
ausgegeben werden, mit
vboxmanage controlvm XP usbattach uuid|address
kann dann ein Device an die Virtualbox gehängt werden. Man könnte das VBoxScript /lib/udev/VBoxCreateUSBNode.sh so anpassen, dass es ein gerade angehängtes USB-Device an die Virtualbox weiterreicht. Das aber natürlich nur, wenn die VBox-Konsole grade aktiv ist.
Kann man irgendwie herausfinden, welche Konsole grade aktiv im Vordergrund ist?
Zusammenfassung unter AdminVirtualBox
Change History (11)
comment:1 by , 8 years ago
comment:2 by , 8 years ago
Deshalb sah der Test auch so aus:
- [F2]: windows/VBox
- [F7]: bau/Ubuntu
- [F8]: testite/Ubuntu
Wenn man den USB-Stick einstöpselt, dann taucht der in allen drei Konsolen auf. In der Ubuntu-Sitzung, die gerade aktiv ist wird er im Nautilus gestartet und ist in den anderen Ubuntu-Sessions nicht mehr anklickbar - in der VBox kann ich ihn aber zu mir übernehmen. Gebe ich in der VBox eine spezifische Filter-Regel für den Stick an (also mit vendorID, productID, etc.) dann fängt die VBox den Stick, wenn sie aktiv ist (ansonsten die Ubuntu-Sessions). Leider halt nicht, wenn ich eine unspezifische Regel erstelle.
Auf dem Bücherkellerrechner ist es unproblematisch, USB-Geräte grundsätzlich zu fangen. Dort habe ich das Script /lib/udev/VBoxCreateUSBNode.sh so angepasst, dass es neu auftauchende USB-Geräte einfach an die VBox hängt - klappt wunderbar - ist aber für die Multi-User-Umgebung im LZ nicht geeignet.
comment:3 by , 8 years ago
Nein, vor allem will man ja auch nicht, dass der Nutzer in der Ubuntu-Sitzung den Stick einlegt, die VM fängt ihn im Hintergrund und der Nutzer kann in der Ubuntu-Sitzung nicht mehr darauf zugreifen...
comment:4 by , 8 years ago
OK, ich hab's gefunden: fgconsole (https://linux.die.net/man/1/fgconsole)
Ein Aufruf des Befehls gibt die Nummer des aktuell aktiven VT aus.
Damit kann ich das Script /lib/udev/VBoxCreateUSBNode.sh anpassen, so dass es angestöpselte USB-Geräte genau dann einfängt und an die VBox weiterleitet, wenn VT 2 aktiv ist.
comment:6 by , 8 years ago
Fazit
Sobald ein USB-Gerät am Host angeschlossen wird, wird das Script
/lib/udev/VBoxCreateUSBNode.sh
tätig und legt zum Node unter /dev zusätzlich unter /dev/vboxusb einen Node an. Über diesen ergattert sich dann das laufende VirtualBox das USB-Gerät (z.B. über das Menü oder über einen USB-Filter).
Das Script wird nun so angepasst, dass es ein neu angeschlossenes USB-Gerät automatisch fängt:
Bücherkeller
Hier läuft sowieso nur eine virtuelle Maschine XP unter dem User dsb:
node=$(vboxmanage list usbhost | grep $devpath | tr -s " " | cut -d " " -f 2) su dsb -c "vboxmanage controlvm XP usbattach $node" echo "su dsb -c vboxmanage controlvm XP usbattach $node" >> /root/log
- Erstmal holen wir uns den Node (in $devpath hat das Script den Pfad des neuen Devices, VirtualBox benötigt aber die Komplette Adress-Zeile)
- Diese können wir dann als User dsb der VirtualBox namens XP hinzufügen
- und in einem Log eintragen
Rechner-LZ
Auf den Rechnern im LZ läuft die Windows 7 Maschine unter dem User windows. Wenn wir also herausgefunden haben, dass die aktive Konsole die mit der Nummer 2 ist, dann können wir es ebenso machen:
Konsole=$(fgconsole)
if [ "$Konsole" = "2" ]; then
node=$(vboxmanage list usbhost | grep $devpath | tr -s " " | cut -d " " -f 2)
su windows -c "vboxmanage controlvm 'Windows 7' usbattach $node"
logger -t "VirtualBox-USB" "$devpath | $node per usbattach an Windows 7 gebunden"
fi
comment:7 by , 8 years ago
Sieht gut aus!
Wie erscheint das USB-Gerät, wenn man dann nach Ubuntu umschaltet?
Greifen die konkurrierend darauf zu? (Wenn ja, können dabei Konflikte auftreten?)
Oder darf immer nur einer. (Und wenn ja, wie stellen wir sicher, dass keine Race Condition auftritt und sich manchmal Linux und manchmal Windows das Device greift?)
comment:8 by , 8 years ago
Ah, okay, die udev-Regeln haben ja Prioritäten und ich nehme an, Deine Regel hat höhere Priorität. D.h., wenn man dann nach Linux umschaltet sieht man das Laufwerk gar nicht?
comment:9 by , 8 years ago
Das ist genauso, wie im normalen Virtualbox - sobald Virtualbox das USB-Device hat, wird es dem normalen Linux entzogen.
Leider hat das noch nicht so ganz funktioniert am Freitag - hast du dieses AddOn in Virtualbox zur USB-Unterstützung installiert - weil auf dem Bücherkellerrechner tut das so, auf dem neuen LZ-Rechner wurde das VBox-Script garnicht erst aufgerufen, sobald man auf eine Ubuntu-Konsole umgeschaltet hat, hat die sich den Stick dann gegriffen.
comment:10 by , 8 years ago
ToDo für Ausrollen:
- aptitude install virtualbox-ext-pack
- aptitude install virtualbox-guest-additions-iso
- User windows muss in Gruppe vboxusers sein (usermod -aG vboxusers)
- Windows-User-Einstellungen für VirtualBox:
- Windows7.ova importieren
- USB auf 2.0 umstellen
- die beiden Scripte aus dem SVN auschecken:
- kepler--lehrer--start-infosys-session
- infosys-session
- infosys-session-windows-user
- Bei einem Update von virtualbox wird das Script /lib/udev/VBoxCreateUSBNode.sh überschrieben, dann den Teil von oben am Ende des 0)-Cases einfügen, damit USB-Devices automatisch durchgereicht werden.
Meilensteinplan (Montag 22.10.):
- Gruppe Lehrer2018 ohne sda2 (nur Ubuntu-Swap und Cache)
- Win7.vdi muss vom Server in den Cache
- Netzwerkboot auf Grub2 umstellen
- Umstellen auf Torrent (vdi)
comment:11 by , 8 years ago
| Resolution: | → erledigt |
|---|---|
| Status: | new → closed |
Keine Ahnung. Doe Verwaltung der Konsolen hat sich in den vergangenen Ubuntu-Versionen ständig geändert, z.B. mit dem Umstieg von Upstart zu SystemD. Und mit der gerade erschienenen LTS-Version 18.04, auf die wir auch demnächst umsteigen werden, ändert sich noch einmal alles, weil der Display-Manager von LightDM auf GnomeDM umgestellt wird. Den Wechsel auf 18.04 LTS plane ich derzeit schon für das übernächste Image („Galanter Gerhard“), also im Sommer/Herbst. Daher glaube ich, wir sollten etwas Ressourcen sparen und Probleme, die die Konsolen betreffen, erst danach in Anhriff mehmen.
Andere Idee:
Es könnte auch sein, dass die Probleme, die Du siehst, damit zusamäemhängen, dass die InfosS-Session im LZ unter einem anderen User läuft (windows) als die Ubuntu-Session. Das ist etwas völlig anderes, als wenn ein und derselbe Ubuntu-Nutzer (z.B. bau) die VM auf seinem Desktop startet und dann dort „seine“ USB-Geräte sehen will (die von Ubuntu als Geräte unter seinem Namen (bau) dynamisch eingerichtet wurden).
Es könnte sein, dass User windows die Devices von User bau einfach nicht zugreifen darf.