删除Windows中隐藏的物理网卡和网络虚拟化失败后的虚拟网卡
一、识别各类网络设备和网络连接
由于网络虚拟化会在物理机上新增许多虚拟网络设备 (包括虚拟网卡),情况会变得复杂,因而首先我们需要分清他们。当然如果没有进行网络虚拟化,那么就可以跳过这部分。网络虚拟化环境中,通过设备管理器应该可见:以Intel开始的物理网卡(根据物理网卡厂商而不同);Hyper-V Virtual Ethernet Adapter 虚拟网卡;Microsoft Network Adapter Multiplexor 网卡组(Windows Server 2012开始支持网卡组,通过命令lbfoadmin可以对网卡组进行管理,网卡组在网络虚拟化环境中经常出现);在显示隐藏设备后,还可见Hyper-V Virtual Switch Extension Adapter 虚拟交换机等。
而在网络和共享中心中的网络连接 可以简单的认为是上图部分网络设备的配置,其名称和属性可自定义,但其依赖的设备基本与上图对应。
下面我们看看这些网络连接的具体配置。
1、物理网卡的网络连接
其主要的设置是TCP/IPv4、TCP/IPv6协议和两个链路层拓扑发现协议。下图是名为Ethernet 04的物理网卡的网络连接属性。
2、网卡组的网络连接
如果仅仅配置网卡组,那么其网络连接配置和物理网卡基本相同,除了TCP/IPv4、TCP/IPv6协议和两个链路层拓扑发现协议外,还配置了使用Microsoft Load Balancing/Failover Provider协议。网卡组将多个物理网卡聚合,以实现网络连接的故障转移和负载均衡。而那些被聚合的物理网卡的网络连接只有Microsoft Network Adapter Multiplexor Protocol协议了。下图左侧是名为Management网卡组的网络连接属性,右侧是网卡组内名为Ethernet 01的物理网卡(被聚合的网卡之一)的网络连接属性。
3、虚拟网卡的网络连接
虚拟网卡一般情况下是在创建虚拟交换机后创建的,另外通过SCVMM可以在物理主机上创建更多虚拟网卡。虚拟网卡的网络连接和物理网卡的网络连接配置是一样的,因而虚拟网卡的作用和物理网卡原则上是一样,只不过虚拟网卡是建立在物理网卡之上。下图是名为vEthernet(Cluster)的虚拟网卡的网络连接属性。
4、虚拟交换机的网络连接
这里有两种情况:
如果虚拟交换机建立在独立的物理网卡之上(直接在Hyper-V管理器中创建的虚拟交换机属于这种情况),那么被用于创建虚拟交换机的物理网卡的网络连接被配置为只使用Hyper-V Extensible Virtual Switch协议。如下图是在名为Ethernet 01物理网卡上创建虚拟交换机后Ethernet 01物理网卡的网络连接属性
如果虚拟交换机建立在网卡组之上(在SCVMM中为主机配置基于网卡组的逻辑交换机后在主机中创建的虚拟交换机属于这种情况),那么被用于创建虚拟交换机的网卡组的网络连接被配置为只是用Hyper-V Extensible Virtual Switch协议,而被用于该网卡组的物理网卡配置如上面网卡组部分的描述。如下图左侧是创建名为Management Logical Switch的虚拟交换机后,创建了同名的网卡组的网络连接属性,右侧是网卡组内名为Ethernet 01的物理网卡(被聚合的网卡之一)的网络连接属性。
总结以上,创建虚拟网卡和网卡组时除了创建相应的网络设备 外,同时会相应的网络连接 ,但创建虚拟交换机只会创建相应的网络设备 ,却不会创建网络连接 ,虚拟交换机是建立在物理网卡或网卡组之上的,仅仅是对物理网卡和网卡组的网络连接进行的重新配置。
二、删除网络设备和网络连接
知道了各种网络设备和网络连接之间的关系后,再来删除目标就更加明确了,原则上应该遵循:
至上而下。先删除最上层网络设备和网络连接,再删除其基矗基本按照 虚拟网卡 > 虚拟交换机 > 网卡组 > 物理网卡 这样是顺序进行删除。否则那些失去依赖的网络设备和网络连接将会是最难对付的。如果涉及到集群,最好将需要删除的网络设备对应的网络不用于集群,可能的话解散集群。
从表及里。在GUI中删除或在PowerShell中删除,如果不行则在注册表中删除。慎用注册表,但往往终极解决方案却是注册表。
在哪里创建在哪里删除。在Hyper-V管理器中创建就在Hyper-V管理器中删除,在SCVMM中创建就在SCVMM中删除。当然事情往往没那么简单,创建却删不掉才是问题。
接下来根据各种场景我们来看看为什么要删除和如何删除。
1、删除虚拟网卡及其网络连接
(1)通过GUI和PowerShell
使用SCVMM控制台或SCVMM PowerShell为主机配置逻辑交换机后创建的虚拟网卡及其网络连接,正常情况下可以在SCVMM控制台或SCVMM PowerShell中进行删除,但有时由于主机硬件变更(主要是主板或网卡)或其他不可预料的情况,创建过程出现异常,试图删除配置进行恢复后,依然在主机上遗留下不应该存在的虚拟网卡或其网络连接,这时SCVMM就束手无策了,而这些虚拟网卡在主机上也无法通过GUI(通过设备管理器或Hyper-V管理器)直接进行删除。由于新的虚拟网卡命名时后缀会自动递增,因而这些多余虚拟网卡不会有太多妨害,但与之关联的网络连接往往也存在命名冲突的问题(由于网络连接名称不能重复,这些遗留的虚拟网卡的网络连接会占用名称),无法按自己的需要命名网络连接,对于许多人是无法接受的。
在主机上可以通过PowerShell查看和删除虚拟网卡及其网络连接。使用get-netadapter命令查看所有网卡,使用get-vmnetworkadapter –all查看所以虚拟网卡,使用get-vmnetworkadapter –managementos命令查看在主机上的虚拟网卡。使用remove-vmnetworkadapter –managementos –name 删除主机上指定的虚拟网卡和网络连接。
如果通过PowerShell无法查看和删除虚拟网卡及其网络连接,还可以尝试两个方法:其一是使用DevCon命令行工具,其二是直接操作注册表。
(2)通过DevCon命令行工具
删除网络设备本质上是删除设备的驱动程序,微软自己的DevCon命令行工具可以代替设备管理器来管理计算机设备,特别是那些隐藏的设备,DevCon命令行工具的下载和使用可以参考这里。将相应版本devcon.exe文件放到windows/system32目录中,以备命令行中调用,由于版本和兼容性问题DevCon也不是万能的。使用如下命令查询和删除虚拟网卡,其中为什么是路径root/vms_mp将在下面解释。
(3)通过注册表
作为最后手段,我们还可以通过注册表进行删除,这是件危险的事,请谨慎操作。使用regedit命令打开注册表。
先删除网络连接。打开节点HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Network/{4D36E972-E325-11CE-BFC1-08002BE10318},其下有许多GUID命名的节点,每个节点表示现在或曾今存在的网络连接,通过其下Connection节点中的Name属性可以知道该节点是表示哪个网络连接,删除之前记下这个GUID名称。删除以下路径中具有同样GUID名称的节点,在这些节点中可见网络连接的详细配置,甚至包括IP和子网掩码等:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/Tcpip/Parameters/Adapters/
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/Tcpip/Parameters/Interfaces/
再删除网络设备。打开节点HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/ROOT/VMS_MP/,这个位置是虚拟网卡驱动的配置路径,通过其子节点的FriendlyName属性,找到需要删除的网卡子节点,这也就是DevCon命令中出现的路径。
但是要删除这个子节点却不是件容易的事,由于注册表中该路径是系统关键路径,默认情况下这些子节点及其下所有节点和项都只在System账户控制下,其他账号无权操作,因而使用管理员administrator运行注册表也无济于事,但好在通过获取其所有权,可以最终让administrator获得操作权限。由于一次只能设置一个节点或项,这将是一件重复烦闷的工作。具体步骤如下:
在节点右键权限Permissions,虽然提示没有权限,但是却允许进入修改,选择高级Advanced,如下图修改所有者Owner以获取所有权。但需要注意,修改所有者后虽然无法确认对话框,但是选择放弃Cancel也能最终获得所有权。
关闭所有对话框,重新右键权限Permissions,这时已经可以添加用户administrator并授权了。从最深可见的节点中进行设置,直到其下所有节点和项都取得权限,最后删除整个子节点,重启主机。(其实该步骤也同理可用于获取在NTFS下受限的文件或文件夹的权限)
(物理网卡也可以按上面注册表的过程删除。另外值得一提的是,在注册表中与CurrentControlSet相同层级会有ControlSet001或ControlSet002等类似命名的节点,这些节点内拥有与CurrentControlSet相同的结构和数据,无需对ControlSet001或ControlSet002内的相应节点做删除,它们只是系统配置的拷贝,系统正常重启后它们将被CurrentControlSet中的修改覆盖。)
2、删除虚拟交换机
在网络虚拟化环境中,首先应通过SCVMM控制台或SCVMM PowerShell删除主机上的逻辑交换机或虚拟交换机,以正常移除SCVMM中对主机的相关配置,但如果在主机中发现依然存在未能删除的虚拟交换机,还可以在主机上通过Hyper-V管理器和Hyper-V Powershell进行删除。
如果无法完成,可以如同删除虚拟网卡一样使用DevCon命令行工具和操作注册表,只不过虚拟交换机驱动配置节点为HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/ROOT/VMS_VSMP,这里不再赘述。
3、删除网卡组
网络虚拟化环境中,如果给主机配置的逻辑交换机关联了带有网卡组的上行端口,那么总是会在主机上创建网卡组,并在网卡组上创建虚拟交换机。如果移除逻辑交换机失败,主机上遗留下了多于的网卡组,则可以在网卡组管理器或者PowerShell中删除。Windows Server 2012才支持网卡组,可以通过命令lbfoadmin打开网卡组管理器对网卡组进行管理,也可以使用remove-netlbfoteam命令。
这里谨慎使用DevCon命令行工具和注册表进行删除,本人没有测试是否会带来严重后果,但是可以很容易知道网卡组的注册表节点为HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/COMPOSITEBUS/MS_IMPLAT_MP。
网络中也有关于WMI的库文件损坏造成网卡组无法管理的案例,可尝试按如下过程进行修复,更多关于WMI库的修复,可以参考这里:
net stop winmgmt rename the folder %windir%/system32/wbem/Repository to Repository.oldrestart the systemwinmgmt /resetrepository disable all the network adapters remove HKLM/SYSTEM/CurrentControlSet/Control/Network/Config enable all the network adapters enable nic teaming
4、删除物理网卡
多余的物理网卡往往是由于硬件变动或者系统恢复后形成的,删除物理网卡相对简单些,在设备管理器或者DevCon命令行中均可进行删除,在注册表中的删除也可以参照虚拟网卡。