KVM – Network

在 RHEL5 update4 KVM 下設定 Virtual machine 時 Network 有兩種選項. 1.Virtual network 2.Shared physical device 但預設的只有 Virtual network.
kvm04
先來看看在 RHEL5 update 4 KVM 的環境預設會建立一個 bridge,由 QEMU 所提供出的 virbr0 預設安裝 Virtual machine 時網路卡的選擇也就是這種 Virtual network .

Virtual network – virbr0

  1. QEMU 會在你的 Linux 產生一個 bridge 虛擬裝置 "virbr0" .virbr0 不只是個單純的 NAT 而已,他是一個 NAT + DHCP 的架構,所有的 Virtual machine 都會透過 virbr0 來指派一個私人網域 (private IP).預設為 192.168.122.2 ~ 192.168.122.254 (在他的設定檔中可以定義其 DHCP 可指定的 IP 範圍).
  2. 其預設的 default gateway 為 192.168.122.1/24 ,所有在這架構下的 Virtual Machine 虛擬機器的封包都必須透過這 NAT 去連結到其他的網路.
  3. 如同一般的 NAT 所有的 Virtual Machine 虛擬機器都是被隱藏在 private 私人網域,所以外部不能直接連接到 Virtual Machine 虛擬機器上.
    kvm06
    這一個是由 Qemu 所產生所以設定檔存放在 /etc/libvirt/qemu/networks/default.xml

    [root@benjr ~]# cat /etc/libvirt/qemu/networks/default.xml
    <network>
    <name>default</name>
    <uuid>49a0ceb-5662-4a61-8149-98ea750d393b</uuid>
    <bridge name="virbr0" />
    <forward/>
    <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
    <range start="192.168.122.2" end="192.168.122.254" />
    </dhcp>
    </ip>
    </network>
    

    其中的 ip address 是 default gateway IP,range 則是DHCP clients 所能使用的範圍,都可以依據需求做改變.

Shared physical device

如果要使用第二種 "Shared physical device" 時需要經過手動設定才能使用.此時所有的 Virtual machine 的網路裝置就會像是串接在一個 Hub 或是 Switch 上,只要是同區段的 IP 都可以互通. 在 Linux 下網路的模式有一個東西叫做 Bridge mode,有點像將多個 NIC Adapter ports 透過一個虛擬出來的 Bridge(Switch) 全部串在一起,再透過一個虛擬出來的網路裝置出去,這就像是把 Linux 當成一個 switch 來使用了.
在一般的 Linux 環境下的方法也很簡單:我們也可以透過下面幾個簡單的指令來產生自己所需要的 Bridge 裝置出來.下面的圖示你可以很清楚的看出來虛擬 NIC 和實體 NIC 是如何透過 bridge 模式串接在一起.

kvm07

