天天看點

雲計算之虛拟化技術詳解—Xen虛拟化實戰

一、虛拟化的概述

虛拟化,是指通過虛拟化技術将一台計算機虛拟為多台邏輯計算機。在一台計算機上同時運作多個邏輯計算機,計算元件在虛拟的基礎上而不是真實的基礎上運作,是一個為了簡化管理,優化資源的解決方案。如同空曠、通透的寫字樓,整個樓層沒有固定的牆壁,使用者可以用同樣的成本建構出更加自主适用的辦公空間,進而節省成本,發揮空間最大使用率。這種把有限的固定的資源根據不同需求進行重新規劃以達到最大使用率的思路,在IT領域就叫做虛拟化技術。

虛拟化技術可以擴大硬體的容量,簡化軟體的重新配置過程。CPU的虛拟化技術可以單CPU模拟多CPU并行,允許一個平台同時運作多個作業系統,并且應用程式都可以在互相獨立的空間内運作而互不影響,進而顯著提高計算機的工作效率。

二、CPU虛拟化模型

在windows/linux系統上安裝虛拟機軟體,模拟主機。

雲計算之虛拟化技術詳解—Xen虛拟化實戰

VMM與其他程序一起運作在Kernel上,而Guest os運作在VMM上VMM為guest os模拟真實CPU硬體環境,,但Guest os卻不知道,認為自己直接運作在硬體上,執行普通指令VMM可直接排程到kernel執行,當需要執行特權指令時如申請記憶體,或者讀寫磁盤等操作,則由VMM通過BT技術做指令轉換代向kernel申請。

半虛拟化(需要修改guest os核心,隻限于可以修改核心的os)

雲計算之虛拟化技術詳解—Xen虛拟化實戰

不用BT轉換,讓它們知道自己運作在虛拟化環境中,普通指令可直接發往cpu執行,當需要運作特權指令時,它們通過系統調用去調用VMM:hypervisor 提供的Hypercall來實作。 

硬體虛拟化也稱完全虛拟化(HVM)

雲計算之虛拟化技術詳解—Xen虛拟化實戰

我們都知道cpu工作是分環的分别是ring 0、ring 1、ring 2、ring 3,Cpu硬體虛拟化其實是在cpu内部增加一層環 ring -1,這樣VMM運作在ring -1 上,guest os 運作在 ring 0 上,不過特權指令移到了ring -1 上,ring 0 依舊無法執行特權指令,當需要執行特權指令時,還需要發起系統調用。   這樣的好處是,直接可以在硬體級别捕獲guest os對特權指令的請求,我們不需要通過軟體的方式模拟出一個ring 0了,也不需要修改核心就可以讓guest os 工作了,性能不但有所提升,也可以支援更多的作業系統了。

Intel  VT-X

AMD AMD-V

三、記憶體虛拟化

雲計算之虛拟化技術詳解—Xen虛拟化實戰

傳統方式

當guest os 通路記憶體空間時,首先guest os 核心會将VA轉換成PA裝載進MMU,然後由VMM實作在MMU中将PA轉換成HA,再由VMM在記憶體中取得資料,傳回給PA。這種方式需要在MMU中緩存兩次,而每次都會在TLB中緩存,guest os 執行VA到PA轉換的結果和VMM執行PA到HA轉換的結果緩存至TLB中不會出現問題,但是多個虛拟機将VP到PA轉換結果緩存到TLB中時,就會出現問題。 因為,每個虛拟機都有從0開始的位址空間,當另一台虛拟機通路記憶體時,查TLB由于位址相同命中,傳回的資料卻是第一台虛拟機的資料,這樣就會出現TLB命中錯誤。 要解決此問題必須每次要清空TLB,這樣的話性能就大大降低了。

基于硬體的解決方案

MMU虛拟化  帶虛拟機标簽的TLB

當guest os 核心在MMU中将位址表裝載由VA轉換成PA時,VMM就與此同時在影子MMU(又稱shadow MMU)中直接将VA轉換成HA,這樣guest os 就可以直接從記憶體取資料了,看似guest os 核心的轉換,但是傳回的結果,不是查詢MMU中的結果,而是查詢影子MMU中的結果,是以在每一個guest os 裝載一個程序表的同時,VMM會裝載另外一張表,然後在影子MMU中完成另外一次轉換傳回真正實體記憶體的位址,而不是虛拟的連續的,線性位址空間中的位址。即使這樣由于TLB是一個key—value緩存,多個虛拟機的VA相同,還是會導緻TLB緩存錯誤的問題。于是有了帶虛拟機标簽的TLB查詢TLB的時候不但要查key在硬體級别還會自動檢查虛拟機的标記,如果标記不一緻就算key一緻也不會傳回命中結果。在一些專業級别支援虛拟化的CPU都支援(ring -1 shadow MMU,tagged TLB)

