2011年5月7日 星期六

Linux KVM 內網、外網,傻傻分不清


有玩過虛擬系統的人大概都知道網路的架構與設定對虛擬電腦來說是很重要的一個環節這關係著虛擬電腦能不能上網的問題一旦不能上網別說是要提供網路服務連最基本的系統更新都會是一個麻煩的大問題

VMware Workstation 的版本來說虛擬系統一安裝完成就會建立三張虛擬網路卡一張是 VMnet 0走的是 bridge 一張是 VMnwt 1 走的是 Host-only 最後則是 VMnet 8 走的則是 NAT 的網路連線架構而一般使用者則依照虛擬電腦的屬性與用途來選擇最適合的網路連線方式且在相同網路連線模式內的虛擬電腦彼此之間都可以相互連線傳輸資料那麼 Linux KVM

基本上Linux KVM 的網路架構就是 QEMU 的網路架構),與一般虛擬系統不太相同不會像其他虛擬系統一樣會先幫使用者架構好各種常用的網路連線架構而預設 Linux KVM 的網路連線架構如下圖






簡單說明一下,方框區域指的就是實體主機 Host OS 則是實體作業系統想當然 Guest OS 指的就是虛擬電腦的作業系統利用 Linux KVM 指令安裝的虛擬電腦預設的 IP 都是 10.0.2.15並存在一個 VLAN 的架構之內預設為 VLAN 0 ),使用 user mode 的連線模式內定預設),而且是透過 10.0.2.2 這個網路位點這個 IP 位置實際上是在 Host OS 裡面執行),來轉譯封包到實體網路卡上讓虛擬電腦可以對外進行網路連線這是只安裝一台虛擬電腦的網路架構一樣的若是再安裝另外一台虛擬電腦則會再形成另外一組 VLAN一樣是 VLAN 0 ),不只是相同的網路架構若再更進一步確認則會發現第二台虛擬電腦的 IP 一樣也是 10.0.2.15一樣可以對外連線到這邊可先別皺眉頭喔~

若對於 Linux 有點熟悉的使用者可能會試著修改 /etc/network/interfaces 這一個檔案並嘗試將 IP 取得模式 DHCP 改為 static手動設定或是稱為固定 IP ),並將兩台虛擬電腦設定為不同的 IP 10.0.2.10 10.0.2.11 Mask 則均為 255.255.255.0這樣設定才能確保可以對外連線),重新開機之後利用 ifconfig -a的指令就可以確認手動調整之後的 IP 是否正確有意思的是即使知道了 IP 位置但卻無法 ping 到對方除此之外也無法 ping 到外部的實體 IP 這又是什麼原因呢原因如下


  1. 每台虛擬電腦建立的過程之中 Linux KVM 都會為其架構一組 VLAN 雖然都是 VLAN 0 但彼此之間卻都是獨立封閉的網路架構只能對外連線卻無法與內部任何一台主機連線
  2. Linux KVM 預設對外關閉 ICMP 的網路協定所以對外 ping 的動作無法正常運作



那這樣Linux KVM 所建立的虛擬平台不就無任何用處只能單機運作這樣怎能架構雲端服務平台呢當然不是這樣如果真是如此那就不需要大費周章的介紹 Linux KVM

雖然 Linux KVM 有能力可以讓內部網路暢通不過卻是需由許多參數來完成那到底是怎樣讓內部網路可以相互連線呢其連線方式如下圖所示






在上圖可以看到兩組 VLAN 都是透過 10.0.2.2 這組 IP 來針對對外連線的封包進行轉址的動作而內網呢也就是兩組 VLAN 的連線則需要另外設定一組 Socket 來當做兩個 VLAN 之間溝通的橋樑這就是 Linux KVM 讓內網可以相互溝通的連線模式

剛剛提到Linux KVM 要讓 VLAN 之間可以連線溝通是需要搭配許多設定參數才能達成以兩台虛擬電腦連線為範例連線設定需要在動時一併加入相關參數首先動第一台虛擬電腦如上圖的 Domain 1):

$ qemu -net nic -net socket,listen=:8080 -m 512 -localtime -hda us1042.qcow -boot c


  • qemu之前有介紹過安裝 Linux KVM 其實就是安裝 qemu-kvm 且週邊硬體裝置原本就是由 QEMU 來負責驅動的差別只在於當 CPU 支援虛擬化技術時就會使用 kvm 反之則系統會自動改由 qemu 來執行
  • -net nic -net socket,listen=:8080這對參數主要就是針對虛擬網卡 nic 設定 socket 協定並指定連接埠為 8080



