1. 程式人生 > >在kvm中使用網橋模式(BRIDGE NETWORKING MODE)

在kvm中使用網橋模式(BRIDGE NETWORKING MODE)

轉載自http://smilejay.com/2012/08/kvm-bridge-networking/ 感謝原博主的分享

在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兩個指令碼在啟動客戶機時配置網路和在關閉客戶機時取消網路配置。

tap引數,表明使用TAP裝置。TAP是虛擬網路裝置,它模擬了一個數據鏈路層裝置(ISO七層網路結構的第二層),它像乙太網的資料幀一樣處理第二層資料報。而TUN   與TAP類似,也是一種虛擬網路裝置,它是對網路層裝置的模擬。TAP被用於建立一個網路橋,而TUN與路由相關。

vlan=n  設定該裝置VLAN編號,預設值為0。

name=name  設定名稱,在QEMU monior中可能用到,一般由系統自動分配即可。

fd=h  連線到現在已經開啟著的TAP介面的檔案描述符,一般來說不要設定該選項,而是讓QEMU會自動建立一個TAP介面。當使用了fd=h的選項後,ifname、script、downscript、helper、vnet_hdr等選項都不可使用了(不能與fd選項同時出現在命令列中)。

ifname=name  設定在宿主機中新增的TAP虛擬裝置的名稱(如tap1、tap5等等),不設定這個引數時,QEMU會根據系統中目前的情況,產生一個TAP介面的名稱。

script=file  設定宿主機在啟動客戶機時自動執行的網路配置指令碼。如果不指定,其預設值為“/etc/qemu-ifup”這個指令碼,可指定自己的指令碼路徑以取代預設值;如果不需要執行指令碼,則設定為“script=no”。

downscript=dfile  設定宿主機在客戶機關閉時自動執行的網路配置指令碼。如果不設定,其預設值為“/etc/qemu-ifdown”;若客戶機關閉時宿主機不需要執行指令碼,則設定為“downscript=no”。

helper=helper  設定啟動客戶機時在宿主機中執行的輔助程式,包括去建立一個TAP虛擬裝置,它的預設值為/usr/local/libexec/qemu-bridge-helper,一般不用自定義,採用預設值即可。

sndbuf=nbytes  限制TAP裝置的傳送緩衝區大小為n位元組,當需要流量進行流量控制時可以設定該選項。其預設值為“sndbuf=0”,即不限制傳送緩衝區的大小。

其餘幾個選項都是與virtio相關的,這裡暫不做過多的介紹。

上面介紹了使用TAP裝置的一些選項,接下來通過在宿主機中執行如下幾個步驟來實現網橋方式的網路配置。

(1)要是用bridge模式的網路配置,首先需要安裝兩個RPM包,即:bridge-utils和tunctl,它們提供所需的brctl、tunctl命令列工具。可以用yum工具安裝它們,如下:

[[email protected] ~]# yum install bridge-utils tunctl

(2)檢視tun模組是否載入,如下:

[[email protected] ~]# lsmod | grep tun

tun                    12197  2

如果tun模組沒有載入,則執行“modprobe tun”命令來載入即可;當然,如果已經將tun編譯到核心(可檢視核心config檔案中是否有“CONFIG_TUN=y”選項),則不需要載入了;而如果核心完全沒有配置TUN模組,則需要重新編譯核心才行了。

(3)檢查/dev/net/tun的許可權,需要讓當前使用者擁有可讀可寫的許可權。

[[email protected] ~]# ll /dev/net/tun

crw-rw-rw- 1 root root 10, 200 Jul 20 16:23 /dev/net/tun

(4)建立一個bridge,並將其繫結到一個可以正常工作的網路介面上,並讓bridge成為連線本機與外部網路的介面。主要的配置命令如下面命令列所示。

[[email protected] ~]# brctl addbr br0    #新增br0這個bridge

[[email protected] ~]# brctl addif br0 eth0    #將br0與eth0繫結起來

[[email protected] ~]# brctl stp br0 on     #將br0加入到STP協議中

[[email protected] ~]# dhclient br0    #將br0的網路配置好

[[email protected] ~]# route   #參看路由表是否正常配置

Kernel IP routing table

Destination  Gateway         Genmask     Flags Metric Ref    Use Iface

192.168.0.0  *               255.255.0.0     U     0      0        0 br0

default    sqa-gate.tsp.or 0.0.0.0         UG    0      0        0 br0

[[email protected] ~]# ping 192.168.199.99 -c 1  #用ping測試網路通暢

PING 192.168.199.99 (192.168.199.99) 56(84) bytes of data.

64 bytes from 192.168.199.99: icmp_seq=1 ttl=64 time=4.16 ms

— 192.168.199.99 ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 4ms

