1. 程式人生 > >KVM中的網絡簡介(qemu-kvm)

KVM中的網絡簡介(qemu-kvm)

ifconf 有效 eth1 基於 msi enable 關於 多個 system

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"參數,默認使用

"-net nic -net user"參數,進而使用完全基於QEMU內部實現的用戶模式下的網絡協議棧

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, 表示將網卡放入到編號為nVLAN,默認為0

2)macaddr=mac, 設置網卡的MAC地址,默認會根據宿主機中網卡的地址來分配

。若局域網中客戶機太多,建議自己設置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網絡接口到nVLAN,並且使用file和dfile兩個腳本在啟動客戶機時配置網絡和在關閉客戶機時取消網絡配置

1) tap參數,表明使用TAP設備。TAP是虛擬網絡設備,它仿真了一個數據鏈路層設備(ISO七層網絡結構的第二層,需要IP地址,僅有mac地址),它像以太網的數據幀一樣處理第二層數據報。而TUNTAP類似,也是一種虛擬網絡設備,它是對網絡層設備的仿真。TAP用於創建一個網絡橋,而TUN與路由相關。

2) vlan=n, 設置該設備VLAN編號,默認值為0。

3) name=name, 設置名稱,QEMU monior中可能用到,一般由系統自動分配即可

4) fd=h, h為整數,是連接到已經打開的TAP接口的文件描述符,一般不要設置該選項,而是讓QEMU自動創建一個TAP接口。在使用了fd=h的選項後,ifnamescriptdownscripthelpervnet_hdr等選項都不可使用了(不能與fd選項同時出現在命令行中)

5) ifname=name , 設置在宿主機中添加的TAP虛擬設備的名稱(如tap1tap5等),當不設置這個參數時,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_HDRtun/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)