最近工作中要在Windows Server 2016/Hyper-V 10中運行Ubuntu16實例,需要制作出“即插即用”的鏡像文件,也就是安裝好后即可從外部SSH進去。之前我使用Hyper-V,習慣於內網動態分配IP模式下,采用External vSwitch作為虛擬機對外通信的接口。這種模式下虛擬機相當於局域網內新的一台主機,通過DHCP獲取自己的IP、Gateway等信息,非常方便。
但是這次內網實行的是靜態IP配置方案,每一台物理機有固定的且只能有1個IP。由於虛擬機內的進程需要和其他虛擬機進行通信,只能采用Internal vSwitch。這種模式下,相當於將物理機和虛擬機組件為一張新的子網,物理機扮演Gateway的角色,虛擬機對外通信必須經由物理機的轉發。熟悉VMVare的同學一定會發現,這種拓撲結構就是常說的NAT。
1.基於Ubuntu的ISO創建虛擬機,這一步比較簡單,Hyper-V提供了非常方便的圖形化界面進行操作。由於后續步驟需要聯網下載安裝包,所以此處先為Ubuntu實例配置External vSwitch。
2.安裝SSH服務端程序。用Hyper-V Connect進去,鍵入Shell:
1 sudo apt-get purge openssh-server 2 sudo apt-get install -y openssh-server 3 sudo service sshd start
3.向/etc/network/interfaces文件追加如下內容:
1 cat >> /etc/network/interfaces << EOF 2 auto eth0 3 iface eth0 inet static 4 address 192.168.1.100 5 netmask 255.255.255.0 6 gateway 192.168.1.1" 7 EOF
建議先用ifconfig命令確認一下網卡的名稱是不是為eth0。
鍵入Shell,重啟網絡:
1 sudo /etc/init.d/networking restart
4.關閉Ubuntu實例,然后將其導出。鍵入PowerShell:
1 $VmName = "Ubuntu16" 2 $Destination = "F:\vm-export" 3 Stop-VM -Name $VmName 4 Export-VM -Name $VmName -Path $Dstination
由此完成虛擬機鏡像的創建,復制虛擬機依賴的是$Destination目錄下的vhdx格式文件。換一台物理機,開始虛擬機鏡像的安裝。
1.創建Internal vSwitch,用PowerShell:
1 $HyperVVirtualSwitchName = "ISInternalSwitch" 2 New-VMSwitch -Name $HyperVVirtualSwitchName -SwitchType Internal 3 Get-NetAdapter | where { $_.Name -Match $HyperVVirtualSwitchName } | New-NetIPAddress -IPAddress "192.168.1.1" -PrefixLength 24
2.基於導出的Ubuntu鏡像和vSwitch,創建新的實例。鍵入PowerShell:
1 $VMName = "Ubuntu16" 2 $HyperVVirtualSwitchName = "ISInternalSwitch" 3 $VMPath = "F:\vm-import\$VMName" 4 $VHDX = "$VMPath\Virtual Hard Disks\Ubuntu16-TensorFlow10.vhdx" 5 New-VM -Name $VMName -SwitchName $HyperVVirtualSwitchName -Path $VMPath -VHDPath $VHDX -Generation 1 6 Start-VM -Name $VMName
3.最后一步,設置端口轉發和開啟防火牆。鍵入Windows批處理命令:
1 netsh interface portproxy delete v4tov4 listenport=22 2 netsh interface portproxy add v4tov4 listenport=22 connectport=22 connectaddress=192.168.1.100 3 netsh advfirewall firewall delete rule name="Ubuntu_SSH" 4 netsh advfirewall firewall add rule name="Ubuntu_SSH" protocol=TCP dir=in localport=22 action=allow
於此,Internal vSwitch的配置完成,用Putty對本機localhost或虛擬機所在遠程機器的局域網IP發起SSH連接請求,成功!