四、I/O虛拟化

雲計算之虛拟化技術詳解—Xen虛拟化實戰

完全虛拟化,Guest os本地調用完成封裝,交給VMM,VMM再完成封裝交給IO。 (封裝兩次)

半虛拟化,Guest os 直接通過前半段調用後半段驅動,由VMM在本地完成封裝交給IO。

IO-through,VMM把網卡配置設定給Guest-os用。在guest-os上直接安裝硬體驅動與硬體互動,IO透傳技術需要依賴IOMMU。

IOMMU

    實體機啟動的時候IO裝置控制器要在CPU總線上注冊使用IO端口用于與CPU通信,端口範圍在0~65530每個裝置隻有其中一段,就算是透傳技術,VMM将網卡配置設定給guest os 使用,guest os要識别也需要在内部注冊IO端口,但是這個IO端口與我們實體機的IO端口不一樣,當guest os 通過硬體向外發資料包或者存儲資料的時候,通過驅動程式所互動的IO端口最終還要變成硬體的IO端口,是以IOMMU就是完成轉換的。

五、認識Xen

Xen是一個開放源代碼虛拟機螢幕,由劍橋大學開發。它打算在單個計算機上運作多達100個滿特征的作業系統。作業系統必須進行顯式地修改(“移植”)以在Xen上運作(但是提供對使用者應用的相容性)。這使得Xen無需特殊硬體支援,就能達到高性能的虛拟化,xen官網http://www.xenproject.org/。

半虛拟化

Xen通過一種叫做半虛拟化的技術獲得高效能的表現(較少的效能損失, 典型的情況下大約損失 2%, 在最糟的情況下會有 8% 的效能耗損; 與其它使用完全的虛拟化卻造成最高到 20% 損耗的其他解決方案形成一個明顯的對比),甚至在某些與傳統虛拟技術極度不友好的架構上(x86),Xen也有極佳的表現。與那些傳統通過軟體模拟實作硬體的虛拟機不同,在3.0版本及在Intel VT-X支援前的Xen需要讓客戶作業系統(guest operating systems)與Xen API進行連接配接。到目前為止,這樣連結已經可以運用在NetBSD, GNU/Linux, FreeBSD和貝爾實驗室的Plan 9系統上。在Brainshare 2005會議上,Novell展示了NetWare與 Xen的連通。與Windows XP連通的技術曾在Xen開發初期進行,但微軟的協定未能允許它釋出。Sun微系統公司也正積極研究Solaris與Xen的連結,使其能在Xen平台上運作。

全虛拟化

Intel對Xen貢獻修改以支援其VT-X Vanderpool架構擴充。如果主系統支援Vanderpool或者Pacifica擴充(Intel和AMD對本地支援虛拟化的擴充),這項技術将允許未修改的客作業系統運作在Xen虛拟機中。事實上,那意味著性能的提升,并且你可以在沒有進行任何協定不允許的修改的情況下對Windows進行虛拟。

Linux核心2.6.24之後收錄Xen運作為domU功能。 Linux-2.6.37之後收錄了運作為dom0的功能,在linux-3.0之後收錄各種關鍵驅動及優化。

六、Xen半虛拟化結構圖

雲計算之虛拟化技術詳解—Xen虛拟化實戰

Xen直接工作在硬體上,而原來的核心作為子產品運作在dom0中,Xen負責管理CPU,記憶體,Xen在啟動的時候必須和dom0一起啟動,dom0是一個特殊的虛拟機,負責各domU-IO請求的管理,當domU需要請求IO時則通過前半段驅動與dom0的後半段驅動進行互動。

七、Xen網絡工作模型

橋接

雲計算之虛拟化技術詳解—Xen虛拟化實戰

Peth0是實體機網卡,由Dom0直接驅動,在橋接模式下時,xenbr0關聯至Peth0工作為一個虛拟交換機,當封包發進來時,xenbr0可以根據MAC轉發至橋接xenbr0上的主機對應的網絡接口。 那實體網卡工作成交換機了,dom0本身怎麼接受封包? 是這樣的,dom0在本地又虛拟了一塊網卡,MAC對應為實體網卡的MAC,當目标為dom0的封包發進來時,由xenbr0根據目标MAC轉發至自己的虛拟網絡接口。

路由模式