而第二台虛擬電腦的動指令則改為

$ qemu -net nic,vlan=2 -net socket,vlan=2,connect=127.0.0.1:8080 -m 512 -localtime -hda us1042_2.qcow -boot c


  • -net nic, vlan=2 -net socket, vlan=2, connect=127.0.0.1:8080一樣針對網卡並指定其 VLAN VLAN 2 一樣使用 socket 的通訊協定指定 VLAN 2 127.0.0.1 8080 通訊埠為連線介面與其他虛擬主機連線



設定並動完成馬上可以相互 ping 對方 IP 位置 /etc/network/interfaces 檔案內手動為兩台虛擬電腦設定的 IP 位置),不過這時會發現雖然內部網路可以溝通但對外網路的連線卻中斷了如果虛擬電腦有桌面系統就可以發現瀏覽器無法開網頁),相信這時各位應該火氣準備要上來了但還請耐著性子聽聽以下的解釋雖然我們利用 socket 的模式讓內部網路有了溝通連線的媒介但卻因此關閉了原本 user mode 的連線模式導致原本可以對外連線卻因此中斷了所以再上述兩個動虛擬主機的指令中還需要加上-net user的參數除此之外由於手動設定了 IP 位置還需要在 /etc/network/interfaces 檔案內加入gatway 10.0.2.2這樣才能真正對外透通網路連線

操作到這邊相信大家已經慢慢開始景仰 Linux KVM 這一套虛擬系統並準備開始遠離它了原因無他就是操作設定非常的不人性化沒有圖形介面就算了居然還需要記憶一大票的相關參數與設定才能讓虛擬電腦有正常的網路連線環境以上都只是小意思 Linux KVM 裡面一部可以正常運作的虛擬電腦完整的指令與參數大致如下

$ /usr/bin/kvm -S -M pc-0.12 -m 128 -smp 1 -name ffwNAT -uuid b102b78f-7e60-5f3e-9ae1-c3d0f397b17f -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/ffwNAT.monitor,server,nowait -monitor chardev:monitor -boot a -drive file=/var/lib/libvirt/images/ffwNAT.img,if=floppy,index=0,format=raw -net nic,macaddr=52:54:00:ff:ff:01,vlan=0,name=nic.0 -net tap,fd=60,vlan=0,name=tap.0 -net nic,macaddr=52:54:00:ff:ff:11,vlan=1,name=nic.1 -net tap,fd=61,vlan=1,name=tap.1 -chardev pty,id=serial0 -serial chardev:serial0 -parallel none -usb -vnc 127.0.0.1:0 -k en-us -vga cirrus

看昏頭了吧大概很少有人可以完整的將所有的參數與設定都記在腦袋瓜裡吧所以若要真的以 Linux KVM 原生指令來建立虛擬系統平台甚至是雲端服務平台我想這大概可以媲美不可能的任務吧但不要訝異就是需要這麼冗長的指令加參數虛擬電腦才能完整運作不過如果 Linux KVM 還需要這樣使用那就真的一點意義也沒有了別放棄可別太早將這麼好的套件丟至一旁這當然有更有效率的方式可以來執行並建立虛擬電腦就期待接下來的介紹吧~

4 則留言:

  1. 1.
    並將兩台虛擬電腦設定為不同的 IP ,如 10.0.2.10 與 10.0.2.11 ,netmask 則均為 10.0.2.2(這樣設定才能確保可以對外連線)

    是 netmask 還是 gateway ?

    2.
    利用 Lnux KVM 指令安裝的虛擬電腦,預設的 IP 都是 10.0.2.15

    應修正為 Linux

    回覆刪除
  2. 我買了 fedora kvm 核心虛擬系統這本書,使用 rhel ,應該與 fedora 一樣,但發現網路介面的部分,並沒有vlan 這類的名稱,看到的是 virbr0 與 vnet0,不知這兩個介面是??

    回覆刪除
  3. VLAN 是 QEMU 提供的專屬網路架構, 可將他視為 Switch HUB, 而 virbr0 與 vnet0 是 RHEL 的網卡介面

    回覆刪除