[root@benjr ~]# ifconfig eth0 0.0.0.0
[root@benjr ~]# brctl addbr bri0
[root@benjr ~]# brctl addif bri0 eth0
[root@benjr ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
bri0            8000.001517785dd6       no              eth0
virbr0          8000.000000000000       yes
[root@benjr ~]# ifconfig bri0 192.8.1.3
[root@benjr ~]# ifconfig bri0
bri0      Link encap:Ethernet  HWaddr 00:15:17:78:5D:D6 
          inet addr:192.8.1.3  Bcast:192.8.1.255  Mask:255.255.255.0
          inet6 addr: fe80::215:17ff:fe78:5dd6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14767 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:679328 (663.4 KiB)  TX bytes:9626 (9.4 KiB)
[root@benjr ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@benjr ~]# sysctl –p
[root@benjr ~]# service libvirtd reload
  1. 目標是用 eth0 來產生一個 bridge(bri0)
  2. 看這一些 eth 是在哪一個 bridge 上
  3. 設定一組 IP ,方便遠端管理使用
  4. 最後 Allow IP forwarding
  5. 之後所有設定在 eth0(bri0) 的 Virtual Machine 都可以互通了!!可以將剛剛的步驟寫在 /etc/rc.local,讓他在開機時候就會生效.
  6. reload libvirt
  7. 如果要讓 Virtual Machine 可以立即選擇 "Shared physical device" 需將 libvirtd 的服務重新載入設定.
    kvm05

Set fixed MAC address for your virtual system

另外最後的一個選項是我們自己指派給虛擬網卡一個 MAC address ,要設定虛擬網路裝置的 mac 他是有一個規則性的. mac :XY:XX:XX:XX:XX:XX ,mac 使用16進制來顯示 X 可為任何的16進制(0~9,A,B,C,D,E,F), Y 則只能使用 2, 6, A 或 E. 

19 thoughts on “KVM – Network

  1. 徵求轉載同意
    格主您好:
    因為您這篇文章寫得很實用,正符合小弟目前再學習的內容,因此想徵得您的同意將網頁的連結放在自己的Blog上。
    如果您許可,小弟會在連結後方加註「已取得同意」字樣。麻煩您了!謝謝您~
    小弟的Blog
    http://allen-library.blogspot.com/2010/10/kvm.html

  2. 想像您請教一下~!!
    我現在在Fedora 14 中,用SR-IOV create 了一個82599 的virtual function,並分配給我的Guest OS.
    在physical 的情況下,可以從另一台主機ping到,但無法從另一台主機ping guest OS內的VF網卡.
    我想讓guest OS 內的網卡能ping到另一台主機,那麼我必須要使用virbr0 還是create一個br0呢???謝謝!!

    1. 預設的 Virtual network 其模式為 NAT + DHCP 的架構,所以外部是看不到 Guest OS 的,建議使用 Shared physical device (br#).

      1. 非常感謝您的回覆
        已有嘗試”Shared physical device”的作法,但還是不成功……@@

        不知道應該設定PF(physical)的eth到bridge,還是設定要assign給Guest OS的VF(virtual)到bridge.

        補充一下:之前問的問題是想讓guest OS 內的 “VF” 能ping到另一台主機,這樣也是要透過Br0嗎?

        再請教一個問題~原則上,在Guest OS中是否一定要透過Bridge才能對外通訊?
        觀念上還有很多尚未釐清,希望您能給予指教!謝謝~

        1. 在虛擬主機上網路裝置是共享的,所以需要透過一個虛擬的 switch ,而這 switch 的模式可以有很多種.

          如果模式選為 Virtual network – virbr0 在外部的實體機器是 ping 不到 guest OS 內,所以建議使用 Shared physical device 的方式.

          還建議你可以使用 #brctl show 看目前實體和虛擬對應的情況.

          雖然我還沒使用過 SR-IOV 的技術實體建立虛擬主機,但依據 Intel 的 VT-c 資料還是需要 VMM 的虛擬 switch 那一層才是.

          1. 還在尋找辦法中…..
            我有使用Shared physical device的方法,但在Guest OS裡原本的82599 10G會變成一個模擬出來的100M eth.
            雖然是可以ping的到!!!但我重點是要有10G阿

            以下是我用brctl show的結果,eth8是我create出來的VF,我將它加入br0

            bridge name bridge id STP enabled interfaces
            br0 8000.063664b22e46 no eth8
            virbr0 8000.000000000000 yes
            ======================================================================================
            上網google了一下,感覺上以SR-IOV create出來的VF,應該就類似實體的pci device,可以透過pci passthrough的方式加到Guest裡.

            我在host內的PF以及VF都可以跟別台host互ping, 但一加到Guest裡,就完全ping不到了,就連Rx/Tx也都是0.

            有懷疑過是Firewall的問題,但也全部都關閉了(用/etc/init.d/iptables stop)

            再一次感謝您的回應~!

  3. About the virtual network (routed)
    There are two methods to connect VMs to network.
    As you say ,one is virtual network(routed and NAT) and the other is bridge.
    For I got a problem when I use the virtual network to organize my VMs which I want to be routed outside.
    I don’t know how to add the entry which can route the VMs outside to the route table in my host.

    My email is

    1. The Virtual network will assign IP via DHCP.The address includes IP , submask and default gateway
      It should be routable via this default gateway.

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *