我在 Hyper-V 下运行了几台虚拟机,用于测试。我使用 NIC 创建了一个“外部”虚拟交换机,以便虚拟机可以与主机 PC 一起访问互联网——创建交换机后,虚拟机和主机都可以访问互联网。但是,网络中其他 PC 到主机的文件和打印共享停止工作;在这种情况下,主机也用作文件服务器。
我从另一个尝试连接到主机的盒子进行了网络故障排除,并得到“文件和打印共享资源在线但没有响应连接尝试。”
我确实找到了这个文章,其中写道:
[当] 您创建一个名为“ExtSwitch”的外部虚拟网络交换机并将此虚拟交换机映射到名为“Intel(R) 82576 千兆双端口网络”的物理网络适配器时。单击“应用”按钮后,将在物理网络适配器的属性中处理以下更改:
- 解除以下服务、协议和客户端的绑定:Microsoft 网络客户端、Microsoft 网络文件和打印共享、TCP/IP 协议 IPv4、TCP/IP 协议 IPv6、物理网络适配器属性中列出的任何其他服务、客户端或协议。
- 绑定“Microsoft 虚拟网络交换机协议”
此外,在外部虚拟网络交换机(在本例中为 ExtSwitch)的属性中完成了以下更改:
- 绑定以下服务、协议和客户端:Microsoft 网络客户端、Microsoft 网络文件和打印共享、TCP/IP 协议 IPv4 和 TCP/IP 协议 IPv6。
- 解除绑定“Microsoft 虚拟网络交换机协议”。
看起来,“Microsoft 网络的文件和打印共享”应该重新绑定到新的外部交换机。
我应该指出,我最近已将 Creators 更新应用到我的所有机器上。
对于 Hyper-V 外部虚拟交换机,使用 NIC 会破坏同一连接上的文件和打印共享吗?
答案1
结论:禁用路由器中的 IPv6 解决了该问题。
我的解决方法是每当我重新启动运行 HyperV 的 PC 时运行此 PowerShell 脚本:
#Requires -RunAsAdministrator
# $name = "Ethernet 3"
$script:compid = "ms_server"
function Update-Binding
{
Param(
[Parameter(ValueFromPipeline = $true)]
[Microsoft.Management.Infrastructure.CimInstance[]]
$bindings
)
Process
{
# $bindings.Count
foreach ($binding in $bindings)
{
write-output ("Before disabling {0}" -f $binding.name)
Get-NetAdapterBinding -Name $binding.name -ComponentId $script:compid
Disable-NetAdapterBinding -Name $binding.name -ComponentId $script:compid
write-output ("After disabling {0}" -f $binding.name)
Get-NetAdapterBinding -Name $binding.name -ComponentId $script:compid
Start-Sleep -Seconds 3
Enable-NetAdapterBinding -Name $binding.name -ComponentId $script:compid
write-output ("After re-enabling {0}" -f $binding.name)
Get-NetAdapterBinding -Name $binding.name -ComponentId $script:compid
}
}
}
<#
# Get all ms_server bindings
#>
Update-Binding -bindings (Get-NetAdapterBinding | ? { $_.ComponentID -eq $script:compid })
完成此操作后,文件共享将在网络上运行。
但是,我使用的是 WRT1900AC 路由器,在某处读到(时间已经过去很久了,我找不到参考资料。)在此路由器上启用 IPv6 会导致问题。因此,我在路由器中禁用了 IPv6,一切又恢复正常。也许你们这些网络专家可以解释为什么会这样。
我想尝试另一个启用了 IPv6 的路由器,看看问题是否仅仅出在 WRT1900AC 上,但我还没能做到。