4,307 瀏覽數

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. 

17 個網友的想法 “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呢???謝謝!!

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

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

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

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

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

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

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

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

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

          • 還在尋找辦法中…..
            我有使用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

  4. 自動參照通知: KVM – RHEL5 update4 | Benjr.tw

發表迴響