rtt min/avg/max/mdev = 4.164/4.164/4.164/0.000 ms

[[email protected] ~]# dmesg

<! — …..  –>

device eth0 entered promiscuous mode

br0: port 1(eth0) entered forwarding state

建立bridge後的狀態是讓網路介面eth0進入混雜模式(promiscuous mode,接收網路中所有資料包),網橋br0進入轉發狀態(forwarding state),而且br0和eth0有相同的MAC地址,一般也會得到和eth0相同的IP。“brctl stp br0 on”是開啟br0的STP協議,STP是生成樹協議(Spanning Tree Protocol),它主要是為了避免在建有bridge的乙太網LAN中出現橋迴路(bridge loop)。如果不開啟STP,則可能出現迴路從而導致建有bridge的主機網路不暢通。

這裡預設是通過DHCP方式動態獲得IP;在綁定了bridge之後,也可以使用“ifconfig”和“route”等命令進行設定br0的IP、閘道器、預設路由等,需要將bridge設定為與其繫結的物理網路介面一樣的IP和MAC地址,並讓預設路由使用bridge(而不是ethX)來連通。這個步驟可能導致宿主機的網路斷掉,之後重新通過bridge建立網路連線,所以建立bridge這個步驟最好不要通過SSH連線遠端配置。另外,在RHEL系列系統中最好將NetworkManager這個程式結束掉,因為它並不能管理bridge的網路配置,反而它在後臺執行則可能對網路設定有些干擾。

(5)準備qemu-ifup和qemu-ifdown指令碼。

在客戶機啟動網路前,會執行的指令碼是“script”選項是由配置的(預設為/etc/qemuif-up),一般在該指令碼中去建立一個TAP裝置並將其與bridge繫結起來。如下是qemu-ifup指令碼的示例,其中“$1”是qemu-kvm命令工具傳遞給指令碼的引數,它是客戶機使用的TAP裝置名稱(如tap0、tap1等,也或者是前面提及的ifname選項的值)。另外,其中的“tunctl”命令這一行是不需要的,因為qemu-bridge-helper程式已經會建立好TAP裝置,這裡列出來只是為了可能在一些版本較舊的qemu-kvm中沒有自動建立TAP裝置。

#!/bin/bash

#This is a qemu-ifup script for bridging.

#You can use it when starting a KVM guest with bridge mode network.

#set your bridge name

switch=br0

if [ -n “$1” ]; then

#create a TAP interface; qemu will handle it automatically.

#tunctl -u $(whoami) -t $1

#start up the TAP interface

ip link set $1 up

sleep 1

#add TAP interface to the bridge

brctl addif ${switch} $1

exit 0

else

echo “Error: no interface specified”

exit 1

fi

由於qemu-kvm工具在客戶機關閉時會去解除TAP裝置的bridge繫結,也會自動去刪除已不再使用的TAP裝置,所以qemu-ifdown這個指令碼不是必需的,最好設定為“downscript=no”。如下列出一個qemu-ifdown指令碼的示例,是為了說明清理bridge模式網路的環境的步驟,在qemu-kvm沒有自動處理時可以使用。

#!/bin/bash

#This is a qemu-ifdown script for bridging.

#You can use it when starting a KVM guest with bridge mode network.

#Don’t use this script in most cases; QEMU will handle it automatically.

#set your bridge name

switch=br0

if [ -n “$1” ]; then

# Delete the specified interfacename

tunctl -d $1

#release TAP interface from bridge

brctl delif ${switch} $1

#shutdown the TAP interface

ip link set $1 down

exit 0

else

echo “Error: no interface specified”

exit 1

fi

(6)用qemu-kvm命令啟動bridge模式的網路。

在宿主機中,用命令列啟動客戶機和檢查bridge的狀態,如下:

[[email protected] kvm_demo]# qemu-system-x86_64 rhel6u3.img -smp 2 -m 1024 -net nic -nettap,ifname=tap1,script=/etc/qemu-ifup,downscript=no -vnc :0 -daemonize

[[email protected] kvm_demo]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.60eb692129b7       no              eth0

tap1

[[email protected] kvm_demo]# ls /sys/devices/virtual/net/

lo  br0  tap1

由上面資訊可知,建立客戶機後,添加了一個名為tap1的TAP虛擬網路裝置,它被繫結在br0這個bridge上。檢視到的三個虛擬網路裝置依次為:網路迴路裝置lo(就是一般IP為127.0.0.1的裝置)、前面建立好的bridge裝置br0、給客戶機提供網路的TAP裝置tap1。

在客戶機中,如下的幾個命令檢查網路是否配置好。