雲計算之虛拟化技術詳解—Xen虛拟化實戰

    此時xenbr0扮演着一個路由器的角色工作在IP層,dom1 eth0将網關指向 Vif0 ,可以通過實體網卡eth0轉發至外網,當外部主機回包的時候,沒有把網關指向dom0或者沒有到dom0 的路由,就回不了包了。

NAT模式

雲計算之虛拟化技術詳解—Xen虛拟化實戰

通過iptables做nat位址轉換。

僞網絡接口(dummy0)

雲計算之虛拟化技術詳解—Xen虛拟化實戰

這裡可以了解為僅主機模式

僞網橋

雲計算之虛拟化技術詳解—Xen虛拟化實戰

隻作為一個内部通道,所有連到網橋上的domu 可以互相通信,但是無法跟dom0通信,也無法跟外部通信。

八、在CentOS6.5上安裝XenServer

Rpm源:

http://au2.mirror.crc.id.au/pub/el6-dom0/el6/$basearch/

http://au1.mirror.crc.id.au/repo/el6/$basearch/

http://us1.mirror.crc.id.au/repo/el6/$basearch/

http://us2.mirror.crc.id.au/repo/el6/$basearch/

http://us3.mirror.crc.id.au/el6/$basearch/

http://us5.mirror.crc.id.au/repo/el6/$basearch/

http://uk1.mirror.crc.id.au/repo/el6/$basearch/

1、安裝支援xen的核心

yum install kernel-xen-3.7.4-1.el6xen.x86_64.rpm  kernel-xen-firmware-3.7.4-1.el6xen.x86_64.rpm   kernel-xen-release-6-4.noarch.rpm -y

雲計算之虛拟化技術詳解—Xen虛拟化實戰

2、安裝xen程式

yum install xen-devel-4.1.3-2.el6.x86_64.rpm  xen-doc-4.1.3-2.el6.x86_64.rpm  xen-4.1.3-2.el6.x86_64.rpm  xen-libs-4.1.3-2.el6.x86_64.rpm  xen-licenses-4.1.3-2.el6.x86_64.rpm  xen-runtime-4.1.3-2.el6.x86_64.rpm  xen-hypervisor-4.1.3-2.el6.x86_64.rpm -y

3、修改/etc/grub.conf 檔案

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (3.7.4-1.el6xen.x86_64)

        root (hd0,0)

        kernel /xen.gz dom0_mem=512M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin

        module /vmlinuz-3.7.4-1.el6xen.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

        module /initramfs-3.7.4-1.el6xen.x86_64.img

title CentOS (2.6.32-431.el6.x86_64)

        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

        initrd /initramfs-2.6.32-431.el6.x86_64.img

參數詳解:

kernel /xen.gz  //指定核心

dom0_mem=512M  //指定dom0的記憶體大小

cpufreq=xen  //Cpu運作頻率由xen控制

dom0_max_vcpus=2  //指定dom0中虛拟cpu的個數

dom0_vcpus_pin   //是否把dom0綁定在某個cpu實體核心上

注意禁用NetworkManager和Selinux,然後重新開機從新核心啟動。

雲計算之虛拟化技術詳解—Xen虛拟化實戰

驗證Xen 是否正常啟動

雲計算之虛拟化技術詳解—Xen虛拟化實戰

九、建立虛拟機執行個體

Xm管理指令

使用xm指令需要先啟動xend服務。

Service xend start

mx

create 建立并啟動一台虛拟機

destroy 強制關閉虛拟機

shutdown 關閉虛拟機

console 控制虛拟機

list 顯示目前虛拟機清單

network-attach

network-detach

block-attach

block-detach

delete:删除虛拟機

pause: 暫停

unpause: 從暫停中恢複

suspend: 挂起

resume: 從挂起中恢複;

save: 儲存狀态至檔案中

restore: 從儲存狀态中恢複

top: 資源使用狀态監控

info: 檢視主機相關資訊,如記憶體等;

配置xen網絡橋接

定義橋接裝置xenbr0,并将eth0裝置附加其上,過程如下:

cd /etc/sysconfig/network-scripts/

cp ifcfg-eth0 ifcfg-xenbr0  //建立橋接裝置檔案

原ifcfg-eth0 檔案内容:

DEVICE=eth0

HWADDR=00:0C:29:6C:AF:21

TYPE=Ethernet

UUID=e7c5b6ee-6e44-4854-a432-96498106e4c9

ONBOOT=yes

NM_CONTROLLED=no

BOOTPROTO=static

IPADDR=192.168.1.90

NETMASK=255.255.255.0

GATEWAY=192.168.1.1

改為如下内容:

BRIDGE=xenbr0

Ifcfg-xenbr0配置檔案内容如下:

DEVICE=xenbr0

TYPE=Bridge

