網絡是現代計算機系統不可或缺的一部分,QEMU也對虛擬機提供豐富的網絡支持。qemu-kvm中主要給客戶機提供了如下4種不同模式的網絡。
(1)基於網橋(Bridge)的虛擬網卡
(2)基於NAT(Network Addresss Translation)的虛擬網絡
(3)QEMU內置的用戶模式網絡(user mode networking)
(4)直接分配網絡設備(包括VT-d和SR-IOV)
本章主要講述其中第1、2、3種模式,其中第4種網絡設備的直接分配將在本書第5章中詳細講述。在介紹網絡的章節,除了特別的需要iptables配置端口映射、數據包轉發規則的情況,一般情況下,默認將防火牆所有規則都關閉以避免它妨礙客戶機中的網絡暢通,在實際生產環境中,請根據實際系統的特點進行配置。
QEMU命令行中,對客戶機網絡的配置(除了網絡設備直接分配之外)都是用“-net”參數來進行配置的,如果沒有設置任何的“-net”參數,則默認使用“-net nic -net user”參數從而使用完全基於QEMU內部實現的用戶模式下的網絡協議棧(將在4.4.4節詳細介紹)。
qemu-kvm提供了對一系列主流和兼容性良好的網卡的模擬,通過“-net nic,model=?”參數可以查詢到當前的qemu-kvm工具實現了那些網卡的模擬,如下命令行顯示了qemu-kvm-1.1.0中能模擬的網卡種類。
[root@jay-linux ~]# qemu-system-x86_64 -net nic,model=?
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio
其中,“rtl819”這個網卡模式是qemu-kvm默認的模擬網卡類型,RTL8139是Realtek半導體公司的一個10/100M網卡系列,是曾經非常流行(當然現在看來有點古老)且兼容性好的網卡,幾乎所有的現代操作系統都對RTL8139網卡驅動的提供支持。其中的“e1000”系列是提供Intel e1000系列的網卡模擬,純的QEMU(非qemu-kvm)默認就是提供Intel e1000系列的虛擬網卡。而其中的virtio類型是qemu-kvm對半虛擬化IO(virtio)驅動的支持(將會在第5章中詳細介紹virtio的基本原理、配置和使用)。
qemu-kvm命令行不加任何網絡相關的參數啟動客戶機后,在客戶機中可以看到它有一個默認的RTL8139系列的網卡(如下所示),當然由於沒有進行更多的網絡配置,這個模擬的網卡盡管在客戶機中可見,但其使用的是用戶模式的網絡,其功能非常有限(將在后面的4.4.4節中詳述)。
[root@kvm-guest ~]# lspci | grep Eth
00:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 20)
如下的命令行會模擬一個Intel e1000系列的網卡給客戶機使用。
qemu-system-x86_64 rhel6u3.img -net nic,model=e1000
在客戶機中看到的e1000系列網卡如下所示,默認是Intel 82540EM系列的網卡。
[root@kvm-guest ~]# lspci | grep Eth
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 03)
qemu-kvm命令行中基本的“-net”參數的細節如下:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]
它會讓QEMU建立一個新的網卡並將其連接到n號VLAN上。
其中,“-net nic”這個是必須的參數,表明這是一個網卡的配置。
vlan=n 表示將網卡放入到編號為n的VLAN,默認為0。
macaddr=mac 設置網卡的MAC地址,默認會根據宿主機中網卡的地址來分配;若局域網中客戶機太多,建議自己設置MAC地址以防止MAC地址沖突。
model=type 設置模擬的網卡的類型,qemu-kvm中默認為rtl8139。
name=name 為網卡設置一個易讀的名稱,該名稱僅在QEMU monitor中可能用到。
addr=addr 設置網卡在客戶機中的PCI設備地址為addr。
vectors=v 設置該網卡設備的MSI-X向量的數量為n,該選項僅對使用virtio驅動的網卡有效,設置為“vectors=0”是關閉virtio網卡的MSI-X中斷方式。
如需給一個客戶機提供多個網卡,可以多次使用“-net”參數即可。
在宿主機中用如下的命令行啟動一個客戶機,並使用上面的一些網絡參數。
[root@jay-linux kvm-demo]# qemu-system-x86_64 -m 1024 rhel6u3.img -net nic,vlan=0,macaddr=52:54:00:12:34:22,model=e1000,addr=08 –net user
在客戶機中用一些工具查看網卡相關的信息如下(這里使用了用戶模式的網絡棧,其詳細介紹請參考4.4.4節),可知上面的網絡設置都已生效。
[root@kvm-guest ~]# lspci | grep Eth
00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 03)
[root@kvm-guest ~]# ethtool -i eth1
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
bus-info: 0000:00:08.0
[root@kvm-guest ~]# ifconfig
eth1 Link encap:Ethernet HWaddr 52:54:00:12:34:22
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe12:3422/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:47 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1890 (1.8 KiB) TX bytes:6380 (6.2 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720 (720.0 b) TX bytes:720 (720.0 b)
在QEMU monitor中查看網絡的信息如下:
(qemu) info network
VLAN 0 devices:
user.0: type=user,net=10.0.2.0,restrict=off
e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:22
Devices not on any VLAN:
本節介紹的網絡設置的基本參數,但是由於沒有去詳細配置其具體的網絡工作模式,所以這里得到虛擬得到的網卡在客戶機中可能並不能連接上外部網絡,接下來的3個小節將詳細第介紹各個網絡工作模式的原理和配置方法。