[[email protected] ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56

inet addr:192.168.63.144  Bcast:192.168.255.255  Mask:255.255.0.0

inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:2893 errors:0 dropped:0 overruns:0 frame:0

TX packets:102 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:465871 (454.9 KiB)  TX bytes:18099 (17.6 KiB)

Interrupt:11

[[email protected] ~]# ping vt-snb9 -c 1

PING vt-snb9.tsp.org (192.168.199.99) 56(84) bytes of data.

64 bytes from 192.168.199.99: icmp_seq=1 ttl=64 time=3.51 ms

— vt-snb9.tsp.org ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 4ms

rtt min/avg/max/mdev = 3.515/3.515/3.515/0.000 ms

[[email protected] ~]# route

Kernel IP routing table

Destination  Gateway       Genmask       Flags Metric Ref    Use Iface

192.168.0.0  *             255.255.0.0     U     0      0        0 eth0

default    sqa-gate.tsp.org 0.0.0.0         UG    0      0        0 eth0

而將客戶機關機後,在宿主機中再次檢視bridge狀態和虛擬網路裝置的狀態,如下所示。

[[email protected] kvm_demo]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.60eb692129b7       no              eth0

[[email protected] kvm_demo]# ls /sys/devices/virtual/net/

lo  br0

由上面輸出資訊可知,qemu-kvm工具已經將tap1裝置刪除了。

在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兩個指令碼在啟動客戶機時配置網路和在關閉客戶機時取消網路配置。

tap引數,表明使用TAP裝置。TAP是虛擬網路裝置,它模擬了一個數據鏈路層裝置(ISO七層網路結構的第二層),它像乙太網的資料幀一樣處理第二層資料報。而TUN   與TAP類似,也是一種虛擬網路裝置,它是對網路層裝置的模擬。TAP被用於建立一個網路橋,而TUN與路由相關。

vlan=n  設定該裝置VLAN編號,預設值為0。

name=name  設定名稱,在QEMU monior中可能用到,一般由系統自動分配即可。

fd=h  連線到現在已經開啟著的TAP介面的檔案描述符,一般來說不要設定該選項,而是讓QEMU會自動建立一個TAP介面。當使用了fd=h的選項後,ifname、script、downscript、helper、vnet_hdr等選項都不可使用了(不能與fd選項同時出現在命令列中)。

ifname=name  設定在宿主機中新增的TAP虛擬裝置的名稱(如tap1、tap5等等),不設定這個引數時,QEMU會根據系統中目前的情況,產生一個TAP介面的名稱。

script=file  設定宿主機在啟動客戶機時自動執行的網路配置指令碼。如果不指定,其預設值為“/etc/qemu-ifup”這個指令碼,可指定自己的指令碼路徑以取代預設值;如果不需要執行指令碼,則設定為“script=no”。

downscript=dfile  設定宿主機在客戶機關閉時自動執行的網路配置指令碼。如果不設定,其預設值為“/etc/qemu-ifdown”;若客戶機關閉時宿主機不需要執行指令碼,則設定為“downscript=no”。

helper=helper  設定啟動客戶機時在宿主機中執行的輔助程式,包括去建立一個TAP虛擬裝置,它的預設值為/usr/local/libexec/qemu-bridge-helper,一般不用自定義,採用預設值即可。

sndbuf=nbytes  限制TAP裝置的傳送緩衝區大小為n位元組,當需要流量進行流量控制時可以設定該選項。其預設值為“sndbuf=0”,即不限制傳送緩衝區的大小。

其餘幾個選項都是與virtio相關的,這裡暫不做過多的介紹。

上面介紹了使用TAP裝置的一些選項,接下來通過在宿主機中執行如下幾個步驟來實現網橋方式的網路配置。

(1)要是用bridge模式的網路配置,首先需要安裝兩個RPM包,即:bridge-utils和tunctl,它們提供所需的brctl、tunctl命令列工具。可以用yum工具安裝它們,如下:

[[email protected] ~]# yum install bridge-utils tunctl

(2)檢視tun模組是否載入,如下:

[[email protected] ~]# lsmod | grep tun

tun                    12197  2

如果tun模組沒有載入,則執行“modprobe tun”命令來載入即可;當然,如果已經將tun編譯到核心(可檢視核心config檔案中是否有“CONFIG_TUN=y”選項),則不需要載入了;而如果核心完全沒有配置TUN模組,則需要重新編譯核心才行了。

(3)檢查/dev/net/tun的許可權,需要讓當前使用者擁有可讀可寫的許可權。

[[email protected] ~]# ll /dev/net/tun

crw-rw-rw- 1 root root 10, 200 Jul 20 16:23 /dev/net/tun

(4)建立一個bridge,並將其繫結到一個可以正常工作的網路介面上,並讓bridge成為連線本機與外部網路的介面。主要的配置命令如下面命令列所示。

[[email protected] ~]# brctl addbr br0    #新增br0這個bridge

[[email protected] ~]# brctl addif br0 eth0    #將br0與eth0繫結起來

[[email protected] ~]# brctl stp br0 on     #將br0加入到STP協議中

[[email protected] ~]# dhclient br0    #將br0的網路配置好

[[email protected] ~]# route   #參看路由表是否正常配置

Kernel IP routing table

Destination  Gateway         Genmask     Flags Metric Ref    Use Iface

192.168.0.0  *               255.255.0.0     U     0      0        0 br0

default    sqa-gate.tsp.or 0.0.0.0         UG    0      0        0 br0

[[email protected] ~]# ping 192.168.199.99 -c 1  #用ping測試網路通暢

PING 192.168.199.99 (192.168.199.99) 56(84) bytes of data.

64 bytes from 192.168.199.99: icmp_seq=1 ttl=64 time=4.16 ms

— 192.168.199.99 ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 4ms

rtt min/avg/max/mdev = 4.164/4.164/4.164/0.000 ms

[[email protected] ~]# dmesg

<! — …..  –>

device eth0 entered promiscuous mode

br0: port 1(eth0) entered forwarding state

建立bridge後的狀態是讓網路介面eth0進入混雜模式(promiscuous mode,接收網路中所有資料包),網橋br0進入轉發狀態(forwarding state),而且br0和eth0有相同的MAC地址,一般也會得到和eth0相同的IP。“brctl stp br0 on”是開啟br0的STP協議,STP是生成樹協議(Spanning Tree Protocol),它主要是為了避免在建有bridge的乙太網LAN中出現橋迴路(bridge loop)。如果不開啟STP,則可能出現迴路從而導致建有bridge的主機網路不暢通。

這裡預設是通過DHCP方式動態獲得IP;在綁定了bridge之後,也可以使用“ifconfig”和“route”等命令進行設定br0的IP、閘道器、預設路由等,需要將bridge設定為與其繫結的物理網路介面一樣的IP和MAC地址,並讓預設路由使用bridge(而不是ethX)來連通。這個步驟可能導致宿主機的網路斷掉,之後重新通過bridge建立網路連線,所以建立bridge這個步驟最好不要通過SSH連線遠端配置。另外,在RHEL系列系統中最好將NetworkManager這個程式結束掉,因為它並不能管理bridge的網路配置,反而它在後臺執行則可能對網路設定有些干擾。

(5)準備qemu-ifup和qemu-ifdown指令碼。

在客戶機啟動網路前,會執行的指令碼是“script”選項是由配置的(預設為/etc/qemuif-up),一般在該指令碼中去建立一個TAP裝置並將其與bridge繫結起來。如下是qemu-ifup指令碼的示例,其中“$1”是qemu-kvm命令工具傳遞給指令碼的引數,它是客戶機使用的TAP裝置名稱(如tap0、tap1等,也或者是前面提及的ifname選項的值)。另外,其中的“tunctl”命令這一行是不需要的,因為qemu-bridge-helper程式已經會建立好TAP裝置,這裡列出來只是為了可能在一些版本較舊的qemu-kvm中沒有自動建立TAP裝置。

#!/bin/bash

#This is a qemu-ifup script for bridging.

#You can use it when starting a KVM guest with bridge mode network.

#set your bridge name

switch=br0

if [ -n “$1” ]; then

#create a TAP interface; qemu will handle it automatically.

#tunctl -u $(whoami) -t $1

#start up the TAP interface

ip link set $1 up

sleep 1

#add TAP interface to the bridge

brctl addif ${switch} $1

exit 0

else

echo “Error: no interface specified”

exit 1

fi

由於qemu-kvm工具在客戶機關閉時會去解除TAP裝置的bridge繫結,也會自動去刪除已不再使用的TAP裝置,所以qemu-ifdown這個指令碼不是必需的,最好設定為“downscript=no”。如下列出一個qemu-ifdown指令碼的示例,是為了說明清理bridge模式網路的環境的步驟,在qemu-kvm沒有自動處理時可以使用。

#!/bin/bash

#This is a qemu-ifdown script for bridging.

#You can use it when starting a KVM guest with bridge mode network.

#Don’t use this script in most cases; QEMU will handle it automatically.

#set your bridge name

switch=br0

if [ -n “$1” ]; then

# Delete the specified interfacename

tunctl -d $1

#release TAP interface from bridge

brctl delif ${switch} $1

#shutdown the TAP interface

ip link set $1 down

exit 0

else

echo “Error: no interface specified”

exit 1

fi

(6)用qemu-kvm命令啟動bridge模式的網路。

在宿主機中,用命令列啟動客戶機和檢查bridge的狀態,如下:

[[email protected] kvm_demo]# qemu-system-x86_64 rhel6u3.img -smp 2 -m 1024 -net nic -nettap,ifname=tap1,script=/etc/qemu-ifup,downscript=no -vnc :0 -daemonize

[[email protected] kvm_demo]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.60eb692129b7       no              eth0

tap1

[[email protected] kvm_demo]# ls /sys/devices/virtual/net/

lo  br0  tap1

由上面資訊可知,建立客戶機後,添加了一個名為tap1的TAP虛擬網路裝置,它被繫結在br0這個bridge上。檢視到的三個虛擬網路裝置依次為:網路迴路裝置lo(就是一般IP為127.0.0.1的裝置)、前面建立好的bridge裝置br0、給客戶機提供網路的TAP裝置tap1。

在客戶機中,如下的幾個命令檢查網路是否配置好。

[[email protected] ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56

inet addr:192.168.63.144  Bcast:192.168.255.255  Mask:255.255.0.0

inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:2893 errors:0 dropped:0 overruns:0 frame:0

TX packets:102 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:465871 (454.9 KiB)  TX bytes:18099 (17.6 KiB)

Interrupt:11

[[email protected] ~]# ping vt-snb9 -c 1

PING vt-snb9.tsp.org (192.168.199.99) 56(84) bytes of data.

64 bytes from 192.168.199.99: icmp_seq=1 ttl=64 time=3.51 ms

— vt-snb9.tsp.org ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 4ms

rtt min/avg/max/mdev = 3.515/3.515/3.515/0.000 ms

[[email protected] ~]# route

Kernel IP routing table

Destination  Gateway       Genmask       Flags Metric Ref    Use Iface

192.168.0.0  *             255.255.0.0     U     0      0        0 eth0

default    sqa-gate.tsp.org 0.0.0.0         UG    0      0        0 eth0

而將客戶機關機後,在宿主機中再次檢視bridge狀態和虛擬網路裝置的狀態,如下所示。

[[email protected] kvm_demo]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.60eb692129b7       no              eth0

[[email protected] kvm_demo]# ls /sys/devices/virtual/net/

lo  br0

由上面輸出資訊可知,qemu-kvm工具已經將tap1裝置刪除了。

在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兩個指令碼在啟動客戶機時配置網路和在關閉客戶機時取消網路配置。

tap引數,表明使用TAP裝置。TAP是虛擬網路裝置,它模擬了一個數據鏈路層裝置(ISO七層網路結構的第二層),它像乙太網的資料幀一樣處理第二層資料報。而TUN   與TAP類似,也是一種虛擬網路裝置,它是對網路層裝置的模擬。TAP被用於建立一個網路橋,而TUN與路由相關。

vlan=n  設定該裝置VLAN編號,預設值為0。

name=name  設定名稱,在QEMU monior中可能用到,一般由系統自動分配即可。

fd=h  連線到現在已經開啟著的TAP介面的檔案描述符,一般來說不要設定該選項,而是讓QEMU會自動建立一個TAP介面。當使用了fd=h的選項後,ifname、script、downscript、helper、vnet_hdr等選項都不可使用了(不能與fd選項同時出現在命令列中)。

ifname=name  設定在宿主機中新增的TAP虛擬裝置的名稱(如tap1、tap5等等),不設定這個引數時,QEMU會根據系統中目前的情況,產生一個TAP介面的名稱。

script=file  設定宿主機在啟動客戶機時自動執行的網路配置指令碼。如果不指定,其預設值為“/etc/qemu-ifup”這個指令碼,可指定自己的指令碼路徑以取代預設值;如果不需要執行指令碼,則設定為“script=no”。

downscript=dfile  設定宿主機在客戶機關閉時自動執行的網路配置指令碼。如果不設定,其預設值為“/etc/qemu-ifdown”;若客戶機關閉時宿主機不需要執行指令碼,則設定為“downscript=no”。

helper=helper  設定啟動客戶機時在宿主機中執行的輔助程式,包括去建立一個TAP虛擬裝置,它的預設值為/usr/local/libexec/qemu-bridge-helper,一般不用自定義,採用預設值即可。

sndbuf=nbytes  限制TAP裝置的傳送緩衝區大小為n位元組,當需要流量進行流量控制時可以設定該選項。其預設值為“sndbuf=0”,即不限制傳送緩衝區的大小。

其餘幾個選項都是與virtio相關的,這裡暫不做過多的介紹。

上面介紹了使用TAP裝置的一些選項,接下來通過在宿主機中執行如下幾個步驟來實現網橋方式的網路配置。

(1)要是用bridge模式的網路配置,首先需要安裝兩個RPM包,即:bridge-utils和tunctl,它們提供所需的brctl、tunctl命令列工具。可以用yum工具安裝它們,如下:

[[email protected] ~]# yum install bridge-utils tunctl

(2)檢視tun模組是否載入,如下:

[[email protected] ~]# lsmod | grep tun

tun                    12197  2

如果tun模組沒有載入,則執行“modprobe tun”命令來載入即可;當然,如果已經將tun編譯到核心(可檢視核心config檔案中是否有“CONFIG_TUN=y”選項),則不需要載入了;而如果核心完全沒有配置TUN模組,則需要重新編譯核心才行了。

(3)檢查/dev/net/tun的許可權,需要讓當前使用者擁有可讀可寫的許可權。

[[email protected] ~]# ll /dev/net/tun

crw-rw-rw- 1 root root 10, 200 Jul 20 16:23 /dev/net/tun

(4)建立一個bridge,並將其繫結到一個可以正常工作的網路介面上,並讓bridge成為連線本機與外部網路的介面。主要的配置命令如下面命令列所示。

[[email protected] ~]# brctl addbr br0    #新增br0這個bridge

[[email protected] ~]# brctl addif br0 eth0    #將br0與eth0繫結起來

[[email protected] ~]# brctl stp br0 on     #將br0加入到STP協議中

[[email protected] ~]# dhclient br0    #將br0的網路配置好

[[email protected] ~]# route   #參看路由表是否正常配置

Kernel IP routing table

Destination  Gateway         Genmask     Flags Metric Ref    Use Iface

192.168.0.0  *               255.255.0.0     U     0      0        0 br0

default    sqa-gate.tsp.or 0.0.0.0         UG    0      0        0 br0

[[email protected] ~]# ping 192.168.199.99 -c 1  #用ping測試網路通暢

PING 192.168.199.99 (192.168.199.99) 56(84) bytes of data.

64 bytes from 192.168.199.99: icmp_seq=1 ttl=64 time=4.16 ms

— 192.168.199.99 ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 4ms

rtt min/avg/max/mdev = 4.164/4.164/4.164/0.000 ms

[[email protected] ~]# dmesg

<! — …..  –>

device eth0 entered promiscuous mode

br0: port 1(eth0) entered forwarding state

建立bridge後的狀態是讓網路介面eth0進入混雜模式(promiscuous mode,接收網路中所有資料包),網橋br0進入轉發狀態(forwarding state),而且br0和eth0有相同的MAC地址,一般也會得到和eth0相同的IP。“brctl stp br0 on”是開啟br0的STP協議,STP是生成樹協議(Spanning Tree Protocol),它主要是為了避免在建有bridge的乙太網LAN中出現橋迴路(bridge loop)。如果不開啟STP,則可能出現迴路從而導致建有bridge的主機網路不暢通。

這裡預設是通過DHCP方式動態獲得IP;在綁定了bridge之後,也可以使用“ifconfig”和“route”等命令進行設定br0的IP、閘道器、預設路由等,需要將bridge設定為與其繫結的物理網路介面一樣的IP和MAC地址,並讓預設路由使用bridge(而不是ethX)來連通。這個步驟可能導致宿主機的網路斷掉,之後重新通過bridge建立網路連線,所以建立bridge這個步驟最好不要通過SSH連線遠端配置。另外,在RHEL系列系統中最好將NetworkManager這個程式結束掉,因為它並不能管理bridge的網路配置,反而它在後臺執行則可能對網路設定有些干擾。

(5)準備qemu-ifup和qemu-ifdown指令碼。

在客戶機啟動網路前,會執行的指令碼是“script”選項是由配置的(預設為/etc/qemuif-up),一般在該指令碼中去建立一個TAP裝置並將其與bridge繫結起來。如下是qemu-ifup指令碼的示例,其中“$1”是qemu-kvm命令工具傳遞給指令碼的引數,它是客戶機使用的TAP裝置名稱(如tap0、tap1等,也或者是前面提及的ifname選項的值)。另外,其中的“tunctl”命令這一行是不需要的,因為qemu-bridge-helper程式已經會建立好TAP裝置,這裡列出來只是為了可能在一些版本較舊的qemu-kvm中沒有自動建立TAP裝置。

#!/bin/bash

#This is a qemu-ifup script for bridging.

#You can use it when starting a KVM guest with bridge mode network.

#set your bridge name

switch=br0

if [ -n “$1” ]; then

#create a TAP interface; qemu will handle it automatically.

#tunctl -u $(whoami) -t $1

#start up the TAP interface

ip link set $1 up

sleep 1

#add TAP interface to the bridge

brctl addif ${switch} $1

exit 0

else

echo “Error: no interface specified”

exit 1

fi

由於qemu-kvm工具在客戶機關閉時會去解除TAP裝置的bridge繫結,也會自動去刪除已不再使用的TAP裝置,所以qemu-ifdown這個指令碼不是必需的,最好設定為“downscript=no”。如下列出一個qemu-ifdown指令碼的示例,是為了說明清理bridge模式網路的環境的步驟,在qemu-kvm沒有自動處理時可以使用。

#!/bin/bash

#This is a qemu-ifdown script for bridging.

#You can use it when starting a KVM guest with bridge mode network.

#Don’t use this script in most cases; QEMU will handle it automatically.

#set your bridge name

switch=br0

if [ -n “$1” ]; then

# Delete the specified interfacename

tunctl -d $1

#release TAP interface from bridge

brctl delif ${switch} $1

#shutdown the TAP interface

ip link set $1 down

exit 0

else

echo “Error: no interface specified”

exit 1

fi

(6)用qemu-kvm命令啟動bridge模式的網路。

在宿主機中,用命令列啟動客戶機和檢查bridge的狀態,如下:

[[email protected] kvm_demo]# qemu-system-x86_64 rhel6u3.img -smp 2 -m 1024 -net nic -nettap,ifname=tap1,script=/etc/qemu-ifup,downscript=no -vnc :0 -daemonize

[[email protected] kvm_demo]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.60eb692129b7       no              eth0

tap1

[[email protected] kvm_demo]# ls /sys/devices/virtual/net/

lo  br0  tap1

由上面資訊可知,建立客戶機後,添加了一個名為tap1的TAP虛擬網路裝置,它被繫結在br0這個bridge上。檢視到的三個虛擬網路裝置依次為:網路迴路裝置lo(就是一般IP為127.0.0.1的裝置)、前面建立好的bridge裝置br0、給客戶機提供網路的TAP裝置tap1。

在客戶機中,如下的幾個命令檢查網路是否配置好。

[[email protected] ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56

inet addr:192.168.63.144  Bcast:192.168.255.255  Mask:255.255.0.0

inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:2893 errors:0 dropped:0 overruns:0 frame:0

TX packets:102 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:465871 (454.9 KiB)  TX bytes:18099 (17.6 KiB)

Interrupt:11

[[email protected] ~]# ping vt-snb9 -c 1

PING vt-snb9.tsp.org (192.168.199.99) 56(84) bytes of data.

64 bytes from 192.168.199.99: icmp_seq=1 ttl=64 time=3.51 ms

— vt-snb9.tsp.org ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 4ms

rtt min/avg/max/mdev = 3.515/3.515/3.515/0.000 ms

[[email protected] ~]# route

Kernel IP routing table

Destination  Gateway       Genmask       Flags Metric Ref    Use Iface

192.168.0.0  *             255.255.0.0     U     0      0        0 eth0

default    sqa-gate.tsp.org 0.0.0.0         UG    0      0        0 eth0

而將客戶機關機後,在宿主機中再次檢視bridge狀態和虛擬網路裝置的狀態,如下所示。

[[email protected] kvm_demo]# brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.60eb692129b7       no              eth0

[[email protected] kvm_demo]# ls /sys/devices/virtual/net/

lo  br0

由上面輸出資訊可知,qemu-kvm工具已經將tap1裝置刪除了。

相關推薦

kvm使用模式(BRIDGE NETWORKING MODE

轉載自http://smilejay.com/2012/08/kvm-bridge-networking/ 感謝原博主的分享 在QEMU/KVM的網路使用中,網橋(bridge)模式可以讓客戶機和宿主機共享一個物理網路裝置連線網路,客戶機有自己的獨立IP地址,可以直接連

STM32F103RC微控制器ADC的間斷模式(Discontinous mode的使用

對於規則通道組,間斷模式下每轉換一個通道,EOC就會置位一次。因此不必像SCAN模式那樣必須採用DMA來搬運資料。 當DISCEN=1時開啟間斷模式,DISCNUM指定每次轉換的通道個數,範圍為1~8。 在下面的程式中,DISCNUM=011,每次轉換4個通道。L=1001

KVM修改模式Bridge後,原有虛擬機該如何修改配置

bridge場景說明:KVM虛擬機之前沒有設置為Bridge模式,然後就直接創建虛擬機了(當時網卡模式選擇的為default),後來調整KVM網卡模式為Bridge後,虛擬機沒法正常聯網。[[email protected]/* */ ~]# virsh shudown CentOS-7.3-X8

Qemu-kvm模式

kvm 多元化 網絡 qemu-kvm之橋接模式橋接原理圖 在qemu-kvm的橋接方式中,將宿主機的物理網卡橋接在br0,虛擬網卡vnet1,vnet0鏈接在eth0上,eth0相當於交換機。客戶機從網卡前驅上將信息發送早網卡後驅上,網卡後驅通過eth0將信息發送給br0,在此將信息發送出去。

linux絡的bridge、bonding、team

bond team 網橋Bridge:使真機和虛擬機的網卡可以直接交換數據,速度快NAT:虛擬機把數據先轉發給真機,真機再通過網卡傳輸,速度較慢在真機中的 /etc/sysconfig/network-scripts/目錄下查看文件 (註意:ifcfg-br0是網橋設置文件,ifcfg-enp0

docker模式報錯以及解決方案與測試

一、報錯:       在配置docker網橋模式的過程中,在配置好網絡卡和br0之後,在重啟網絡卡的過程中一直報以下這種錯誤: 配置檔案檢查了好多次,沒有錯誤,在網上查詢資料,很多都是相互抄襲,千篇一律,說是要關閉網路管理服務再重啟網絡卡 systemctl di

OpenVPN 模式

#vi /usr/local/etc/openvpn.conf port 1194 ;proto tcp proto udp dev tap0 #使用tap虛擬網絡卡,並明確指定對應虛擬介面tap0 ;dev tun ;dev-node MyTap #######以下四行指定了伺服器所需檔案,預設即可####

設計模式模式(Bridge)

       橋模式就是將抽象與其實現解耦,使他們可以分別獨立的變化,這裡所說的實現並不是我們所瞭解的派生類對抽象類的實現,橋模式中的抽象指的是抽象類及派生類,實現指的是這些抽象類及派生類實現自己的方式。橋模式也是繼承關係的一種替代實現。  我們來看一個汽車製造商製造汽車的

centos6.5模式配置

#cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BRIDG

[故障排除]記一次Docker模式無法訪問宿主機Redis

背景:   之前做了一個專案,需要在容器內訪問宿主機提供的Redis 服務(這是一個比較常見的應用場景哈), 常規方案: ①   主機網路(docker run --network=host): 完全應用主機網路堆疊,在容器內localhost就是指向宿主機 ②  &nbs

VMware三種模式組網(轉

完成 body 參數 比較 tails 信息 http 配置 通訊 VMware為我們提供了三種網絡工作模式,它們分別是:Bridged(橋接模式)、NAT(網絡地址轉換模式)、Host-Only(僅主機模式)。 打開VMware虛擬機,我們可以在選項欄的“編

BigDecimal 舍入模式(Rounding mode介紹

BigDecimal 舍入模式(Rounding mode)介紹 什麼樣的經歷,才能領悟成為架構師? >>>    1 RoundingMode介紹 package java.math; publ

Linux kernel boot process——從真實模式(real mode到保護模式(protected mode,再到分頁(paging

        本文簡要介紹X86-32架構下的Linux kernel被boot loader(如grub)載入到記憶體後,如何從最初的真實模式,切換到保護模式,並開啟分頁機制。本文不涉及boot loader如何將核心載入到記憶體,因為這是boot loader的事,跟

設計模式--spring原始碼使用策略模式(Strategy Pattern

策略模式(Strategy Pattern)中體現了兩個非常基本的面向物件設計的基本原則:封裝變化的概念;程式設計中使用介面,而不是對介面實現。策略模式的定義如下: 定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。策略模式使這些演算法在客戶端呼叫它們的時

Linux kernel boot process——從真實模式(real mode到保護模式(protected mode,再到分頁(paging .

       本文簡要介紹X86-32架構下的Linux kernel被boot loader(如grub)載入到記憶體後,如何從最初的真實模式,切換到保護模式,並開啟分頁機制。本文不涉及boot loader如何將核心載入到記憶體,因為這是boot loader的事,跟核

有關ie瀏覽器怪異模式(Quirks Mode對 HTML 頁面的影響的解決辦法

一: 把 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 改為 <!DOCT

怪異模式(Quirks Mode對 HTML 頁面的影響

轉載自:http://www.ibm.com/developerworks/cn/web/1310_shatao_quirks/#ibm-pcon 本文主要描述 Quirks Mode 和 Standards Mode 這兩種文件模式渲染頁面時的差異由來,並且給出一些詳細

HDFS block丟失過多進入安全模式(safe mode的解決方法

HDFS block丟失過多進入安全模式(Safe mode)的解決方法 背景及現象描述(Background and Symptom)  因磁碟空間不足,記憶體不足,系統掉電等其他原因導致dataNode datablock丟失,出現如下類似日誌: The n

【設計模式】使用unity實現代理模式(Proxy mode

閱讀《大話設計模式》後,自己根據unity的特性寫的一個簡單demo,如有不妥之處,歡迎評論糾正.... 先貼上書中的程式碼: using System; using System.Coll

Android開發——Activity的四種載入模式(launch mode

  上一篇部落格我們說了Activity的生命週期,這次我們要說的是Activity的四種載入模式。我們可以在manifest.xml中每個activity的launch mode屬性上設定。   Activity的載入模式?什麼意思?Activity的載入模式,就負責管理