Ein USB-Gerät zuverlässig an die VM durchreichen
Eine kurze Geschichte über einen Supportfall mit VMware Workstation, einer Windows-XP-VM und einer speziellen Tastatur, hinter der ein völlig sinnvoller Anwendungsfall steckt.
Dieser Beitrag ist von 2019. Er bleibt online, weil er nach wie vor nachgefragt wird, beschreibt aber einen Produktstand von damals.
Letzte Woche kam ein Supportfall von einem unserer Kunden. Das Problem: In seiner Windows-XP-Maschine wurde eine spezielle Tastatur nicht immer erkannt, und wir sollten helfen.
Bevor jetzt Kommentare kommen, wie veraltet und nicht mehr unterstützt Windows XP heute ist: Der Anwendungsfall dahinter ist völlig stimmig.
Windows XP im Jahr 2019: der Anwendungsfall
Das Unternehmen baut grosse Industriemaschinen, die für den Betrieb Software brauchen. Diese Maschinen halten sehr lange, und die Software dafür stammt manchmal noch aus der Windows-95-Zeit. Der Kunde muss also die alten Maschinen genauso unterstützen wie seine neuesten Modelle. Er baute gerade einen neuen «Industrie-PC», im Kern ein robustes Gehäuse für einen kleinen Rechner, auf dem diese Software laufen muss. Das Problem: Auf den neuen Rechnern gab es nur noch Windows 10, und die alte Software liess sich darauf nicht installieren. Das «neueste» Windows, auf dem sie läuft, ist tatsächlich Windows XP. So weit der Anwendungsfall.
Der Kunde hatte bereits viel Arbeit hineingesteckt und einiges automatisiert. Sobald der Rechner startete, fuhr er die Windows-XP-VM in einer VMware Workstation KVM-Instanz hoch. Die KVM-Instanz blendet die obere Leiste aus und verbirgt damit weitgehend, dass es sich um eine VM handelt. Und wenn der Kunde die VM herunterfuhr, erkannte der darunterliegende Host mit Windows 10 das und fuhr sich ebenfalls herunter. Ziemlich clever.
Das Problem: die USB-Tastatur verbindet sich nicht zuverlässig
Der Kunde hatte nun das Problem, dass eine spezielle Tastatur manchmal an die VM durchgereicht wurde und manchmal nicht. Wenn nicht, brach die alte Software mit Fehlern ab und startete gar nicht erst. Stell dir eine Person aus der Produktion vor, die diese Maschine bedienen will und mit «Computern und so» wenig am Hut hat, und wie solche Fehler auf sie wirken, besonders wenn sie oft auftreten.
An dieser Stelle muss ich zugeben, dass ich keine Ahnung hatte, worauf ich mich einlasse, als ich zu diesem Supportfall gerufen wurde. Mein erster Gedanke war, dass vielleicht Windows XP schuld ist, und dann könnte niemand helfen. Ich bin trotzdem vor Ort gefahren und habe mir die Lage angesehen. Die meisten Informationen von oben bekam ich erst dort im Gespräch mit dem Kunden.
Wir haben getestet und festgestellt: In den Fällen, in denen die VM die Tastatur nicht bekam, funktionierte sie unter Windows 10 einwandfrei. Schnell war klar, dass wir dieses spezielle USB-Gerät so konfigurieren müssen, dass es immer an die VM durchgereicht wird. Nur wie? Ich erinnerte mich, dass mich meine VMware Fusion immer fragt, was mit einem USB-Gerät geschehen soll, wenn ich es bei laufender VM einstecke. Hier war das nicht so. Also habe ich mir die .vmx-Datei der Windows-XP-VM angesehen, um zu verstehen, wie es dort konfiguriert ist. Die «Settings» der VM halfen überhaupt nicht, weil sich dort nur ein USB Controller konfigurieren lässt und sonst nichts.
In der vmx-Datei stand eine Zeile wie diese:
usb.autoConnect.device0 = “path:2/1/1/1 autoclean:1”
Das USB-Gerät sollte also an die VM durchgereicht werden, wenn es unter dem angegebenen Pfad gefunden wird. Keine gute Lösung, denn sie setzt voraus, dass das Gerät immer am selben Pfad hängt. Nach etwas Suchen fand ich einen KB-Artikel von VMware dazu: https://kb.vmware.com/s/article/1648
Ein sehr guter Artikel darüber, wie USB-Geräte automatisch an eine VM verbunden werden. Dafür gibt es mehrere Möglichkeiten:
- Pfad
- Vendor ID und/oder Product ID
- Name
Und du darfst all das sogar in einem String mischen.
Im Gespräch mit dem Kunden kam heraus, dass unterschiedliche Tastaturen im Einsatz sind, eine PID (Product ID) also vermutlich nicht für alle passt. Aus demselben Grund fiel «Name» weg, und wir stellten später fest, dass Windows 10 den Namen des Geräts ohnehin nicht kennt. «Path» war von Anfang an eine schlechte Idee, aber genau das hatte Workstation automatisch in die .vmx-Datei geschrieben.
Zum Glück kannst du dich auf die Vendor ID (VID) beschränken. Das schien uns am zuverlässigsten.
VID und PID eines USB-Geräts finden
Wie finde ich die Vendor ID meines Geräts heraus? Der KB-Artikel sagt auch dazu einiges, und auf einem Linux-Host wäre es einfach. Für Windows beschreibt er, in der Registry an einer bestimmten Stelle nach dem Namen des Geräts zu suchen. Und genau hier kam heraus, dass Windows 10 den Namen des Geräts nicht führt. Die Registry war also kein guter Weg.
Auftritt Geräte-Manager. Die gute alte Ansicht, per Rechtsklick auf «Start» oder direkt über «devmgmt.msc»:

