KVM中的網絡簡介(qemu-kvm)
emu-kvm主要向客戶機提供了如下4種不同模式的網絡:
1)基於網橋(bridge)的虛擬網卡
2)基於NAT(Network Addresss Translation)的虛擬網絡
3)QEMU內置的用戶模式網絡(user mode networking)(QEMU/KVM的默認方式)
4)直接分配宿主機上的網絡設備的網絡(包括VT-d和SR-IOV)
除了特別的需要iptables配置端口映射、數據包轉發規則的情況,一般默認將防火墻所有規則都關閉,以避免妨礙客戶機中的網絡暢通
在QEMU命令行中,對客戶機網絡的配置(除物理網絡設備直接分配外)都是用"-net"參數進行配置的,
如果沒有設置任何的"-net"參數,默認使用
qemu-kvm提供了對一系列主流和兼容性良好的網卡的模擬,通過"-net nic,model=?"參數可以查詢到當前的qemu-kvm工具實現了哪些網卡的模擬
"rtl8139"網卡模式是qemu-kvm默認的模擬網卡類型
"e1000"是提供Intel e1000系列的網卡模擬,純的QEMU(非qemu-kvm)默認就是提供Intel e1000系列的虛擬網卡。
virtio類型是qemu-kvm對半虛擬化IO(virtio)驅動的支持
qemu-kvm命令行在不加任何網絡相關的參數啟動客戶機後,在客戶機中可以看到它有一個默認的RTL8139系列的網卡,當然由於沒有進行更多的網絡配置,這個模擬的網卡雖然在客戶機中可見,但是它使用的是用戶模式的網絡,其功能非常有限
查看物理機中的網卡信息:
lspci | grep Ethernet
qemu-kvm命令行中基本的"-net"參數的細節如下:
-net nic[, vlan=n ] [,m acaddr=mac] [,model=type ][,name=name] [,addr=addr] [,vectors=v]
執行這個命令行會讓QEMU建立一個新的網卡並將其連接到n號VLAN上
其中:
"-net nic"是必需的參數,表明這是一個網卡的配置。
1)vlan=n, 表示將網卡放入到編號為n的VLAN,默認為0。
2)macaddr=mac, 設置網卡的MAC地址,默認會根據宿主機中網卡的地址來分配
3)model= type, 設置模擬的網卡的類型,在qemu-kvm中默認為rtl8139。使用qemu-kvm -net nic,model=? 查詢kvm支持的網卡類型
4)name=name, 為網卡設置一個易讀的名稱,該名稱僅在QEMU monitor中可能用到。
5)addr=addr, 設置網卡在客戶機中的PCI設備地址為addr。
6)vectors=v, 設置該網卡設備的MSI-X向量的數量為n,僅對使用virtio驅動的網卡有效。設置為"vectors=0"是關閉virtio網卡的MSI-X中斷方式。
示例:
-net vlan=0,macaddr=fe:54:00:86:0d:04,model=rtl8139 ,name=eth0,addr=0x0
如果需要向一個客戶機提供多個網卡,可以多次使用"-net"參數
客戶機(即虛擬機中)中用一些工具查看網卡相關的信息如下:
lspci|grep Ethernet
ethtool -i eth1 #-i選項僅顯示驅動信息
ifconfig
在QEMU monitor中查看網絡的信息,如下:
info network
一、橋接網絡(客戶機和宿主機平等,都是局域網中的一個節點,二者網絡環境相同,類似vmare中橋接網絡)
在QEMU/KVM的網絡使用中,網橋(bridge)模式可以讓客戶機和宿主機共享一個物理網絡設備連接網絡,客戶機有自己的獨立IP地址,可以直接連接與宿主機一模一樣的網絡,客戶機可以訪問外部網絡,外部網絡也可以直接訪問客戶機(就像訪問普通物理主機一樣)。即使宿主機只有一個網卡設備,使用bridge模式也可知讓多個客戶機與宿主機共享網絡設備
qemu-kvm的命令行中,關於bridge模式的網絡參數如下:
-net tap [,vlan=n] [,name=str] [,fd=h] [,ifname=name] [,script=file] [,downscript=dfile] [,helper=helper] [,sndbuf=nbytes] [,vnet_hdr=on|off] [,vhost=on|off] [,vhostfd=h] [,vhostforce=on|off]
該配置表示連接宿主機的TAP網絡接口到n號VLAN中,並且使用file和dfile兩個腳本在啟動客戶機時配置網絡和在關閉客戶機時取消網絡配置
1) tap參數,表明使用TAP設備。TAP是虛擬網絡設備,它仿真了一個數據鏈路層設備(ISO七層網絡結構的第二層,需要IP地址,僅有mac地址),它像以太網的數據幀一樣處理第二層數據報。而TUN與TAP類似,也是一種虛擬網絡設備,它是對網絡層設備的仿真。TAP用於創建一個網絡橋,而TUN與路由相關。
2) vlan=n, 設置該設備VLAN編號,默認值為0。
3) name=name, 設置名稱,在QEMU monior中可能用到,一般由系統自動分配即可。
4) fd=h, h為整數,是連接到已經打開的TAP接口的文件描述符,一般不要設置該選項,而是讓QEMU自動創建一個TAP接口。在使用了fd=h的選項後,ifname、script、downscript、helper、vnet_hdr等選項都不可使用了(不能與fd選項同時出現在命令行中)。
5) ifname=name , 設置在宿主機中添加的TAP虛擬設備的名稱(如tap1、tap5等),當不設置這個參數時,QEMU會根據系統中目前的情況,產生一個TAP接口的名稱。
6) script file, 設置宿主機在啟動客戶機時自動執行的網絡配置腳本。
如果不指定,其默認值為"/etc/qemu-ifup"這個腳本,可指定自己的腳本路徑以取代默認值;
如果不需要執行腳本,則設置為"script=no"。
7) downscript=file, 設置宿主機在客戶機關閉時自動執行的網絡配置腳本。
如果不設置,其默認值為"/etc/qemu-ifdown";
如果戶機關閉時宿主機不需要執行腳本,則設置為"downscript=no"。
8)helper=helper, 設置啟動客戶機時在宿主機中運行的輔助程序,包括建立一個TAP虛擬設備,默認值為/usr/local/libexec/qemu-bridge-helper(編譯安裝)。一般不用自定義,采用默認值即可。
9) sndbuf=nbytes, 限制TAP設備的發送緩沖區大小為n字節, 當需要流量進行流量控制時可以設置該選項。其默認值為"sndbuf=0", 即不限制發送緩沖區的大小。
示例:
-net tap ifname=vnet0,script=/etc/qemu-ifup,downscript=no
其余幾個選項都是與virtio相關的,需要配合virtio使用
1)vnet_hdr =on | off, 設置是否打開TAP設備的"IFF_VNET_HDR"標識:
"vnet_hdr= off‘‘表示關閉這個標識,
"vnet_hdr=on" 表示強制開啟這個標識,如果沒有這個標識的支持,則會觸發錯誤。
IFF_VNET_HDR是tun/tap的一個標識,打開這個標識則允許發送或接受大數據包時僅做部分的校驗和檢查。打開這個標識,還可以提高virtio_net驅動的吞吐量。
2)vhost=on | off, 設置是否開啟vhost-net這個內核空間的後端處理驅動,只對使用MIS-X中斷方式的virtio客戶機有效。
3)vhostfs=h,設置去連接一個已經打開的vhost網絡設備。
4)vhostforce=on | off,設置是否強制使用vhost作為非MSI-X中斷方式的virtio客戶機的後端處理程序。
準備環境:
宿主機上進行如下操作
1) 要采用bridge模式的網絡配置,首先需要安裝兩個RPM包,即bridge-utils和tunctl,它們提供所需的brctl和tunctl命令行工具
yum install bridge-utils -y
tunctl工具可選安裝,centos 7.x系列需要編譯安裝
2) 查看tun模塊是否加載,如下:
lsmod | grep tun #註意這個模塊於是否安裝tunctl工具無關
如果tun模塊沒有加載,則運行"modprobe tun"命令來加載。當然,如果已經將tun編譯到內核(可查看內核config文件中是否有"CONFIG_TUN=y"選項),則不需要加載了。如果內核完全沒有配置TUN模塊,則需要重新編譯內核才行
3) 檢查/dev/net/tun的權限,需要讓當前用戶擁有可讀寫的權限。
ll /dev/net/tun
4) 建立一個bridge,並將其綁定到一個可以正常工作的網絡接口上,同時讓bridge成為連接本機與外部網絡的接口(下面設置是臨時生效,重啟機器或重啟網絡服務後,將會失效,最好是寫入到網卡配置文件中)
主要的配置命令如下:
brctl addbr br0
brctl addif br0 eth0 #這一步如果是ssh遠程連接將會斷開
brctl stp br0 on
ifconfig eth0 0
dhclient br0 這一步是自動獲取ip地址,可手動設置
route
需要將默認路由設備設置為br0
ping #測試網絡,ping外網
5 ) 準備qemu-ifup和qemu-ifdown腳本。
在客戶機啟動網絡前會執行的腳本是由"script"選項配置的腳本(默認為/etc/qemuif-up),該腳本中創建一個TAP設備並將其與bridge綁定起來。
qemu-ifup腳本中"$1"是qemu-kvm命令工具傳遞給腳本的參數(即ifname選項的值),它是(在宿主機使用ifconfig可看到)客戶機使用的TAP設備名稱(如tap0、tap1等,或者是前面提及的ifname選項的值)。
另外,其中的"tunctl"命令這一行是不需要的,因為qemu-bridge-helper程序已經會創建好TAP設備,這裏列出來只是因為在一些版本較舊的qemu-kvm中可能沒有自動創建TAP設備
cat >> /etc/qemu-ifup<<end
#!/bin/bash
#
bridge=br0
if [ -n "$1" ];then
tunctl -u $(whoami) -t $1
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
end
qemu-kvm工具在客戶機關閉時會自動解除TAP設備與bridge綁定,也會自動刪除已不再使用的TAP設備,所以qemu-ifdown這個腳本不是必需的,最好設置為"downscript=no"
安裝虛擬機:
qemu-kvm --enable-kvm -m 2048 -smp 2 \
-boot order=cd -hda /kvm/os/cs-01.qcow2 \
-cdrom /kvm/iso/CentOS-7-x86_64-Minimal-1804.iso \
-vnc :1 \
-net nic -net tap,ifname=tap0,script=/etc/qemu-ifup.sh,downscript=no \
-daemonize
啟動虛擬機:
qemu-system-x86_64 /kvm/os/cs-01.qcow2 -smp 2 -m 2048 \
-net nic -net tap,ifname=tap1,script=/etc/qemu-ifup,downscript=no \
-vnc :0 \
-daemonize
brctl show #如果在br0上綁定了tap設備,說明成功
ls /sys/devices/virtual/net/
使用vncviewer登錄到客戶機上,設置網絡(此時一定要像配置物理機一樣配置網絡環境)
KVM中的網絡簡介(qemu-kvm)