1. 程式人生 > >由VMware USB驅動引發的USB介面“故障”解析

由VMware USB驅動引發的USB介面“故障”解析

   此前一直正常使用的DellU2311h顯示器上面的一個USB介面突然無法使用了,表現為插入什麼裝置都無法識別,但可以聽到有裝置插入和彈出的系統提示音。經過仔細觀察裝置管理器,發現不管在那一個USB介面插入什麼裝置,都會被識別為unknownusb device,硬體ID為USB\vid_0E0F & pid_0001,且提示驅動無法載入。

    故障分析:
      Dell U2311h顯示器上自帶了一個USBHub,一共有四個USB介面,顯示器側面兩個,底部兩個,通過顯示器自帶的一根USB電纜連線到主機板背部(顯示器上的四個USB介面是通過顯示器供電的,不是通過連線到主機板背部的USB線纜供電)。這次出故障的USB介面是底部的第一個介面,經過反覆測試發現,USB裝置只要插入其它三個USB介面或者機箱上的USB介面,都能正常使用,但一旦插入到顯示器底部對應的第一個USB,則出現上面的故障。

      既然插入和彈出裝置時系統有聲音提示,那說明物理連線應該是沒有問題的,所以極有可能是軟體故障。通過google那個unknownusbdevice的硬體id,發現這個id對應的硬體和vmware有關,於是很容易聯想到是VMware的USB功能導致的,把VMUSBArbService這個服務停掉後,撥下對應的裝置再次插上,這次終於被正常識別了。

   那麼為什麼會出現這樣的問題呢?

   VMware是一個很有名的虛擬機器軟體,眾所周知,虛擬機器是指共享宿主機的硬體,在宿主系統裡面再執行一個或多個獨立的作業系統。由於涉及到硬體層的操作,所以虛擬機器軟體必須要在宿主系統中載入很多驅動來實現虛擬系統的基本功能,比如:共享宿主機的網路,USB裝置,磁碟等等。在使用官方安裝包安裝的VMware的情況下,其會自動在宿主機系統服務裡面新增如下幾個服務且設為自動啟動:
   VMAuthdService (用於實現虛擬系統的認證的服務)
   VMnetDHCP   (用於實現虛擬機器的DHCP自動分配ip地址的服務)
    VMware NATService   (用於實現虛擬機器共享宿主機網路實現NAT的服務)
   VMUSBArbService      (用於實現共享宿主機USB裝置的服務)
   VMwareHostd      (這個是vmware 9.0及以後新增的服務)

    問題就出在VMwareUSB這個服務上面。這個服務的主要用於把接入宿主機的USB裝置接入到虛擬系統中這個功能,這個功能具體是如何實現我們不必深究,但過程有必要說一下。當把一個USB裝置插入宿主機之後,vmware會預設把這個裝置直接接入虛擬系統中去(除非在虛擬機器USB選項裡面禁用了自動接入USB裝置這個功能),此時,VMware就會為這個USB裝置載入一個名叫VMwareUSBDevice的驅動,推測這個驅動就是用於把USB裝置接入虛擬系統中。正常情況下,這個驅動載入不會出問題,驅動載入完成之後,USB裝置就會被接入到虛擬系統中去,而在宿主系統中這個USB裝置就會變成VMwareUSBDevice這個裝置,而不再是原來的裝置名了,也就是說此時該USB裝置只能在虛擬系統裡面使用,宿主機就已經無法再使用這個USB裝置了。

   VMware對於USB裝置的接入不知道是以什麼樣的方式來識別的,之所以會造成上面的“故障”,很明顯在載入VMwareUSB Device這個驅動的時候出了問題,造成了該驅動無法被正常載入,然後就會出現一個unknown usbdevice,如此一來,這個裝置在宿主機和虛擬機器都無法使用了,也就造成了對應的USB介面壞掉了的假象。

   當然這只是推測,具體到底是什麼情況還不得而知。而且奇怪的是,假設VMware USBDevice這個驅動未被正常載入,那應該只是對於那一個裝置無法正常使用,而不應該造成那個USB介面都不能使用。當然這可能也是VMware的一個小bug了吧。

   最後,推薦使用Vmware的朋友們可能把VMUSBArbService和VMwareHostd這兩個服務取消開機自動啟動(當然前提是用不到把USB裝置接入到虛擬系統中這個功能),改成手動啟動即可,這樣開機時可能會快一點點。