Das öffnet diese Ansicht:

Um die VID und die PID eines Geräts herauszufinden, suchst du es, machst einen Rechtsklick und gehst in die Eigenschaften:

In den Eigenschaften wechselst du auf den Tab «Details» und stellst die Eigenschaft auf «Hardware-IDs»:

Hier siehst du VID und PID im String im Wertefeld.
In diesem Beispiel ist die Vendor ID (VID) 0E0F und die Product ID (PID) 0003.
In der vmx-Datei sieht das dann so aus:
usb.autoConnect.device0 = “vid:0E0F pid:0003 autoclean:1”
Und wenn du nur die Vendor ID verwenden willst, wie wir uns entschieden haben:
usb.autoConnect.device0 = “vid:0E0F autoclean:0”
Der Parameter autoclean
Du fragst dich vielleicht: Was ist autoclean?
Gute Frage. Ich zitiere direkt aus dem KB-Artikel:
autoclean:1 – autoconnect if a device matches the pattern, removed if the VM is powered on and no device matches the pattern, removed if disconnected through the UI.
autoclean:0, no autoclean – autoconnect if a device matches the pattern, not removed if the VM is powered on and no device matches the pattern, not removed if disconnected through UI. Although the autoconnect entries are not removed, the device will not autoconnect again after the user disconnects the device using the UI for that session of the VM. The same device will autoconnect when the VM is restarted or when the device is physically unplugged and replugged into the same port on the host.
Wir haben getestet und entschieden, dass für diesen Industrie-PC «autoclean:0» besser passt.
Die Lösung
Am Ende sah unser String so aus:
usb.autoConnect.device0 = “vid:0E0F autoclean:0”
Und wir haben das Verhalten mit unzähligen Neustarts und der Tastatur an verschiedenen USB-Ports geprüft.
Bei diesem Supportfall habe ich viel gelernt. Anwendungsfälle rund um Workstation sehe ich selten, aber als VMware-Fachperson im Unternehmen werde ich gefragt, sobald irgendwo ein Problem auftaucht und VMware auch nur erwähnt wird. Ich bin froh, dass ich den Fall genommen habe, noch froher, dass ich eine Lösung gefunden und den Kunden zufriedengestellt habe. Ich hoffe, dieser Post hilft jemandem mit einem ähnlichen Fall.