初始化Windows虛擬機(KVM)的網卡IP
1. 通過cloudbase-init,這個是cloud-init的Windows版本。Cloudbase-init需要類似OpenStack等雲平臺的metadata service獲取初始化數據,如果我們實際環境中沒有使用這種復雜的管理平臺來管理KVM虛擬機,cloudbase-init用起來就比較麻煩,需要自己構建metadata。
2. 內置初始化腳本。在系統內編寫腳本,並添加到開機啟動。虛擬機開機以前,在宿主機上通過guestfs工具把初始化腳本需要的數據拷進虛擬機磁盤。這種方法適合使用腳本或功能簡單的自研平臺創建虛擬機的情況。
Cloudbase-init的方法暫且不表,本文先演示筆者管理的環境裏如何初始化Windows虛擬機的網絡配置。
操作環境
宿主機操作系統CentOS7.4
虛擬機操作系統 Windows Server 2012 r2
虛擬機擁有1塊網卡,我們的試驗任務就是讓內置腳本為這塊網卡配置制定的IP。
制作虛擬機鏡像
首先使用Windows Server 2012 r2的光盤ISO文件安裝一臺虛擬機,然後進行以下步驟:
1. 約定數據格式
文件名約定為nicinfo.ini,後續我們編寫的內置腳本將讀取該文件,內容格式如下:
ipsetup:1 ip:192.168.1.2 mask:255.255.255.0 gw:192.168.1.1 mac: 52:54:00:a0:d8:67 |
各字段意義:
ipsetup是一個標誌位,控制是否進行IP配置,1表示進行,0表示不進行。因為對虛擬機來說只有第一次啟動時需要配置IP,其他時間的重啟都不需要,所以內置腳本需要在完成IP配置後把ipsetup置0,防止腳本再次執行;
ip、mask、gw和mac分別是IP地址,網絡掩碼,網關和MAC地址。
2. 編寫powershell腳本
腳本名setup.ps1,可以讀取並解析符合上一步中所定義格式的數據,放在路徑C:\Windows\下
sleep 120 $ini = Get-Content "C:\Windows\nicinfo.ini" $hash = @{} foreach ($iniLine in $ini) { $key = $iniLine.split(':',2)[0] $value = $iniLine.split(":",2)[1] $hash."$key" = $value } $ipsetup=$hash["ipsetup"]
if($ipsetup -eq "1"){ $ip = $hash["ip"] $mask = $hash["mask"] $gw = $hash["gw"] $mac = $hash["mac"] $nic = Get-WmiObject win32_networkadapterconfiguration -filter "MACAddress='$mac'" $nic.EnableStatic($ip, $mask) $nic.SetGateways($gw, 1) $nic.SetDNSServerSearchOrder("8.8.8.8") $ini -replace "ipsetup:1","ipsetup:0" > tmp.ini mv -Force tmp.ini nicinfo.ini } |
開始讓腳本sleep 120秒是給網卡設備啟用時間,如果不等待,有可能會出現腳本在網卡起來之前就運行,導致配置IP失敗。
如果ipsetup值為1,腳本就按照給定的數據設置網卡信息,並在結尾把ipsetup置0 。
3. 添加腳本開機啟動
在“運行”中執行gpedit.msc,進入組策略管理,找到計算機配置->Windows設置->腳本(啟動/關機),雙擊“啟動”按鈕
切換到powershell標簽,點擊“添加”:
添加上一步中寫的腳本,然後點擊確定,就添加完成了。
設置完後把虛擬機關機,現在這個鏡像就可以拿來創建新的虛擬機了。
驗證
在宿主機上執行以下命令:
virt-copy-in -a vmdisk.img nicinfo.ini C:/Windows/ |
vmdisk.img是剛才制作好的虛擬機鏡像文件。
然後把虛擬機開機,過一會登錄虛擬機會發現網卡已經配置好了,
初始化Windows虛擬機(KVM)的網卡IP