在上一篇 玩转神龙服务器的Hyper-V虚拟化网络之 配置NAT网络 的文章中我们使用NAT的方式使Hyper-V VM可以访问公网。在这一篇里,我们会使用直通网卡的特性来使VM有对外提供服务的功能。
前置条件
神龙服务器,一块主网卡。
另外,需要创建额外的辅助网卡,并创建EIP绑定到此辅助网卡。需要创建多少VM,就要创建多少辅助网卡和EIP。
安装Hyper-V
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
运行完后会自动重启两次。
创建虚拟机
这里我预先Copy了阿里云的镜像VHD文件win2016_64_dtc_1607_en-us_40G_noxen_20180801.vhd放在了D盘。我会为每一个虚拟机新建一个基于此VHD的差异磁盘。
$PathVHD = "D:\win2016_64_dtc_1607_en-us_40G_noxen_20180801.vhd"
$VMName = "VM1"
$HyperVRootPath = "D:\Hyper-V"
$VMMeorySize = 4GB
$VMVHD = "${HyperVRootPath}\${VMName}\Virtual Hard Disks\${VMName}.vhd"
New-VHD -ParentPath $PathVHD -Path $VMVHD -Differencing
New-VM -Name $VMName -MemoryStartupBytes $VMMeorySize -BootDevice VHD -VHDPath $VMVHD -Path $HyperVRootPath -Generation 1
在Hyper-V Server上直通网卡到VM
-
假定需要给VM使用的网卡的IP是192.168.88.20, 使用以下Powershell禁用此网卡,在神龙服务器,此网卡会消失并在设备管理器里不可见。
$AttachNicIP = "192.168.88.20" # 替换为真实IP $pnpDeviceID = $null Get-WmiObject Win32_NetworkAdapter | % { $config = $_.GetRelated('Win32_NetworkAdapterConfiguration') $IP = $config | Select-Object -expand IPAddress if($IP -like "*${AttachNicIP}*") { $pnpDeviceID = $_.PNPDeviceID } } if ($pnpDeviceID -eq $null) {throw "no device matches."} $dev = (Get-PnpDevice -PresentOnly).Where{ $_.PNPDeviceID -like $pnpDeviceID } Disable-PnpDevice -InstanceId $dev.InstanceId -Confirm:$false $locationPath = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $dev.InstanceId).Data[0] Dismount-VmHostAssignableDevice -LocationPath $locationPath -Force –Verbose
-
在分配直通网卡给VM时,VM要满足两个条件,一是VM的 自动停止操作 是 关闭电源。二是如果VM使用了动态内存,最小内存和启动内存要一致(我们这里用的是固定大小内存)。在我们前一步创建的VM,第二个条件已经满足。现在配置第一个条件并添加网卡。
$VM = Get-VM -Name $VMName Set-VM -VM $VM -AutomaticStopAction TurnOff Add-VMAssignableDevice -VM $vm -LocationPath $locationPath –Verbose Start-VM -Name $VMName
为VM安装网卡驱动
如果镜像中已经有最新的网卡设备,这时我们应该可以通过EIP访问VM。
没有带最新的网卡驱动,虚拟机网卡设备可能不能工作。这时需要给虚拟机安装网卡驱动。
驱动位于Hyper-V Server的 "C:ProgramDataaliyunvminitkvmwin10amd64"里。
-
将网卡驱动Copy到Guest VM里。方法有很多,你可以使用你所想到的方法。这里提供一个创建VHD,把驱动放进去,然后Attach 到VM里。
$DriverVHD = "${evn:Temp}\DriverData.vhdx" New-VHD -Path $DriverVHD -Dynamic -Size 1GB Mount-VHD -Path $DriverVHD $vhdobj = (Get-DiskImage -ImagePath $DriverVHD) $DataDrive = (Get-Disk -Number $vhdobj.Number) | Initialize-Disk -PartitionStyle MBR -PassThru | New-Partition -UseMaximumSize -AssignDriveLetter | Format-Volume -Confirm:$false -FileSystem NTFS -Force $DestPath = "{0}:\Drivers" -f $DataDrive.DriveLetter Copy-Item -Path "C:\ProgramData\aliyun\vminit\kvm\win10\amd64" -Filter net*.* -Destination $DestPath –Recurse Dismount-VHD -Path $DriverVHD Add-VMHardDiskDrive -VMName $VMName -Path $DriverVHD -ControllerType SCSI
-
在VM里安装驱动。在命令行或PowerShell里执行以下命令。这里的D盘是我们上一步Attach的虚拟磁盘。
pnputil -i -a D:\drivers\*.inf
当然,这个时候可以做一些清理工作像删除临时磁盘等,这里就不多说了。
到此,大功告成。可以通过EIP RDP到这个VM里了。感觉是不是多了一台ECS实例?当然你还可以创建很多台。。。