如果您正在進行NFV相關的開發,您可能會碰到如下的調試環境搭建問題:
在完成代碼編寫後如何快速進行功能調試和驗證,最好能將編碼、功能調試驗證在本地就可以完成,避免反覆拷貝到線上伺服器部署調試(物理環境的搭建和部署之痛苦相信很多NFV小夥伴深有體會);
可能您已經知道了可以藉助虛擬化技術可以在本地搭建網絡拓撲,但會碰到另外的問題,虛機的外設資源(例如若基於dpdk開發,重點需要關心cpu feature和網卡是否已經被支持)是否滿足NFV功能調試需求;
接著問題2,即使滿足,那麼本地如何產生測試流量;
如果上面的問題都不是問題了,那麼您的新問題可能會變為如何構建虛機,虛機外設資源如何選擇,如何打通虛機網絡.
筆者剛好對單機網絡及其虛擬化技術都有所涉獵,在一線開發過程中針對上述痛點積累了一些解決上述問題的方法,通過兩篇文章給大家分享出來,希望對大家的開發工作有所幫助和啟發。
本篇文章說明如果構建虛機,主要有如下幾個部分:
選擇hypervsior
如何構建虛機
如何訪問虛機
如何配置虛機網絡
通過上述步驟構建出虛機,可以為接下來的網絡拓撲環境搭建打下基礎;
選擇hypervsior
目前常見的hypervsior有vmware、virtbox、qemu/kvm;
筆者推薦使用qemu/kvm作為hypervisor,主要原因如下:
首先,vmware和virtbox都支持e1000類型網卡,但是這塊網卡的接受和發送隊列只有一個,通常情況下,這是無法滿足NFV產品的轉發模式的,因為一般都是每個cpu綁定負責輪詢網卡的一個接收隊列,如果只有一個隊列,是不能驗證多核轉發模式的,如果不能運行多核轉發模式,那麼可能無法對一些並發導致的問題進行針對性的調試驗證。
其次,vmware支持的vmnet3類型網卡可以支持多個隊列(需要求證),但是vmware是商業軟體,且vmware不支持目前比較火的virtio類型網卡,這樣對於雲上部署的NFV虛擬化產品是無法調試的;
再次,對於virtbox,目前的最新版本雖然是支持virtio,但是經過筆者測試,目前只能支持一個接口和發送隊列,是否能夠擴展隊列數目,還不得而知。
最後,對於qemu/kvm,目前各大公有雲廠商使用其作為雲主機的hypervsior,非常穩定且對外設模擬的支持非常豐富,因為開源,如果不滿足需求還可以進行深度定製。
如何構建虛機
選定qemu/kvm做為hypervisor後,如果構建虛機呢?
有兩個方法:
使用帶有圖形界面的工具:virt-manger(可以理解為類似virtualbox)
直接使用qemu命令行製作
如果不熟悉qemu的命令行參數,可以使用virt-manager來創建虛機鏡像和啟動虛機,如果熟悉qemu,則可以直接使用qemu來搞定,本質上,可以認為virt-manager是qemu的GUI前端。此外,若從來沒有接觸過qemu,那麼建議首先使用virt-manager來一步一步創建出一個虛機,然後通過virsh工具dump出虛機的配置文件(格式為xml),然後再查看qemu的命令行參數,通過對比xml文件和qemu的命令行參數,可以大概理解virt-manager/virsh/qemu這幾個組件之間的關係,隨著使用的越來越深入,若GUI沒有提供某些參數的配置入口,只要qemu已經支持了,那麼可以在當前的xml導出的qemu命令參數的基礎之上直接添加參數,然後直接啟動qemu即可。
為了方便進行腳本化和更加精細的配置外設,下面僅說明使用qemu來創建虛機鏡像和啟動虛機的過程,可以理解為將virt-manger創建虛機時進行的工作手動來完成。
1)製作虛機磁碟鏡像文件
qemu-img create -f qcow2 ./test.qcow2 30G2)在製作好的磁碟鏡像文件中安裝系統
qemu-system-x86_64 -m 512M -smp 2 -cpu host -enable-kvm -boot c -hda ./test.qcow2 -cdrom ./CentOS-7-x86_64-Minimal-2003.ios啟動安裝後如下圖,按照提示一步一步完成系統安裝;
3)啟動虛機
上述安裝完成後就可以啟動虛機了。在啟動虛機前,需要通過qemu命令行參數告訴qemu:為虛機模擬什麼外設及其外設類型具體是什麼;一般來說,要配置如下外設:
block:配置block硬體接口類型(IDE、virtio等)和存儲後端(如qcow2文件)
網卡:配置網卡類型(e1000、virtio等)和網絡後端(tap/vhost-user等)
VGA:不需要配置,因為qemu默認已經模擬並啟動了vncsever,需要配置的是vncserver的地址(ip和埠號),方便vncclient進行連接;
串口,當無法連接vncserver時,可以將虛機console的輸出,通過串口重定向輸出到host上;
對於NFV開發,我們更關心的是網卡類型,例如:下面的命令為虛機模擬三塊virtio類型的網卡,第一塊網卡類型為e1000, 第二塊和第三塊為virtio-net-pci
-netdev tap,id=net0,ifname=tap70,script=no -device e1000,netdev=net0,mac=00:0C:29:F1:07:00 -netdev tap,id=net1,ifname=tap71,script=no,vhost=on,queues=2 -device virtio-net-pci,netdev=net1,vectors=6,mq=on,mac=00:0C:29:F1:07:01 -netdev tap,id=net2,ifname=tap72,script=no,vhost=on,queues=2 -device virtio-net-pci,netdev=net2,vectors=6,mq=on,mac=00:0C:29:F1:07:02qemu的命令行參數非常複雜,如果不閱讀分析源碼,是比較難深入理解的,但是還是有規律可循的,比如上述的網卡配置這塊,主要有兩部分:
-device: 這個選項告訴qemu,為虛機模擬什麼樣的外設,例如:virtio-net-pci,即虛機看到一個掛載pci總線上的一個類型為virito的網卡,後面的參數vectors/mq/mac配置網卡的規格屬性,對於物理網卡,這些參數是設備的固有參數,對於模擬網卡,通過這些參數可以告訴qemu如何去設置模擬網卡的屬性;
-netdev:這個選項告訴qemu,虛機出來的流量如何處理。虛機的流量通過模擬的網卡接收和發送(對於非pass-through的設備),對於虛機的發送的流量,必然首先到qemu,那麼qemu如何處理和轉發流量就由這個選項來配置。一般這個選項決定了虛機網絡後端的實現方式,目前雲環境中主要使用兩種:一種是vhost-net模式, 另一種是vhost-user模式;
如何訪問虛機
創建好虛機後,如何登錄虛機並操作虛機呢?
接管虛機的console;
當虛機網絡還未打通時,這是唯一能夠登錄虛機的方式。一般情況下,通過配置虛機內核的命令行參數,可以將虛機的console重定向到兩個終端,一個tty0(顯示器和鍵盤),一個為ttyS0 (串口設備),qemu已經完整的為虛機模擬了VGA設備和串口,所以接管虛機的console非常容易。qemu支持很豐富的顯示選項,筆者一般使用vnc,所以只說明vnc如何配置使用。
tty0(vnc接管):
實現原理:虛機將輸出寫入VGA顯存(linux下表現為framebuffer),qemu可以定期讀取該framebuffer(為什麼可以讀取,因為顯存也是qemu為虛機分配的),然後將顯存數據重定向到vnc會話,qemu實現了一個vnc-server,用戶可以啟動vnc-client來連接vnc-server,這樣vnc-client就可以看到虛機的顯示輸出和注入按鍵了。
虛機配置:一般虛機不需要特殊配置,因為在內核命令行參數中已經將console配置為tty0了。
qemu命令行參數配置示例:
qemu vnc-server會根據上述配置監聽5009埠;
ttyS0:
實現原理:一般情況下串口是系統的最基本的設備,所以console也可以重定向到串口,qemu讀取虛機從串口的輸出、往串口注入數據,這樣也可以完成和虛機的交互。
虛機配置:在虛機的內核命令行參數增加ttyS0的配置:
qemu命令行參數配置:qemu命令行參數配置:
通過網絡ssh登錄;
通過網絡登錄首先要打通網絡,且虛機中運行sshd,並監聽22埠;網絡配置在下面「如何配置虛機網絡」小節進行說明。
如何配置虛機網絡
本節說明如何打通虛機和宿主機的網絡,注意,這個地方只關注如何通過宿主機登錄到虛機中,即打通管理網絡,虛機的業務網絡在「網絡搭建篇」進行說明。
筆者一直採用的方式是橋接的方式,這種方式配置比較簡單,且不用安裝其他組件,linux內核支持的比較完善和成熟,簡單配置就可以使用。
原理:使用tap設備對接虛機網卡的流量,然後將tap設備對應的netdev設備橋接到linux bridge上。路鋪好後就只需要在虛機和bridge上分別配置同一個子網的ip,這樣就可以三層互通了。配置示例如下:
虛機中:
ip a add 192.168.122.9/24 dev eth0ip l set dv eth0 up宿主機上:
brctl addbr virbr0ip l set dev virbr0 upip addr add 192.168.122.1/24 dev virbr0brctl addif virbr0 tap0ip l set tap0 up此外若虛機要訪問公網,也是比較簡單。首先要讓宿主機轉發虛機的流量,可以通過snat實現;host端配置如下:
iptables -t nat -A POSTROUTING -o <host-nic> -j MASQUERADE其次,需要有一個域名解析server來幫助虛機解析域名,同樣可以在宿主機上運行一個域名伺服器,可以採用dnsmasq:
在虛機中配置好dns server地址:
此外還要在虛機中增加默認路由,這樣虛機可以訪問公網了。
ip r add default via 192.168.122.1