Hyper-V 中的陈旧 VM 交换机不再使用,当我尝试删除它时,它总是失败并显示以下消息:
PS C:\> Get-VMSwitch nat
Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
nat Private
PS C:\> Get-VMSwitch nat | Remove-VMSwitch -Force
Remove-VMSwitch : Failed while removing virtual Ethernet switch.
Switch delete failed, switch = 'acf82f05-c07c-4b35-8588-921498456027': General access denied error (0x80070005).
At line:1 char:20
+ Get-VMSwitch nat | Remove-VMSwitch -Force
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Remove-VMSwitch], VirtualizationException
+ FullyQualifiedErrorId : AccessDenied,Microsoft.HyperV.PowerShell.Commands.RemoveVMSwitch
尝试在 GUI 中删除不起作用,原因如下:
答案1
微软的 TechNet 论坛上已经解决了类似的问题:
我们在虚拟交换机管理器中设置了一个虚拟交换机,但使用网络和共享中心的“更改适配器设置...”错误地删除了该适配器。现在,显然交换机处于故障状态,我们只想将其从列表中删除。
最终,OP在注册表中进行了深入搜索,发现虚拟交换机配置存储在以下键中:
HKLM\SYSTEM\CurrentControlSet\Services\VMSMP\参数\SwitchList
在他们删除该键中的相应值并重新启动后,虚拟交换机就消失了。
与往常一样,我建议您.reg
在尝试进行类似的更改之前将当前设置导出到文件以进行适当的备份。
答案2
我不想安装 Azure Powershell 工具,所以我只是按照此视频中的步骤操作:https://www.youtube.com/watch?v=V5Gb342gSGg
基本上,您转到网络连接->打开要删除的虚拟交换机的属性->单击配置->转到驱动程序选项卡->卸载设备。
为了防止 Hyper-V 服务在我下次重新启动计算机时创建新服务而不完全禁用它,我将每个 Hyper-V 服务的启动类型更改为手动。
答案3
尽管我没有使用 Docker,但我想找到一个不使用的解决方案regedit
,因此在尝试之后RobV8R 的回答,我找到了说明MS Technet 上的这个问题。
Get-HNSNetwork | Remove-HNSNetwork
或者,对于更加筛选的选择,这就是我所需要的。
Get-HNSNetwork | ? Name -Like "Default Switch" | Remove-HNSNetwork
此外,我假设您会遵循@mxgg250 的建议,并将所有 hyper-v 服务设置为手动启动,否则它将在重新启动时重新创建开关。
答案4
开始编辑
Windows 10 的新版本引入了“默认网络”虚拟交换机。
如果此方法不起作用,请参阅@bradlis7 的回复以了解其他选项。
结束编辑
这已在 Windows 10 1607 上进行了测试。
简短回答,如果你使用 Docker:
PS> Stop-Service com.docker.service
PS> Remove-ContainerNetwork -Name nat
长答案:
如果您遇到这种情况并且启用了容器或安装了 Docker,则需要先停止 Docker,然后才能删除 VMSwitch。
PS> Get-VMSwitch
Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
DockerNAT Internal
nat Internal
Windows Phone Emulator Internal Switch Private
Primary Virtual Switch External Intel(R) Wireless
如您所见,我有一个名为的 VMSwitch nat
。我希望它消失。
PS> Remove-VMSwitch -Name nat
Confirm
Are you sure you want to remove the virtual switch "nat"?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Remove-VMSwitch : Failed while removing virtual Ethernet switch.
Switch delete failed, switch = '<guid>': General access denied error (0x80070005).
At line:1 char:1
+ Remove-VMSwitch -Name nat
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Remove-VMSwitch], VirtualizationException
+ FullyQualifiedErrorId : AccessDenied,Microsoft.HyperV.PowerShell.Commands.RemoveVMSwitch
答案其实很简单。因为我已经nat
为 VMSwitch 配置了 NetNat,所以我删除了 NetNat。我不确定这是否是必要的步骤,但我还是这么做了。
PS> Get-NetNat -Name '<name>' | Remove-NetNat
然后我停止了 Docker。
PS> Stop-Service com.docker.service
最后
PS> Remove-ContainerNetwork -Name nat
Confirm
Remove-ContainerNetwork will remove the container network "nat".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
为了确保它已经消失:
PS> Get-VMSwitch
Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
DockerNAT Internal
Windows Phone Emulator Internal Switch Private
Primary Virtual Switch External Intel(R) Wireless