Networking-eth0, lo, peth0, vif0.0, vif1.0,virbr0,xenbr0
Step 0 : Xen底下的網路架構
Step 1 : 虛擬還是實體
Step 2 : network-bridge
Step 3 : network-nat
Step 4 : network-route
Step 5 : 參考網頁
Step 0 : Xen底下的網路架構
在虛擬化下的環境就屬網路裝置最為複雜難懂,不過模式大致可以畫分成 3 種
1.network-bridge ,
2.network-nat
3.network-route
最主要就是看的懂虛擬與實際的網路裝置是怎麼對應的(Logical NICs <-> Physical NICs).
[root@benjr ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:02:B3:9D:87:65 .... 略 .... lo Link encap:Local Loopback .... 略 .... peth0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF .... 略 .... vif0.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF .... 略 .... vif1.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF .... 略 .... virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 .... 略 .... xenbr0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF .... 略 .... |
一般的 Linux 下的網路裝置名稱為 eth0,eth1...,但是在 Xen 底下許多的硬體裝置都是虛擬出來的(包括 Dom0 下的網路裝置也是). 這裡你會看到 eth0, lo, peth0, vif0.0, vif1.0, virbr0, xenbr0. 這些是什麼東西阿,我們直接來看下面這一張圖你會清楚了解 Xen 底下的網路裝置是怎麼一回事.下面我會針對每一項做說明.
因為使用不同的模式會有不同的虛擬裝置出現,所以上面的圖示是使用 RHEL5 所預設的 network-bridge 模式,上圖我只列出了 eth0, peth0, vif0.0, vif1.0 以及, 其中為例出的 lo 是 Loop device 也就是我們常在使用的 127.0.0.1 至於 virbr0 則是在 QEMU 所提供的 Bridge NAT 模式上來使用請參考 QEMU-Bridge NAT http://benjr.tw/node/520
Step 1 : 虛擬還是實體
Xen 主要網路裝置可以分成兩種,一個就是實體 Physical 的(peth0,peth1...)而另一種就是虛擬 Logical 出來的(eth0,eth1...)以及(vif
我們先來看目前所有的 Guest OS 有哪一些再來做說明.當然你看到的會和我的不盡相同.系統會依據不同的實體和虛擬的網路裝置以及 Guest OS 的不同做調整的.
#列出所有 domU [root@benjr ~]# xm list Name Id Mem(MB) VCPUs State Time(s) Domain-0 0 7619 4 r---- 43213.6 rhel4 1 512 1 -b--- 9601 |
規則很簡單:
1.不管是在 Dom0,還是DomU 你會看到 eth0,eth1...這些都是虛擬出來的網路卡裝置.
2.在 Dom0 裡面你可以看到 vif
3.他們的對應也相當簡單, vif
目前我的環境只有 Dom0(RHEL5) 以及一個 Guest OS(RHEL4),因為實體的網路卡裝置有 2 個所以我設定的 2 個 Xen Bridge,分別對應到不同的虛擬網卡,所以 Xen 底下整個網路裝置就像下面所示.
Peth0 -> 實體網路卡裝置(Physical NIC)
Peth1 -> 實體網路卡裝置(Physical NIC)
Dom0 -> eth0 -> vif0.0
Dom0 -> eth1 -> vif0.1
Dom1(RHEL4) -> eth0 -> vif1.0
Dom1(RHEL4) -> eth1 -> vif1.1
4.至於這些虛擬的裝置會如何對應到真實的裝置這就跟你所使用的模式有關,還記得剛剛提到的模式(network-bridge)下面的指令可以讓你目前環境 peth 是如何對應vif
[root@benjr ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.000000000000 no xenbr0 8000.feffffffffff no peth0 vif0.0 vif1.0 xenbr1 8000.fefffffffffe no peth1 vif0.1 vif1.1 [root@benjr scripts]# /etc/xen/scripts/network-bridge status .... 略 .... bridge name bridge id STP enabled interfaces virbr0 8000.000000000000 no xenbr0 8000.feffffffffff no peth0 vif0.0 vif1.0 xenbr1 8000.fefffffffffe no peth1 vif0.1 vif1.1 .... 略 .... |
Dom0 -> eth0 -> vif0.0 -> xenbr0 -> peth0 (實體網路卡裝置 Physical NIC)
Dom1(RHEL4) -> eth0 -> vif1.0 -> xenbr0 -> peth0 (實體網路卡裝置Physical NIC)
Dom0 -> eth1 -> vif0.1 -> xenbr1 -> peth1 (實體網路卡裝置Physical NIC)
Dom1(RHEL4) -> eth1 -> vif1.1 -> xenbr1 -> peth1 (實體網路卡裝置Physical NIC)
note: 其中的 vif
因為網卡是虛擬出來的所以 MAC 不太可能跟著網卡一起,所以每當產生新的 Guest Virtula Network(虛擬網卡)就會依據規則來產生:
XEN:
虛擬網路裝置的 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. 不過 Xen 建議使用的範圍 00:16:3e:xx:xx:xx. 這個區段是保留給 Xen 使用的.
VMware:
mac : 00:0c:29:xx:xx:xx 或是 00:50:56:xx:xx:xx 這個區段是保留給 VMware 使用的,VMware 建議固定 mac address 使用的範圍 00:50:56:[00-3F]:xx:xx .要不然就讓系統來指定.
Step 2 : network-bridge
要使用哪種模式定義在 /etc/xen/xend-conf.sxp 系統預設使用 Bridge 模式,主要會啟動 network-bridge 與 vif-bridge 這兩個 shell script.在這個模式下會看到一個裝置 xenbr0 ,接下來我會針對 xenbr0 來說明這是什麼東西.要認識 xenbr0 的最好方式是直接看 Networking 啟動時的步驟,當 Dom0 的 xend 啟動時, 首先會執行 /etc/xen/scripts/network-bridge 這個 script, 網路啟動步驟如下:
1.首先產生一個新的 bridge 名稱為 xenbr0
2.此時實體的網路裝置 eth0 會被關閉
3.實體的 eth0 IP 和 MAC addresses 會複製到虛擬的網路裝置中 veth0
4.實體的網路裝置 eth0 名稱會被修改成 peth0
5.虛擬的網路裝置 veth0 名稱會被修改成 eth0
6.peth0 和 vif0.0 會被連接到 bridge xenbr0 (此時的 xenbr0 就如同一個 switch)
7.bridge xenbr0, peth0, eth0 和 vif0.0 都會被啟動.
note: Dom0上的防火牆是不會引響到 DomU 的網路流通的.
當 RHEL5 Xen 安裝完成時系統預設的 Bridge(xenbri0) 只有一個,但是當我們有多張網卡時就需要手動設定多個 Bridge.假設系統沒有經過其他設定,其網路組態就像下面所描述的 Dom0(eth0) -> vif0.0 -> xenbr0 -> peth0.
如果我們系統上有多張實體網卡時就可以透過修改設定檔 /etc/xen/xend-config.sxp 讓虛擬的網路裝置可以透過其他實體裝置連接網路.
[root@benjr ~]# vi /etc/xen/xend-config.sxp ... #(network-script network-bridge) (network-script my-network-script) ... #把上面的修改成我自己設定的網路 script 名稱(my-network-script).接下來將我們的 my-network-script 修改成我們需要的組態即可. [root@benjr ~]# vi /etc/xen/scripts/my-network-script #!/bin/sh /etc/xen/scripts/network-bridge start vifnum=0 netdev=eth0 bridge=xenbr0 /etc/xen/scripts/network-bridge start vifnum=1 netdev=eth1 bridge=xenbr1 [root@benjr ~]# chmod a+x /etc/xen/scripts/my-network-script #不要忘記修改檔案的屬性. |
如果你是要臨時增加一個 Bridge 可用下面的指令.建立一個 Network bridge
[root@benjr ~]# /etc/xen/scripts/network-bridge start vifnum=1 bridge=xenbr1 netdev=eth1 vifnum=1 ;虛擬裝置號碼,系統預設有 8 個 loopback 裝置可以使用,而預設值為 0.可以在開機時指定 loopback 最大到32個 nloopbacks= bridge=xenbr1 ;設定 Network Bridge 名稱為 xenbr1,預設值為 xenbr${vifnum}. netdev=eth1 |
但是 DomU 啟動時是依據 vif-bridge 這個script 來執行.
當 domU 啟動時, xend (running in dom0) 會來執行這個 vif-bridge script, 虛擬網路啟動步驟如下:
1.將 vif
2.啟動 vif
所有的 scripts 都存放在 /etc/xen/scripts. 而 Bridge 只是 Xen 其中一種的網路模式,其他的還有 NAT's Networking 與 Routed Networking 這些後面會再介紹.
Step 3 : network-nat
[root@benjr ~]# vi /etc/xen/xend-config.sxp (network-script network-nat) #(network-script network-bridge) #(network-script network-route) (vif-script vif-nat) |
記得將 (network-script network-bridge) ,(vif-script vif-bridge) 做 "#" (把它當成註記).這樣所有的 Guest OS 當將可以使用 NAT 的模式,但是還需要修改一下 Guest OS 的設定檔案.不過先將 xen 的服務重新啟動.
[root@benjr ~]# /etc/init.d/xend restart |
修改 Guest OS 的設定檔,目前我系統上面有一個 GuesOS : RHEL4 ID=1,設定檔名稱也為 RHEL4
[root@benjr ~]# vi /etc/xen/rhel4 name = "rhel4" uuid = "cf67710d-b756-086b-8cde-be61d2faca1b" maxmem = 512 memory = 512 vcpus = 1 bootloader = "/usr/bin/pygrub" on_poweroff = "destroy" on_reboot = "restart" on_crash = "restart" vfb = [ "type=vnc,vncunused=1,keymap=en-us" ] disk = [ "phy:/dev/sda5,xvda,w" ] vif = [ "mac=00:16:3e:27:95:c0,ip=10.0.0.1" ] |
name
這就是 VM 的名稱,虛擬化的環境下其 VM 名稱必須為唯一的.
uuid
通用唯一識別碼(Universally Unique Identifier,UUID),系統會指定一個唯一的 uuid 來給每一台 VM.
maxmem
通常我們在指定記憶體大小給 Guest VM 時可以先指定多一點,但是多指定的時候並不會真的使用到這麼多,先指定的優點是系統可以線上直接增加 VM 記憶體大小.
memory
目前 VM 所真正使用的記體的多寡.
vcpus
在 VM 所使用的邏輯 CPU 數目.
bootloader
/usr/bin/pygrub 是 VM 所使用的 Bootloader 主要也就是將 VM 的 kernel/initrd 載入系統,類似於 GRUB,Xen 主要使用了 paravirtualized 的技術,他並不像是 VMware 使用 full virtualization 還有模擬出 BIOS 的環境.pygrub 還包含了一項 PXEBoot 的功能.
on_poweroff/reboot/crash
當系統在 poweroff/reboot/crash VM 所對應的動作為何,系統在 poweroff 是做 destory 其實也就是 poweroff 主要是將 VM 的記憶體肆放並將硬碟資料確切寫回,而 reboot/crash 則是將 VM 重新開機.
vfb
Xen 底下的 VM 都是透過 VNC 來傳送畫面,所以這裡的 vfb(virtual framebuffer device) 就是設定系統畫面與輸入裝置 Keyboard/Mouse.
disk
虛擬的 VM 所使用的硬碟模式可以為實體 partition 也可以為 p_w_picpath 的方式.
vif
這就是這一次要修改的重點 vif(virtual network devices).也就是和網路裝置相關的設定.vif = [ "mac=00:16:3e:27:95:c0,ip=10.0.0.1" ] 其中的 mac 可以不設定主要就是 IP,必須和 VM OS 所設定的 IP 相同.
回到 DomU 的 Guest OS (RHEL4) 將 IP 設定成跟剛剛在 Dom0 設定的一模一項.
# Xen Virtual Ethernet [root@DomU ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=10.0.0.1 NETMASK=255.255.255.0 GATEWAY=10.0.0.128 |
並且將 DomU 網路的服務重新啟動
[root@DomU ~]# service network restart |
將 DOMU(RHEL4) 重新啟動,回到DOM0 第一件事情你會發現 xen bridge(xenbr0) 不見了,而且 vif1.0(Guest OS:RHEL4 ID=1) 多了 IP 的設定值,這個是給 Guest OS 所使用的 default gateway.預設 default gateway 為 10.0.0.128 ,如果你的 DomU 的 Guest OS 有很多時,在 Dom0 下的每一個網路裝置 vif(Dom ID).0 都會產生不同的 default gateway 從 10.0.0.128 開始接下來的就會是 10.0.0.129.如此依序下去,不過在 DomU 的 Guest OS 只要隨便指定任何一個 default gateway 都可以. 當你選擇的網路為 NAT 時你的 Dom0 的網路裝置就像是一台 NAT ,所有的 Guest OS(DomU) 都會透過 NAT 來轉送 private IP 的資料.
1. 所有 domU 上的虛擬機器都是在相同的 Private 私人網域.
2. 所有 domU 虛擬機器的封包都必須透過 dom0 的 NAT 去連結到其他的網路.
3. 如同一般的 NAT 所有 domU 上的虛擬機器都是被隱藏在 private 私人網域,所以外部不能直接連接到 DomU 上的虛擬機器.必須透過 Dom0 的 default gateway.
現在回 Dom 0 觀察一下網路環境有什麼改變.使用指令 "ifconfig" 可以很清楚看到 vif1.0 自動得到的 IP 為 10.0.0.128
[root@benjr ~]# ifconfig vif1.0 vif1.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF inet addr:10.0.0.128 Bcast:0.0.0.0 Mask:255.255.255.255 inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:98 errors:0 dropped:0 overruns:0 frame:0 TX packets:73 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:32 RX bytes:11014 (10.7 KiB) TX bytes:9404 (9.1 KiB) |
使用 "iptables -L" 來看目前防火牆 iptables 狀態的確多了 10.0.0.1 的規則.
[root@benjr ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:bootps ACCEPT tcp -- anywhere anywhere tcp dpt:bootps Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT) |
使用指令 "route" 可以看到只要是傳給 10.0.0.1 (VM:RHEL4) 都是經過 vif1.0
[root@benjr ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.1 * 255.255.255.255 UH 0 0 0 vif1.0 192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0 192.8.1.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth0 |
如果你要讓 VM 虛擬機透過 dhcp 自動得到 ip,可以參考下列幾篇文章.
http://www.nikhef.nl/pub/projects/grid/gridwiki/index.php/Xen_3.2,_CentO...
Step 4 : network-route
未完成
Step 5 : 參考網頁
http://wiki.xensource.com/xenwiki/XenNetworking
http://wiki.kartbuilding.net/index.php/Xen_Networking