有玩過虛擬系統的人,大概都知道網路的架構與設定,對虛擬電腦來說,是很重要的一個環節,這關係著虛擬電腦能不能上網的問題,一旦不能上網,別說是要提供網路服務,連最基本的系統更新,都會是一個麻煩的大問題。
以 VMware Workstation 的版本來說,虛擬系統一安裝完成,就會建立三張虛擬網路卡,一張是 VMnet 0,走的是 bridge , 一張是 VMnwt 1 ,走的是 Host-only ,最後則是 VMnet 8 ,走的則是 NAT 的網路連線架構,而一般使用者,則依照虛擬電腦的屬性與用途,來選擇最適合的網路連線方式,且在相同網路連線模式內的虛擬電腦,彼此之間都可以相互連線,傳輸資料,那麼, Linux KVM 呢?
基本上,Linux KVM 的網路架構(就是 QEMU 的網路架構),與一般虛擬系統不太相同,不會像其他虛擬系統一樣,會先幫使用者架構好各種常用的網路連線架構,而預設 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 ,這又是什麼原因呢?原因如下:
若對於 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 ,這又是什麼原因呢?原因如下:
- 每台虛擬電腦建立的過程之中, Linux KVM 都會為其架構一組 VLAN ,雖然都是 VLAN 0 ,但彼此之間卻都是獨立封閉的網路架構,只能對外連線,卻無法與內部任何一台主機連線。
- 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
剛剛提到,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 還需要〝這樣〞使用,那就真的一點意義也沒有了,別放棄!可別太早將這麼好的套件丟至一旁,這當然有更有效率的方式,可以來執行並建立虛擬電腦,就期待接下來的介紹吧~
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
謝謝, 已更正
回覆刪除我買了 fedora kvm 核心虛擬系統這本書,使用 rhel ,應該與 fedora 一樣,但發現網路介面的部分,並沒有vlan 這類的名稱,看到的是 virbr0 與 vnet0,不知這兩個介面是??
回覆刪除VLAN 是 QEMU 提供的專屬網路架構, 可將他視為 Switch HUB, 而 virbr0 與 vnet0 是 RHEL 的網卡介面
回覆刪除