重新開機網絡服務後,執行ifconfig:

雲計算之虛拟化技術詳解—Xen虛拟化實戰

1、下載下傳安裝CD光牒中的initrd.img、vmlinuz 檔案用于引導。

cd /tmp

wget http://192.168.1.202/rhel6.4/isolinux/initrd.img

wget http://192.168.1.202/rhel6.4/isolinux/vmlinuz

這裡注意:必須使用将安裝作業系統CD光牒中的檔案,不能使用别的平台版本的CD光牒中的initrd.img和vmlinuz檔案,不然會報錯。

2、建立空的虛拟磁盤映像,以之作為建立非特權域的虛拟磁盤檔案,此映像檔案并不真正占用為其指定的空間,而是随着存儲的内容而變化。

dd if=/dev/zero of=/home/test1_disk.img oflag=direct seek=10000 count=1 bs=1M

3、建立一個虛拟機配置檔案,用于啟動虛拟機。vim /etc/xen/test1

name='test1'  //虛拟機名稱

memory=512  //記憶體大小(機關M)

ramdisk='/tmp/initrd.img'  //用于系統啟動的迷你根

kernel='/tmp/vmlinuz'  //核心

disk=[ 'file:/home/test1disk.img,xvda,w' ]  //指定本地的磁盤鏡像檔案,虛拟機磁盤的裝置名稱,模式 w代表可讀寫;

root="/dev/xvda1 ro"  //指定根檔案系統

vif=[ 'bridge=xenbr0' ]  //網卡配置,橋接到xenbr0;

vcpus=2  //虛拟2個cpu

extra="ip=192.168.1.12 netmask=255.255.255.0 gateway=192.168.1.1 ks=http://192.168.1.202/ks.cfg kedevice=eth0"  //給核心額外傳遞的參數

on_reboot="destroy"  //定義動作,當收到reboot指令時,執行destroy(關機)動作,這裡設定成關機是因為首次安裝作業系統,之後要關機修改配置檔案。

on_crash="destroy"

4、啟動虛拟機

xm create test1

xm console test1

雲計算之虛拟化技術詳解—Xen虛拟化實戰

30分鐘之後

雲計算之虛拟化技術詳解—Xen虛拟化實戰

修改虛拟機配置檔案/etc/xen/test1

name='test1'

memory=512

#ramdisk='/tmp/initrd.img'

#kernel='/tmp/vmlinuz'

disk=[ 'file:/home/test1disk.img,xvda,w' ]

#root="/dev/xvda1 ro"

vif=[ 'bridge=xenbr0' ]

vcpus=2

extra="rhgb quiet selinux=0 /sbin/init 3"

bootloader="/usr/bin/pygrub"  //使用虛拟機自身核心啟動,當然也可以在kernel定義外部的核心。

on_reboot="restart"

将test1加入到xen管理,啟動test1。

xm new test1

xm start test1

Xm console test1

雲計算之虛拟化技術詳解—Xen虛拟化實戰

再建立一個test2虛拟機

建立配置檔案 vim test2 

name='test2'

disk=[ 'file:/home/test2disk.img,xvda,w' ]

bootloader="/usr/bin/pygrub"

vfb=[ 'vnc=1,vnclisten=0.0.0.0' ]   //加入虛拟幀緩沖,配置VNC服務;

複制磁盤鏡像檔案

cp /home/test1disk.img   /home/test2disk.img

啟動test2虛拟機

xm create test2

這時候你會發現xen會開啟5900端口,用于響應vnc服務的連接配接。

雲計算之虛拟化技術詳解—Xen虛拟化實戰

通過VNC服務連接配接test1

vncviewer 192.168.1.90:5900

通過VNC服務連接配接test2

vncviewer 192.168.1.90:5901

雲計算之虛拟化技術詳解—Xen虛拟化實戰

怎麼樣很簡單吧!

十、最後在總結一個細節問題,和一個技巧:

細節問題:

如果提供安裝鏡像的伺服器網段位址改變,除了要修改虛拟機配置檔案中,給核心穿的參數和ks檔案鏡像伺服器位址以外,還需要在ks檔案中修改網卡的配置,我們在安裝作業系統時給核心傳參數裡面的ip位址是網卡的第一次配置,為了得到ks檔案,得到ks檔案後,ks還會給網卡做一次配置。  筆者沒注意這點,排除弄了很久。

技巧:

如果不願意自己寫配置檔案、建立磁盤鏡像、然後安裝系統,這種方式建立虛拟機。  我們可以下載下傳模版,直接修改下就能啟動。 模版提供位址:www.jailtime.org

本篇結束,大家多多指點。

繼續閱讀