目錄:
1. Xen的簡介
1.1 Xen的大體結構
1.2 Xen對VM的稱呼
1.3 Xen對CPU和內存的虛擬化過程
1.4 Xen對IO設備的虛擬化過程
1.5 Linux Kernel對Xen的支持
1.6 Xen版本發布簡史
1.7 Xen的工具棧
1.8 XenStore
1.9 虛擬化中的四種網絡模型
1.10 Xen的安全問題導讀
2. Xen的安裝及配置文件說明
2.1.1 在CentOS6.6上運行Xen的條件
2.1.2 Xen的配置
2.2.1 Xen 啟動DomU的配置文件說明
2.2.1.1 如何創建一個Xen PV模式的VM 【注:HVM模式的VM創建參見試驗部分】
3. 使用libvirt實現Xen虛擬機的圖形管理
4. PV DomU的根文件系統可以以多種不同的方式安置
1. Xen的簡介
Xen是一個開源的可直接運行于硬件層之上的虛擬化軟件,它可在傳統虛擬技術極度不友好的X86架構上也有上佳的表現
它是英國劍橋大學開發的開源虛擬化軟件,它的初衷是在一臺物理機上運行上百臺虛擬機;
Xen的設計十分精巧,它屬于虛擬化type-I ,因為Xen實際是一個簡化版的Hypervisor層;相對于Type-II類型的基于Host的
虛擬化(如:VMware Workstattion),其性能相對會較好;Xen僅對CPU和Memory直接接管,而其它IO硬件驅動則由其上運行的
第一個虛擬機來提供支持.這樣做的原因是: Xen無法為眾多IO設備開發驅動,而硬件設備的開發商也不會專為Xen提供驅動,
因此Xen采用了這樣一種特別的設計方式。
Xen默認認為自己是直接運行于硬件層之上的虛擬化軟件,并且可以直接驅動CPU和內存,需注意CPU和內存是所有想要運行
的操作系統必須能直接支持的,但Xen為保證自身的小巧,它并沒有提供虛擬機的管理接口,因此它采用了一種獨特的方式,先運行一臺特權虛擬機,且這臺VM必須支持Kernel的修改,因此選擇開源的Linux做為特權VM是最合適的,這樣也可方便采用Linux所支持的方式來開發虛擬機管理接口,實現與Xen Hypervisor層直接交互來完成為VM分配CPU和內存資源 及 創建、刪除、停止、啟動VM的管理接口;通常這臺特權虛擬機一定會采用當前比較流行的Linux發行版,因為它能支持更多IO硬件設備,如:網卡,磁盤,顯卡,聲卡等; 到目前為止,NetBSD, GNU/Linux, FreeBSD和Plan 9,OpenSolaris等系統已經支持已半虛擬化方式運行在Xen的DomU中;并且目前Xen已經支持x86,x86_64和ARM等平臺,并正在向IA64、PPC移植。移植到其他平臺從技術上是可行的,未來有可能會實現。
Xen虛擬機支持在不停止的情況下在多個物理主機之間實時遷移。在操作過程中,虛擬機在沒有停止工作的情況下內存被反復的復制到目標機器。虛擬機在最終目的地開始執行之前,會有一次60-300毫秒的非常短暫的暫停以執行最終的同步化,給人無縫遷移的感覺。類似的技術被用來暫停一臺正在運行的虛擬機到磁盤,并切換到另外一臺,第一臺虛擬機在以后可以恢復。
1.1 Xen的大體結構:
Xen的組成分為三部分:
(1) 硬件層之上的Xen Hypervisor層:負責直接驅動CPU和Memory這些基礎硬件,
為其它所有虛擬機提供CPU、內存、Interrupt(中斷)管理,并且還提供了HyperCall的調用。
(2) 第一個虛擬機: 此虛擬機在Xen中稱為特權虛擬機: 它有整個虛擬化環境的訪問權,并負責創建用戶級虛擬機,
并為其分配I/O設備資源.它的Kernel是經過特別修改的VM,它可以直接訪問IO硬件也可訪問其它用戶VM。
(3) 其它眾多虛擬機: 這些虛擬就是用戶級虛擬機: 它們是實際提供給用戶使用的虛擬機,也是相關隔離的VM。
需要注意:Xen支持三種虛擬化,當然此處的虛擬化特指CPU的半虛擬化或完成虛擬化.
<1> Para-Virtualization(半虛擬化): 在這種虛擬化中,CPU不要求支持HVM特性,
但GuestOS的Kernel必須允許被修改.否則將無法支持該GuestOS運行在DomU中。
這是因為必須讓GuestOS知道自己是運行在虛擬化環境中,這樣它在進行特權指令操作硬件時,
會直接發起HyperCall向Xen Hypervisor發起請求來完成所謂的硬件操作。
在PV技術下,能夠運行在DomU上的OS包括:
Linux, NetBSD, FreeBSD, OpenSolaris
<2> HVM(基于硬件的完全虛擬化): 此種虛擬化需要借助于Intel的VT-x 或 AMD的AMD-v 的HVM技術
及Qemu的IO硬件模擬,才能支持GuestOS的kernel不修改,就可直接被DomU支持。
這是因為Xen Hypervisor是運行在CPU的環-1上的,GuestOS的kernel是運行在CPU的環0上,
GuestOS向環0上發起的所有假特權指令調用都由CPU直接捕獲,并交由環-1上的
Xen Hypervisor處理,最后由Xen代其執行
這樣DomU若發起關機指令時,Xen僅會切斷該GuestOS的電源,而不會影響其它GuestOS。
在HVM技術下,能夠運行在DomU上的OS包括: 所有支持X86架構的OS.
<3> PV on HVM: I/O設備半虛擬化運行,CPU運行于HVM模式
此中方式是為了解決HVM方式中IO設備也必須完全模擬而帶來的性能低下問題;通過讓CPU進行
完全虛擬化,而I/O設備則采用在GuestOS中安裝相應的IO驅動實現IO的半虛擬化的方式來提高效率。
在PV on HVM的技術下,能夠運行在DomU上的OS包括:
只要OS能驅動PV接口類型的IO設備,即可.
1.2 Xen對VM的稱呼:
Xen對VM統稱為Domain.
第一臺特權VM,在Xen中通常稱為: Domain0,簡稱為Dom0, 別名: Privileged Domain.
其它后續用戶級VM,在Xen中稱為: Domain1,Domain2,…., 它們有一個統稱為DomU,別名:Unprivileged Domain.
1.3 Xen對CPU和內存的虛擬化過程【注: 關于虛擬化中CPU和內存的虛擬化在附件加入了一些補充.】:
Xen在給VM提供CPU的虛擬化時,它采用的也是在Xen hypervisor層啟動一個線程,并將這些線程映射到某個物理核心上,
當然通過DomU的配置文件中的cpus可以指定將這些模擬CPU的線程綁定到某幾個物理核心上;而內存的虛擬化
則是內存頁的映射,將物理內存上多個連續或不連續的內存頁映射給VM,讓VM看來這就是一個完整的連續的內存空間.
1.4 Xen對IO設備的虛擬化過程:
當啟動一個用戶VM(DomU)時, 該VM所需的CPU和內存都有Xen Hypervisor提供,而它若需要使用IO設備時,則向特權VM
發起請求,特權VM(Dom0)會為該用戶VM創建一個模擬的硬件設備線程,并運行于特權VM的用戶空間,當用戶VM向該IO硬件
發起調用時,特權VM上相應的模擬設備接收請求并將其轉化為特權VM對IO硬件的操作,交給特權VM的內核來代為
完成其操作。這里需注意這些虛擬IO硬件需要由Qemu來模擬,Xen本身并沒有提供相應的模擬功能。
(注:特權VM的CPU和內存也是有Xen Hypervisor提供.)
Qemu模擬IO設備(完全虛擬化方式): 假如用戶VM向特權VM請求磁盤,特權VM可以將一個分區、文件等,
通過Qemu將其模擬成一個磁盤設備,就拿文件來說,特權VM先創建一個映像文件,再通過Qemu為該文件模擬一個磁盤控制器芯片,然后,將其映射到用戶VM上,當然模擬的這個磁盤控制器芯片一定是一個最常見的,用戶VM的Kernel一定支持的,但需注意: 模擬的磁盤可能會與實際的物理磁盤不同,因為要盡可能兼容。這樣一來用戶VM假如要寫數據到磁盤的過程如下:
用戶VM-APP—>用戶VM-Kernel調用虛擬磁盤的驅動進行寫數據前的準備
(如:數據寫入到磁盤中的扇區位置/數據編碼等)—>
用戶VM-Kernel將編碼后的信息發給特權VM的模擬磁盤進程—>
特權VM的模擬磁盤進程再將編號信息還原后發給特權VM-kernel—>
特權VM-kernel調用真實物理磁盤的驅動對數據進行寫前準備—>最后磁盤驅動調度磁盤完成寫入.
摘錄補充:(http://my.oschina.net/davehe/blog/94039?fromerr=mOuCyx6W)
Xen向Domain提供了一個抽象層,其中包含了管理和虛擬硬件的API。Domain 0內部包含了真實的設備驅動(原生設備驅動),可直接訪問物理硬件,Xen 提供的管理 API 可與其交互,并通過用戶模式下的管理工具(如:xm/xend、xl等)來管理 Xen 的虛擬機環境。
半虛擬化的IO設備:它與模擬最大不同是DomU知道自己是運行在虛擬化環境中的,并且知道這個磁盤不是真正的磁盤
它只是Xen模擬的一個磁盤前端驅動(Disk Frontend),它要寫數據時,直接將數據交給Disk Frontend,而不再去調用磁盤
驅動進行數據編碼,當特權VM端的Disk backend收到來自DomU的數據時,也是直接轉給特權VM-Kernel,由其直接調用
物理磁盤驅動來對這些原始數據進行處理并寫入磁盤。
摘錄補充:
Xen2.0之后,引入了分離設備驅動模式。該模式在每個用戶域中建立前端(front end)設備,在特權域(Dom0)中建立后端(back end)設備。所有的用戶域操作系統像使用普通設備一樣向前端設備發送請求,而前端設備通過IO請求描述符(IO descripror ring)和設備通道(device channel)將這些請求以及用戶域的身份信息發送到處于特權域中的后端設備。這種體系將控制信息傳遞和數據傳遞分開處理。
半虛擬化客戶機(Domain U PV)的PV Block Driver接收到要向本地磁盤寫入數據的請求,然后通過Xen Hypervisor將自己與Domain 0共享的本地內存中的數據寫入到本地磁盤中。在Domain 0 和半虛擬化Domain U之間存在事件通道(我的理解:Device Channel包含Event Channel),這個通道允許它們之間通過存在于Xen Hypervisor內的異步中斷來進行通信。Domain 0將會接收到一個來自于Xen Hypervisor的系統中斷,并觸發Domain 0中的Block Backend驅動程序去訪問本地系統內容,并從自己與半虛擬化客戶機的共享內存中讀取適合的數據塊后,隨即被寫入到本地磁盤的指定位置中。
但無論采用模擬或半虛擬化最終都是對物理磁盤的操作,假如當前只有一個物理磁盤,眾多用戶VM都在進行大量的
讀寫請求,此時,為了避免用戶VM無限制的向特權VM發起請求,特權VM中采用一個環狀緩存區,每到一個IO請求,就先將其
塞入這個環狀緩沖區的槽位中,若緩沖區滿了,就會告訴用戶VM IO設備繁忙。當然其它各種IO設備大致都采用這種機制
來控制。
1.5 Linux Kernel對Xen的支持:
》Linux2.6.37 : kernel開始對Xen進行支持,并加其加入到Kernel中。
》Linux3.0 :Kernel開始對Xen的關鍵部分進行優化.
RHEL對Xen的支持概況:
Redhat系列對Xen的支持情況:
RHEL5.7 ~ 及以前版本: 默認的企業虛擬化技術為Xen.
但Redhat提供了兩種內核:
kernel-… :這是僅允許RHEL系統的內核,不能運行在DomU中。
kernel-xen.. :這是需要部署XenServer時,使用的Kernel版本.
RHEL6 ~ 及以后版本: 默認支持KVM(收購自以色列的一款虛擬化工具),并且不在對Xen做任何支持,但允許自己運行在DomU中.
1.6 Xen版本發布簡史:
10年4月Xen4.0.0發布,改進后Xen的DomU最大可支持虛擬CPU 64顆,Xen主機可支持1TB內存和128顆物理CPU,磁盤可支持快照和克隆; HVM客戶機支持虛擬內存頁共享;
11年4月發布的Xen4.1版后,xm/xend開始被提示廢棄,xl這個更輕量級的Xen VM管理工具逐漸成為主流.
15年為止已經發布Xen4.5版本.目前yum源可用的最新版Xen是4.6.1版的(http://mirrors.skyshe.cn/centos/6.7/virt/x86_64/xen-46/).
1.7 Xen的工具棧:
xend : 這是Xen Hypervisor的Dom0上運行的服務,此服務用來監控xm命令發來的指令,并完成相應的動作。
xm : Xen Management,用來管理VM的創建、刪除、啟動、快照、刪除、停止等的管理工具。
xl : 這是一個基于libxenlight庫的一個輕量級VM管理工具,它從Xen4.1開始出現,從4.3以后,它被作為主要的VM管理
工具,而xm這個重量級管理工具開始被提示廢棄.
以下為xm、xl的對比圖:
xl 和 xm都需要調用libxenlight,但xl不需要運行任何服務,它可直接調用libxenlight完成相關操作。
xe/XAPI,是xend的一個API管理接口,通常用于Xen Cloud環境中:Xen Server, XCP
virsh/ libvirt : 這是Redhat發起開發的一套用于管理眾多不同類別的VM的管理工具。
virsh : 這是一個命令行工具
libvirt: 則是一個lib庫, libvirtd守護進程用于監聽virsh命令操作,并調用lbvirt完成相關操作.
1.8 XenStore:
為各Domain之間提供共享信息存儲的空間,同時它也是一個有著層級結構的名稱空間數據庫;
它運行于Dom0上,由Dom0直接管理,它支持事務和原子操作。XenStore通常用來控制DomU中設備的機制,
并通過多種方式對其進行訪問。
摘錄補充(http://blog.chinaunix.net/uid-26299858-id-3134495.html):
XenStore是Xen提供的一個域間共享的存儲系統,它以字符串形式存放了管理程序和前、后端驅動程序的配置信息。
Dom0管理所有的數據,而DomU通過共享內存,向Dom0請求與自己相關的鍵值,以此實現域間通信。Xen提供了多種
接口用來操作XenStore:命令行的xenstore-*命令、用戶空間的xs_系列函數、內核的XenBus接口,都可以用來方便地
操作XenStore的數據。
1.9 虛擬化中的四種網絡模型
在虛擬化環境中虛擬網絡是十分重要但又比較難,需要特別注意;
在Linux中實現虛擬網絡的方法中比較常用的工具有兩個:bridge-utils 和 openvswitch,它們創建的虛擬網絡設備是
不能相互使用的,比如:bridge-utils創建的橋設備,openvswitch是無法識別的。
用下圖來做簡單說明
注:lo1: 為loopback接口,但實際測試時,發現loopback接口無法橋接到虛擬網橋上。
1.10 Xen的安全問題導讀
補充見附件:
2. Xen的安裝及配置文件說明
2.1.1 在CentOS6.6上運行Xen的條件:
方式一:
(1) 編譯3.0以上版本的內核,啟動對Dom0的支持.
(2) 編譯xen程序
方式二:
使用相關Xen運行環境快速部署的項目:
(1) xen4contos : 這是Xen官方提供的開源項目。
xen環境部署的RPM包鏡像站: http://mirrors.aliyun.com/centos/6.7/xen4/x86_64/
(2) xen made easy
2.1.2 Xen的配置:
(1) 修改grub.conf
# Xen是直接運行于硬件層之上的,因此必須修改grub.conf,手動添加以下參數:
title Xen Server Linux 3.7.4
root (hd0,0)
kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin
module /vmlinuz-3.7.4-1.el6xen.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUNKS.UTF-8
rd_LVM_LV=vg0/swap rd_NO_MDSYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM
KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet
module /initramfs-3.7.4-1.el6xen.x86_64.img
注: kernel 必須指定xen*.gz為啟動的內核, dom0_mem:設定Dom0啟動后可以使用的內存大小,
cpufreq: 設定由Xen來管理CPU, dom0_max_vcpus: 設定Dom0可以使用多少顆CPU,
dom0_vcpus_pin: 將Dom0固定在系統啟動后,分配給它的CPU上,以避免它去搶占其它物理CPU核心,
這樣其它物理核心就可以分配給DomU來使用了。
詳細參數查看:
http://xenbits.xen.org/docs/unstable/misc/xen-command-line.html
2.2.1 Xen 啟動DomU的配置文件說明
xl list : #首先需要了解的第一個命令.
xen VM的常見狀態:
r : running
b: block(阻塞)
p: pause(暫停): 類似與睡眠.
s: stop
c: crash(崩潰)
d: dying, 正在關閉的過程中.
2.2.1.1 如何創建一個Xen PV模式的VM:
1. Kernel 和 initrd或initramfs :這些LinuxKernel文件必須要有,但可以不在DomU上,它們可以在Dom0上.
2. DomU內核模塊(即:/lib/modules/`uname -r`): 這些就需要在DomU根文件系統中存儲了。
3. 根文件系統
4. swap設備: 若條件充足也可以提供.
以上四步的內容必須定義在DomU的配置文件中.
注: xl 和 xm啟動DomU的配置文件是存在一些不同的.
對于xl命令創建VM所需的配置文件說明可查看:
man xl.cfg
# 注: man xl.conf #這是對xl命令所使用的配置文件.
xl.cfg的配置文件參數說明:
name : 域的唯一名.
builder: 指明VM的類型,generic:創建PV類型的VM; HVM:創建HVM類型的VM
vcpus: 指定CPU個數.
maxvcpus:指定最大可使用CPU的個數,這些CPU可在需要是手動啟動。
cpus: 指定VM的vcpu線程可以運行在哪些物理核心列表上.
#如:cpus="0-3,5,^1" 這表示:VCPU可運行在0,2,3,5上,但不能運行在1上.
#建議將vCPU綁定到固定的物理核心上,這樣可減少vCPU線程在多個物理核心上切換.
memory: 指定DomU啟動時預分配的內存大小[單位:M]
maxmem: 指定最大給DomU分配的內存大小. [單位:M]
on_poweroff: 指定DomU關機時,實際采用的動作.
destroy: 直接將DomU斷電關機.
restart: 重啟
rename-restart: 改名后重啟
preserve: 將這個DomU保存,以便下次再啟動。
coredump-destroy: 將DomU的運行中的內核數據備份出來后,再關機。
coredump-restart: 先備份內核數據,再重啟.
on_reboot: 重啟DomU時實際采用的動作。
on_crash: 當DomU崩潰后,實際采用的動作。
uuid: DomU的UUID,非必須.
disk:指定DomU的磁盤列表
如: disk=[ "/img/disk/DomU1.img" , "/dev/sda3" , …]
vif : 指定DomU的網卡列表
如: vif=[ "NET_SPEC_STRING" , "NET_SPEC_STRING" , …]
vfb: 指定DomU的顯示器, vfb:virtual frame buffer(虛擬幀緩沖)
如: vfb=[ "VFB_SPEC_STRING" , "VFB_SPEC_STRING" ,…]
pci :指定DomU的PCI設備列表.
如:pci=[ "PCI_SPEC_STRING" , "PCI_SPEC_STRING" ,…]
PV模型的專用指令:
kernel : 指定內核文件路徑,此路徑為Dom0的路徑.
ramdisk: 指定initrd或initramfs文件的路徑.
root: 指定根文件系統. 此參數僅與kernel和ramdisk一起使用,因為,kernel和ramdisk都是在Dom0上的,
并沒有grub.conf來告訴kernel根文件系統在哪里,因此這里需要指定。
extra: 與root參數類似,它是指定kernel啟動時的其它參數的.
# 以上4個參數用于kernel文件在Dom0上, 下面固定格式用于DomU有自身的Kernel文件.
bootloader="pygrub": 若DomU使用自己的kernel和ramdisk,則此時需要一個Dom0中的應用程序來
實現其bootloader功能; 這個不用指定root,因為,DomU的啟動所需的所有文件都在自己
的鏡像文件中,它可以從grub.conf中指定根文件系統的位置.
注:
# 讓DomU通過網絡之間安裝操作系統,需要注意:
# kernel 和 ramdisk所需要的文件必須是:安裝光盤目錄下/isolinux/{vmlinuz,initrd.img}
kernel="/images/kernel/vmlinuz"
ramdisk="/images/kernel/initrd.img"
extra="ks=http://1.1.1.1/centos6.6_x86_64.ks" #注:給內核傳遞的ks文件。
另注:【注: 沒有親自測試,若有偏差還望指正.】
cloud-init*.rpm工具包可以將安裝的OS中的特有信息(如:MAC, 磁盤信息等)刪除,并且可以在下次啟動時,
自動生成這些信息.是制作云模板OS鏡像的工具。
磁盤參數的指定方式:
xl方式創建VM時,磁盤指定格式: http://xenbits.xen.org/docs/unstable/misc/xl-disk-configuration.txt
[<target>, [<format>,[<vdev>,[<access>]]]]
target: 表示磁盤映像文件或設備文件路徑:
如: /images/xen/linux.img
/dev/vg-xen/lv-linux
format: 表示磁盤的格式:
如: raw、qcow2..等,具體格式可查看: qemu-img –help |grep 'Supported formats'
vdev: 指定添加的虛擬磁盤被DomU識別為何種類型的磁盤; 支持:hd, sd, xvd(xen-vritual-disk)
注: 指定是需要寫成: sda 或 sdb等,即要指定這是第幾塊磁盤.
access: 訪問權限,除CDROM為'r'只讀外,其它都為'rw'
示例:
disk=["/images/xen/linux.img,qcow2,xvda,rw", "/iso/CentOS6.7.iso,,hdc,devtype=cdrom"]
# 使用Dom0中物理磁盤分區做為DomU的存儲空間
disk=['/dev/vg-data/lv-bbox,raw,xvda,rw']
創建虛擬磁盤文件:
#注qemu-img創建的磁盤映像文件是采用稀疏磁盤格式創建的.因此用:du -sh linux.img 可看到其大小為0.
#【qemu-img 的子命令簡介詳見附件】
qemu-img create -f raw -o size=2G /images/xen/linux.img
或 qemu-img create -f raw /images/xen/linux.img 2G
若想知道當前指定的磁盤格式支持哪些額外參數:
qemu-img create -f qcow2 -o ? /images/xen/linux.img
size : 指定qcow2格式的虛擬磁盤大小。
backing_file: 指定其后端存儲快照信息的映像文件位置.
backing_fmt: 指定后端映像文件的格式。
encryption: 是否對創建的映像文件加密
cluster_size: 指定qcow2格式的簇大小.
preallocation: 指定創建qcow2格式的磁盤映像文件時,需要預先做些什么:
> off : 什么也不做,創建一個空磁盤.
> metadata: 預先創建qcow2的元數據信息,建議設置.
> full: 直接填充成指定大小的磁盤文件,它包含了metadata.
創建虛擬網絡接口:
#虛擬網卡的創建直接在配置文件中使用vif指定即可。
#格式: vif=[ "NET_SPEC_STRING" , "NET_SPEC_STRING" , …]
NET_SPEC_STRING:的格式如下:
key=value
key包含以下幾個:
》mac :指定網卡的MAC地址,注:MAC地址必須以:00:16:3e 開頭,這是IANA分配給Xen的MAC廠商前綴.
》bridge: 指定此網卡要橋接到Dom0上的那個橋設備上.
》model: 指定模擬網卡的芯片類型:[rtl8139 |e1000]
》vifname:指定在Dom0中顯示的接口名, 注: 在DomU中顯示還是eth0…
》script: DomU在創建網絡接口時,預先執行的腳本.注: 此腳本的路徑也是Dom0上的路徑.
》ip:指定要注入DomU中的IP地址。
》rate: 指定網卡的設備速率.
如: rate=10Mb/s
rate=1MB/s@20ms #20毫秒內只能傳輸1M/0.02s=20000字節/20ms
圖形窗口的啟用:
可直接修改DomU的啟動配置文件,并在其中添加:
(1) vfb=['sdl=1'] #這是直接在本地啟動一個VNC窗口來輸出DomU的圖形桌面,且只能本地連接.
(2)Dom0上啟動一個VNC進程,并監聽在5900端口上,可通過密碼連接.
vfb=['vnc=1,vnclisten=0.0.0.0,vncpasswd=123456,vncunused=1,vncdisplay=:1']
#注: vncunused: 為非0值,則表示vncserver監聽在大于5900的第一個沒被占用的端口上.
# vncdisplay: VNC顯示號,默認為當前域的ID,當前域的VNC服務器將監聽在5900+此顯示號的端口上.
3. 使用libvirt實現Xen虛擬機的圖形管理
yum install libvirt libvirt-deamon-xen virt-manager python-virtinst libvirt-client
注: virt-manager: 是圖形管理VM的接口界面,類似與VMware,可創建、啟動、停止等
python-virtinst: 此工具提供了virt-install命令行管理VM的接口.
libvirt-client: 提供了一個virsh命令來管理VM。
service libvirtd start #要使用libvirt工具集,此服務必須首先啟動.
virsh dumpxml busybox #將busybox的信息輸出為virsh的可用的xml配置文件,可修改此文件做模板來創建新VM實例.
4. PV DomU的根文件系統可以以多種不同的方式安置:
(1) 虛擬磁盤映像文件
(a)方便制作成通用模板
當用qemu-img創建好一個虛擬磁盤映像文件,并向其中安裝好OS后,可以使用cloud-init這種工具對其進行
修改,去除其中OS的唯一性的數據信息(如:MAC地址等),需要注意的是,磁盤映像文件實際上是由標準格式的并且
在其上創建完文件系統后,就可以通過FS的API接口在不掛載的情況下對其中的文件進行修改.
(b)方便實現實時遷移
1. 將模板映像文件放置于FTP/NFS/Samba等共享存儲上,且有多臺Xen Hypervisor:
場景一: 需要快速創建一臺VM.
假如當前業務中MySQL的從庫讀壓力過大,需要擴容,此時就可以直接通過自行開發的腳本工具來判斷
當前那個Xen Hypervisor更空閑,然后,直接下載從共享存儲上下載一個模板磁盤映像,直接就可以啟動起來.
并且這是配置好的從庫模板,啟動后它可以直接連接到主庫等等.
場景二: 快速遷移
假如當前某臺Xen Hypervisor的CPU、Memory或其他資源突然升高,此時,可直接將該Xen Hypervisor上
某些VM的內存數據導出到共享存儲上,然后直接在另一臺比較寬裕的Xen Hypervisor上,下載模板映像文
件并直接將該共享存儲上導出的內存數據與模板映像文件關聯,就可恢復到此Xen Hypervisor上實現快速遷移。
2.分布式文件系統上存儲磁盤映像文件,且有多臺Xen Hypervisor:
場景一: 故障快速恢復
假如當前Xen Hypervisor上運行了多臺VM,但Xen Hypervisor所在物理機突然故障,這時,我們完全可以直接
將分布式存儲系統上的磁盤映像文件直接讓正常的Xen Hypervisor接管,已實現快速遷移.
場景二:快速遷移
如上面場景二類似,但此處我們無需在下模板磁盤映像文件,直接dump出運行中VM的內存數據到共享存儲上
就可以直接在另一臺Xen Hypervisor上啟動起來。
(2) 使用Dom0上空閑的物理磁盤分區
(3) 使用Dom0上空閑的邏輯卷
(4) 使用iSCSI設備提供的塊級別網絡文件系統 或 分布式文件系統。
(5) 網絡文件系統,如: NFS, Samba
實驗目錄:
1. 環境說明
2. Xen的安裝和配置
3. 未解決的問題
1.在DomU的配置中添加sdl=1,啟動報錯,改為vnc=1,正常.
2.配置文件中指定IP,但啟動DomU后,IP并沒有自動配置上.
3.不能動態調整vCPU的個數.
4.以上問題若有高手知道,非常愿意交流。
4. 創建第一臺Xen DomU
4.1 創建并啟動DomU
4.2 基本功能測試
1. 測試啟動DomU的圖形窗口(僅本地可連的VNC(sdl=1) 和 可遠程連接的VNC(vnc=1)).
2. 測試動態添加和移除磁盤
3. 測試動態添加和移除網卡
4. 測試掛起DomU(即:將DomU的內存數據導出到文件.)
5. 測試恢復DomU.
6. 測試動態增加內存和CPU
7. 測試創建克隆DomU.
1) 類似VMware中的連接克隆
2) 直接復制HVM DomU的img映像文件來克隆DomU.
8. 測試遷移DomU
9. Xen的提供的批量操作DomU的腳本簡單分析: xendomains
10. xenstore的簡單操作說明.
以上測試因本人對Xen的理解實在有限,不能更深入測試,以下測試僅本人親自測試所作,若有錯誤或遺漏,還望多多指出,僅做拋磚引玉。
測試環境:
Dom0:CentOS 6.7(Kernel:2.6.32)
Xen安裝源: http://mirrors.aliyun.com/centos/6.7/xen4/x86_64/
Xen環境:
Kernel: 3.18.21-16.el6.x86_64
Xen: xen-4.4.3-3.el6.gz
Xen的安裝:
# 配置yum源: [root@centos6 ~]# cat /etc/yum.repos.d/xen.repo [Aliyun] name=aliyun-xen-mirrors baseurl=http://mirrors.aliyun.com/centos/6.7/xen4/x86_64/ enabled=1 gpgcheck=0
# 安裝Xen [root@centos6 ~]# yum install xen
# 配置啟動Xen: [root@centos6 ~]# cat /boot/grub/grub.conf default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Xen-Dom0-CentOS (3.18.21-16.el6.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin module /vmlinuz-3.18.21-16.el6.x86_64 ro root=UUID=11753f30-71af-4c50-8f64-32ddbed68711 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM rhgb quiet module /initramfs-3.18.21-16.el6.x86_64.img title CentOS 6 (2.6.32-573.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=11753f30-71af-4c50-8f64-32ddbed68711 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-573.el6.x86_64.img
創建一臺cirros虛擬機:
(1) 下載Cirros: http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
(2) 創建image存儲目錄
[root@centos6 ~]# mkdir -pv /images/xen/ [root@centos6 ~]# cp cirros-0.3.4-x86_64-disk.img /images/xen/cirros.img
(3) 創建Xen DomU的啟動配置文件:
[root@centos6 ~]# cd /etc/xen [root@centos6 ~]# cp xlexample.pvlinux cirros # 修改cirros后配置如下: [root@centos6 ~]# grep -Ev '^$|^#' cirros name = "cirros-001" bootloader="pygrub" memory = 512 vcpus = 2 vif = [ 'bridge=xenbr0' ] disk = [ '/images/xen/cirros.img,qcow2,xvda,rw' ]
(4) 創建橋接口
#注: 在創建橋接口前,需要先注意禁止NetworkManager服務啟動. # service NetworkManager stop && chkconfig NetworkManager off #橋接口的作用: # DomU啟動后,它若需要與Dom0或外網通信就需要通過Dom0來實現,而Dom0實現的方式就是 # 創建橋接口,橋接后,系統會將Dom0的物理網卡模擬成一個二層交換機,然后,創建一個虛接口代替 # ethX, 這樣當物理網卡收到目的MAC是自己的數據包時,就轉發到虛接口上.若不是則轉發給后端DomU. [root@centos6 ~]# cat ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none BRIDGE=xenbr0 USERCTL=no [root@centos6 ~]# cat ifcfg-xenbr0 DEVICE=xenbr0 TYPE=Bridge ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none IPADDR=192.168.137.132 NETMASK=255.255.255.0 GATEWAY=192.168.137.1 DNS1=114.114.114.114 USERCTL=no DELAY=0
(5) 測試啟動
# 注:測試啟動后,請注意網卡的MAC地址. 由于上面配置文件中沒有指定MAC地址,因此每次啟動后, # 其MAC地址會被Xen自動重新分配. # -c : 啟動的同時進入控制臺. # -n : 檢查配置文件,非真正啟動. [root@centos6 ~]# xl create cirros -c #啟動并登錄DomU的終端后,若要退回的Dom0,按: Ctrl+], # 若退回到Dom0后, Xshell 等連接工具不能正常顯示:可輸入reset來重置. [root@centos6 ~]# xl console cirros-001 #手動登錄cirros的控制臺
基本命令使用說明
xl help create #查看創建DomU的幫助 xl -v create /etc/xen/cirros -n #測試配置文件是否符合需求. xl create /etc/xen/cirros -c #創建并啟動成功后,立刻連接到其控制臺上. xl -v create /etc/xen/cirros #啟動cirros虛擬機 xl list #查看當前運行的VM情況 xl console cirros-001 #連接到剛剛啟動的cirros虛擬機的控制臺. ctrl + ] #退回到Dom0. exit #拆除cirros,即銷毀cirros. xl destroy cirros-001 #關機并銷毀cirros, 注:銷毀后,下次再用配置文件啟動DomU時,就是一個新的DomU了.
啟動cirros虛擬機登錄后:
ifconfig -a #是看不到任何接口的. insmod /lib/modules/xen-netfront.ko #安裝網卡接口驅動模塊 ifconfig -a ifconfig eth0 192.168.1.20 up ctrl + ] # 回到到Dom0,查看網絡接口狀態. Dom0: ifconfig -a #將可以看到一個新接口.vif#.@ # "#": 表示DomU的ID ; @:表示Dom0上創建的橋ID. Dom0: brctl show #將看到新接口已經被橋接到Dom0的橋設備上了。
xl的其它常用命令:
xl shutdown DomU_Name xl reboot DomU_Name xl pause DomU_Name #暫停DomU xl unpause DomU_Name xl save DomU_Name /path/to/save_name.img /etc/xen/ConfigFile #將DomU掛起。 xl restore /etc/xen/ConfigFile /path/to/save_name.img #恢復DomU到運行態,無需指定DomU_Name. xl help cd-insert #插入光驅,僅適用于HVM模式 xl help cd-eject #拔出光驅 xl vcpu-list DomU_Name #顯示DomU上有幾顆真正使用的虛擬CPU. #CPU Affinity:表示該虛擬CPU線程可以運行在哪些物理核心上. xl vcpu-pin DomU_ID 0 3 #將DomU的0號VCPU綁定到物理核心3上. xl vcpu-set DomU_Name 1 #設置DomU當前只能使用1顆VCPU.若當前它有多顆VCPU,則其它CPU將被暫停. #注: 若在配置文件中指定了maxvcpus ,則此命令可動態添加VCPU數量. # 否則只能在當前VCPU總數的基礎上減少。 xl pci-list DomU_Name #顯示當前DomU上的PCI設備. xl pci-attach DomU_Name #給運行時的DomU添加一塊PCI設備. xl pci-detach DomU_Name #將運行的DomU中的PCI設備直接移除。 xl info #查看當前Xen Hypervisor的摘要描述信息 -- nr_cpus #物理核心總數 -- max_cpu_id #最大支持的VCPU個數 #更詳細的信息參見:http://smilejay.com/2012/03/xl-info_xm-info/ xl demsg DomU_Name #查看DomU啟動時信息. xl top #查看DomU的資源使用情況. xl network-list DomU_Name #查看DomU的網絡接口列表 xl network-attach DomU_Name bridge="xenbr1" #給運行中DomU添加一塊虛擬網卡. xl network-detach DomU_Name 1 #拆除網卡編號為1的網卡. qemu-img create -f qcow2 -o size=3G,preallocation=metadata /images/xen/busybox.2.img xl block-list DomU_Name #查看當前DomU_Name的磁盤列表. xl block-attach DomU_Name '/images/xen/busybox.2.img,qcow2,xvdb,rw' #給DomU添加一個磁盤設備. xl block-detach DomU_Name DevID #移除一塊磁盤.block-list中Vdev項就是DevID. xl uptime DomU_Name #查看DomU的運行時長.
基本功能測試部分:
(6) 測試打開本地圖形窗口:
[root@centos6 ~]# echo "vfb='['sdl=1']'" >> /etc/xen/cirros #開啟僅本機訪問的VNC窗口. # 測試失敗,報一下錯誤: # Parsing config from cirros # libxl: notice: libxl_numa.c:494:libxl__get_numa_candidate: NUMA placement failed, performance might be affected # libxl: error: libxl_dm.c:1401:device_model_spawn_outcome: domain 1 device model: spawn failed (rc=-3) # libxl: error: libxl_create.c:1189:domcreate_devmodel_started: device model did not start: -3 # libxl: error: libxl_dm.c:1505:kill_device_model: Device Model already exited # 測試使用VNC遠程連接打開. # 開啟可遠程連接的VNC服務. [root@centos6 ~]# echo "vfb=['vnc=1,vnclisten=0.0.0.0,vncpasswd=123456']" >> /etc/xen/cirros
(7) 測試動態添加和拆除磁盤
[root@centos6 ~]# qemu-img create -f raw -o size=1G /images/xen/cirros-01.img [root@centos6 ~]# xl block-attach cirros-001 '/images/xen/cirros-01.img,raw,xvdb,rw' [root@centos6 ~]# xl console cirros-001 [root@centos6 ~]# fdisk -l |grep 'Disk /dev' Disk /dev/xvda: 41 MB, 41126400 bytes Disk /dev/xvdb: 1073 MB, 1073741824 bytes #可以看到已經添加成功. [root@centos6 ~]# xl block-list cirros-001 Vdev BE handle state evt-ch ring-ref BE-path 51728 0 2 4 17 793 /local/domain/0/backend/vbd/2/51728 #一定注意:新加的磁盤不一定是顯示在末行. 51712 0 2 4 15 8 /local/domain/0/backend/qdisk/2/51712 [root@centos6 ~]# xl block-detach cirros-001 51728 #拆除磁盤. DEBUG libxl__device_destroy_tapdisk 105 type=aio:/images/xen/cirros-01.img disk=:/images/xen/cirros-01.img [root@centos6 ~]# xl -v block-list cirros-001 Vdev BE handle state evt-ch ring-ref BE-path 51712 0 2 4 15 8 /local/domain/0/backend/qdisk/2/51712
(8) 測試動態添加網卡
[root@centos6 ~]# xl network-attach cirros-001 #不加參數也可以添加虛擬網卡. [root@centos6 ~]# xl network-attach cirros-001 'ip=1.1.1.2,bridge=xenbr1' #添加參數,但IP參數沒有生效.不知為何? [root@centos6 ~]# xl network-list cirros-001 Idx BE Mac Addr. handle state evt-ch tx-/rx-ring-ref BE-path 0 0 00:16:3e:0e:ae:e1 0 4 16 775/774 /local/domain/0/backend/vif/1/0 1 0 00:16:3e:68:3e:4f 1 4 17 1280/1281 /local/domain/0/backend/vif/1/1 2 0 00:16:3e:77:0b:eb 2 4 18 1792/1793 /local/domain/0/backend/vif/1/2
(9) 保存DomU當前的內存數據到指定位置.
# 注:默認掛起后,會destroy DomU. # -p : 保存當前時刻的內存狀態后,將DomU暫停在內存中. # -c : 保存當前時間的內存狀態后, DomU繼續運行. [root@centos6 ~]# xl save -p cirros-001 /tmp/cirros-04070526.img /etc/xen/cirros Saving to /tmp/cirros-04070526.img new xl format (info 0x0/0x0/1307) xc: Saving memory: iter 0 (last sent 0 skipped 0): 131072/131072 100% [root@centos6 ~]# xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1024 2 r----- 610.2 cirros-001 2 512 2 --p--- 1.5 [root@centos6 ~]# xl console cirros-001 [10489.060379] Freezing user space processes ... (elapsed 0.01 seconds) done. [root@centos6 ~]# xl save -c cirros-001 /tmp/cirros-04070538.img /etc/xen/cirros Saving to /tmp/cirros-04070538.img new xl format (info 0x0/0x0/1307) xc: Saving memory: iter 0 (last sent 0 skipped 0): 131072/131072 100% [root@centos6 ~]# xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1024 2 r----- 682.5 cirros-001 2 512 2 -b---- 2.1
(10) 恢復保存的DomU狀態
[root@centos6 ~]# xl restore /etc/xen/cirros /tmp/cirros-04070538.img Loading new save file /tmp/cirros-04070538.img (new xl fmt info 0x0/0x0/1307) Savefile contains xl domain config Parsing config from /etc/xen/cirros libxl: notice: libxl_numa.c:494:libxl__get_numa_candidate: NUMA placement failed, performance might be affected xc: Reloading memory pages: 131072/131072 100% # 注: 在保存內存數據前,我事先為cirros添加了一塊磁盤 和 一塊網卡. # 請注意: 恢復DomU后,動態關聯的網卡和磁盤都已經被去除了。 [root@centos6 ~]# xl network-list cirros-001 Idx BE Mac Addr. handle state evt-ch tx-/rx-ring-ref BE-path 0 0 00:16:3e:48:55:6d 0 4 16 775/774 /local/domain/0/backend/vif/5/0 [root@centos6 ~]# xl block-list cirros-001 Vdev BE handle state evt-ch ring-ref BE-path 51712 0 5 4 15 8 /local/domain/0/backend/qdisk/5/51712
(11) 測試動態增加內存和CPU:
[root@centos6 xen]# xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1024 2 r----- 932.5 cirros-001 6 512 1 -b---- 4.3 busybox-001 7 256 1 -b---- 10.0 [root@centos6 xen]# grep -Ev '^$|^#' cirros name = "cirros-001" bootloader="pygrub" memory = 512 maxmem = 1024 vcpus = 1 maxvcpus = 3 cpus = "0-2" #將CPU綁定到0,1,2這三顆物理核心上. vif = [ 'ip=10.1.0.10,bridge=xenbr0' ] # IP參數設置后,測試發現總是不生效,不知原因為何? disk = [ '/images/xen/cirros.img,qcow2,xvda,rw' ] vfb = [ 'vnc=1,vncpasswd=123456,vnclisten=0.0.0.0' ] [root@centos6 xen]# grep -Ev '^$|^#' busybox name = "busybox-001" kernel = "/boot/vmlinuz" ramdisk = "/boot/initramfs.img" extra = "selinux=0 init=/bin/sh " root = "/dev/xvda ro" memory = 256 vcpus = 1 vif = [ 'ip=10.1.0.11,bridge=xenbr1' ] disk = [ '/images/xen/busybox.img,raw,xvda,rw' ] [root@centos6 xen]# xl mem-set cirros-001 600m [root@centos6 xen]# xl mem-set busybox-001 300m libxl: error: libxl.c:4106:libxl_set_memory_target: memory_dynamic_max must be less than or equal to memory_static_max [root@centos6 xen]# xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1024 2 r----- 945.7 busybox-001 7 256 1 -b---- 10.2 cirros-001 8 600 1 -b---- 2.8 # 上面測試結果顯示: 必須在配置文件中啟動最大內存(maxmem)參數,才能使用命令來動態調整Memory. # 能否使用mem-max動態增加最大內存那? [root@centos6 xen]# xl mem-max busybox-001 512m [root@centos6 xen]# xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1024 2 r----- 947.4 busybox-001 7 256 1 -b---- 10.2 cirros-001 8 600 1 -b---- 2.9 [root@centos6 xen]# xl mem-set busybox-001 300m libxl: error: libxl.c:4106:libxl_set_memory_target: memory_dynamic_max must be less than or equal to memory_static_max [root@centos6 xen]# xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1024 2 r----- 947.7 busybox-001 7 256 1 -b---- 10.2 #測試結果: 必須修改配置文件. cirros-001 8 600 1 -b---- 2.9 [root@centos6 xen]# xl vcpu-set cirros-001 3 [root@centos6 xen]# xl vcpu-list cirros-001 Name ID VCPU CPU State Time(s) CPU Affinity cirros-001 8 0 0 -b- 2.7 all #注: 動態調整VCPU個數后,并沒有動態激活更多的VCPU. cirros-001 8 1 - --p 0.1 all # 問題原因,目前還不清楚... cirros-001 8 2 - --p 0.1 all # 在DomU中查看 cat /proc/cpuinfo,也只有一顆.
(12) 測試創建克隆DomU.
1) 類似VMware中的連接克隆.
#注: 通過qemu-img來創建一個關聯后端文件的img鏡像文件. # 來測試連接克隆,但測試結果是失敗的。 # 嘗試發現: 將連接鏡像文件做為磁盤啟動后,再里面所做的修改,在關機后會同步到后端鏡像文件中。 # 另注: 個人認為連接克隆不適合線上操作, 僅個人使用時節省空間是比較好的選擇。因此,可不必深究. qemu-img create -f qcow2 -o backing_file=/images/xen/cirros.img /images/xen/cirros.link.img
2) 直接復制HVM DomU的img映像文件來克隆DomU.
# Linux測試沒有發現太多異常,除了MAC會在每次create時重新生成外,相互訪問正常,水平有限,望高手勿噴。
# Windows的測試,此處采用WinXP來測試,WinXP僅支持HVM模式(完全虛擬化)下測試.
(a) 我的CPU支持VT-x,因此在VMware中開啟了VT-x輸出給VM的功能:
(b) 提供WinXP的基本配置文件
[root@centos6 xen]# grep -Ev '^$|^#' winxp builder = "hvm" name = "WinXP-001" memory = 1024 vcpus = 2 vif = [ 'bridge=xenbr0' ] disk = [ '/images/xen/winxp.img,qcow2,xvda,rw' , '/mnt/win7/windows/WinXPSP3-Vol.iso,,hdc,cdrom'] vnc = 1
(c)啟動WinXP后,連接VNC開始從CDROM安裝WinXP.
#注:我的筆記本內存只有8G,分配給Xen VM 4G,但安裝WinXP依然巨慢,安裝了一個晚上才基本裝好. vncviewer 127.0.0.1:5900
(d)克隆WinXP的映像文件
cp -a /images/xen/winxp.img /images/xen/winxp-2.img
(e)測試結果:
> WinXP可以啟動,MAC地址可以在配置文件中指定來保障其不是每次重啟后都改變.
> 但查詢Windows的SID時, 直接復制的映像文件與原有的映像文件的SID是相同的.
這也是應該是必然,Xen還不太可能每次create時去修改Windows的SID.
注:
Windows查看當前用戶的SID:
開始–>運行–>regedit–>HKEY_USERS 下面兩個就是當前用戶的SID.
如: S-1-5-21-861567501-1326574676-682003330-1003
Windows SID的重要性: http://www.cnblogs.com/mq0036/p/3518542.html
SID = Security Identifiers,安全標識符,是標識用戶、組和計算機帳戶的唯一的號碼。
如果兩臺電腦的SID相同,在一個局域網里就會發生沖突,比如自己GHOST了系統,然后還原到其它電腦上,
這時候的SID是相同的,就會產生沖突。另外A和B兩臺PC機的管理員SID相同,則A上僅管理員可訪問的共享,
B上的管理員也將可訪問,當然A也能訪問B.
(13) Xen的實時遷移
# xl 命令做遷移比較簡單,直接使用以下命令即可實現: # -C : 指定DomU的配置文件,非必須. # 192.168.137.151: 目標Xen Hypervisor的IP. # 注: 遷移的條件: # (1) busybox-001的磁盤映像文件,在目標Xen Hypervisor上必須能訪問到. # (2) 兩邊的/etc/hosts文件最好一致.因為,xl 的遷移實際上是采用ssh隧道來完成的. # 另注: 由于測試時,啟動兩臺Xen Hypervisor后,總是會導致其中一臺在不確定的時間掛掉. # 導致沒能做的太詳細,我在遷移時,先是將busybox-001的磁盤映像文件拷貝到目標機上后, # 在執行以下命令就成功了。但要注意目錄必須與busybox配置文件中一致. # 當然,最好是先用iSCSI或NFS,Samba等將磁盤映像文件共享,在做以下操作會更真實. xl migrate -C /etc/xen/busybox busybox-001 192.168.137.151
(14) 關于Xen提供的批量啟動、停止或遷移DomU的腳本—-xendomains的分析說明:
#注: 此腳本存在一個小Bug,需要小小的修改下. # 下面分析僅僅對start 和 stop函數做簡略說明,其它部分可自行參看: /etc/init.d/xendomains # xendomains: 會讀取/etc/sysconfig/xendomains這個默認參數配置文件. parseln() { if [[ "$1" =~ '(domain' ]] || [[ "$1" = "{" ]]; then name=;id= elif [[ "$1" =~ '(name' ]]; then name=$(echo $1 | sed -e 's/^.*(name \(.*\))$/\1/') elif [[ "$1" =~ '(domid' ]]; then id=$(echo $1 | sed -e 's/^.*(domid \(.*\))$/\1/') elif [[ "$1" =~ '"name":' ]]; then name=$(echo $1 | sed -e 's/^.*"name": "\(.*\)",$/\1/') elif [[ "$1" =~ '"domid":' ]]; then id=$(echo $1 | sed -e 's/^.*"domid": \(.*\),$/\1/') fi # 此處即上上面所說的小Bug: #此處是手動添加的,因為,parseln函數是用來統一獲取DomU的name、id的, #但從腳本中看,作者是希望從這里獲取DomU的運行狀態的,但似乎忘記寫了. state=$(xl list |awk -v DomUname=$name '$1==DomUname{print $5}') [ -n "$name" -a -n "$id" ] && return 0 || return 1 } stop() { exec 3>&2 2> /dev/null#此句是將當前進程的文件描述符 綁定到系統標準錯誤輸出. # Collect list of domains to shut down if test "$XENDOMAINS_AUTO_ONLY" = "true"; then rdnames; fi echo -n "Shutting down Xen domains:" name=;id= while read LN; do parseln "$LN" || continue if test $id = 0; then continue; fi echo -n " $name" # XENDOMAINS_AUTO=/etc/xen/auto/ # XENDOMAINS_AUTO_ONLY='true' 此為默認值. # 自動關閉/etc/xen/auto/目錄下所有的DomU. 此目錄下放置DomU的配置文件. # 但此處的并沒有真正實現自動關閉。 # NAMES: 是rdnames函數定義的變量.它保存了/etc/xen/auto中所有DomU的名字, # NAMES="DomU1|DomU2|DomU3|...." if test "$XENDOMAINS_AUTO_ONLY" = "true"; then #這里原本是關閉:/etc/xen/auto/目錄下所有打算自動啟動的DomU. #但stop函數中并沒有實際去關閉,而是留空了. fi # XENDOMAINS_SYSRQ chould be something like just "s" # or "s e i u" or even "s e s i u o" # for the latter, you should set XENDOMAINS_USLEEP to 1200000 or so # /etc/sysconfig/xendomains中對XENDOMAINS_SYSRQ的注解: # The xendomains script can send SysRq requests to domains on shutdown. # If you don't want to MIGRATE, SAVE, or SHUTDOWN, this may be a possibility # to do a quick and dirty shutdown ("s e i u o") or at least sync the disks # of the domains ("s"). # SysRq:的含義我沒有弄明白.若有知情著,還望賜教. if test -n "$XENDOMAINS_SYSRQ"; then for sysrq in $XENDOMAINS_SYSRQ; do echo -n "(SR-$sysrq)" # CMD=/usr/sbin/xl XMR=`$CMD sysrq $id $sysrq 2>&1 1>/dev/null` if test $? -ne 0; then echo -e "\nAn error occurred while doing sysrq on domain:\n$XMR\n" rc_failed $? echo -n '!' fi # usleep just ignores empty arg usleep $XENDOMAINS_USLEEP done fi # 這里是判斷是否存在僵尸DomU, 需要注意: state變量并未定義,此可能是個Bug. # 可自行修復下,在parseln函數中添加"state=$($CMD list |awk -v DomUName=$name '$1==DomUName{print $5}')" if test "$state" = "-b---d" -o "$state" = "-----d"; then echo -n "(zomb)" continue fi #這里是用來判斷MigrateServer是否指定了,若指定了,則開始批量遷移DomU到指定的XenHypervisor. #指定XENDOMAINS_MIGRATE,可直接修改/etc/sysconfig/xendomains。 if test -n "$XENDOMAINS_MIGRATE"; then echo -n "(migr)" #啟動一個監視遷移的線程.默認若在300秒內沒有遷移完成,則監控線程將認為遷移超時, #而強制kill掉遷移線程. watchdog_xencmd migrate & #獲取監視遷移線程的PID,若在300秒內遷移完成,則kill掉監視遷移的線程. WDOG_PID=$! # CMD=/usr/sbin/xl #啟動DomU遷移. XMR=`$CMD migrate $id $XENDOMAINS_MIGRATE 2>&1 1>/dev/null` if test $? -ne 0; then echo -e "\nAn error occurred while migrating domain:\n$XMR\n" rc_failed $? echo -e '!' kill $WDOG_PID >/dev/null 2>&1 else kill $WDOG_PID >/dev/null 2>&1 echo -e . usleep 1000 #若遷移被設置了,則所有即將被關閉的DomU都將被遷移到指定Xen Hypervisor上. #下面的save 和 shutdown就不會被執行了。 continue fi fi if test -n "$XENDOMAINS_SAVE"; then echo -n "(save)" # 將Shell函數放到后臺運行. watchdog_xencmd save & # 獲取這個后臺執行的函數線程的PID. WDOG_PID=$! # Default:XENDOMAINS_SAVE=/var/lib/xen/save mkdir -p "$XENDOMAINS_SAVE" # 這里開始對DomU進行掛起,掛起操作的默認超時時間是300秒,watchdog_xencmd負責監控下面命令執行是否超時. # 若超時,watchdog_xencmd會將其自動強制結束. XMR=`$CMD save $id $XENDOMAINS_SAVE/$name 2>&1 1>/dev/null` # 若以上命令執行成功,則強制將watchdog_xencmd線程結束掉. if test $? -ne 0; then echo -e "\nAn error occurred while saving domain:\n$XMR\n" rc_failed $? echo -e '!' kill $WDOG_PID >/dev/null 2>&1 else kill $WDOG_PID >/dev/null 2>&1 echo -e . usleep 1000 continue fi fi # XENDOMAINS_SHUTDOWN=--wait if test -n "$XENDOMAINS_SHUTDOWN"; then # XENDOMAINS_SHUTDOWN should be "--wait" echo -n "(shut)" watchdog_xencmd shutdown & WDOG_PID=$! XMR=`$CMD shutdown $XENDOMAINS_SHUTDOWN $id 2>&1 1>/dev/null` if test $? -ne 0; then echo -e "\nAn error occurred while shutting down domain:\n$XMR\n" rc_failed $? echo -e '!' fi kill $WDOG_PID >/dev/null 2>&1 fi done < <($CMD list -l | grep "$LIST_GREP") # NB. this shuts down ALL Xen domains (politely), not just the ones in # AUTODIR/* # This is because it's easier to do ";-)" but arguably if this script is run # on system shutdown then it's also the right thing to do. # all_zombies返回0,表示沒有找到僵尸DomU,返回1,表示找到僵尸DomU. if ! all_zombies && test -n "$XENDOMAINS_SHUTDOWN_ALL"; then # XENDOMAINS_SHUTDOWN_ALL="--all --wait" echo -n " SHUTDOWN_ALL " watchdog_xencmd shutdown 1 false & WDOG_PID=$! XMR=`$CMD shutdown $XENDOMAINS_SHUTDOWN_ALL 2>&1 1>/dev/null` if test $? -ne 0; then echo -e "\nAn error occurred while shutting down all domains: $XMR\n" rc_failed $? echo -e '!' fi kill $WDOG_PID >/dev/null 2>&1 fi # Unconditionally delete lock file rm -f $LOCKFILE } start() { # LOCKFILE=/var/lock/subsys/xendomains if [ -f $LOCKFILE ]; then echo -e "xendomains already running (lockfile exists)" return; fi saved_domains=" " # XENDOMAINS_RESTORE=true # XENDOMAINS_SAVE=/var/lib/xen/save # contains_something :檢查指定目錄下是否有文件,有則返回0,無則返回1 if [ "$XENDOMAINS_RESTORE" = "true" ] && contains_something "$XENDOMAINS_SAVE" then # $(dirname "$LOCKFILE") = /var/lock/subsys mkdir -p $(dirname "$LOCKFILE") touch $LOCKFILE echo -n "Restoring Xen domains:" saved_domains=`ls $XENDOMAINS_SAVE` #這里是用來恢復所有調用stop函數被掛起(save)的DomU。 for dom in $XENDOMAINS_SAVE/*; do if [ -f $dom ] ; then HEADER=`head -c 16 $dom | head -n 1 2> /dev/null` #HEADCOMP="LinuxGuestRecord" : 這是xm save DomU后,其保存文件中頭部16個字符. #HEADCOMP="Xen saved domain" : 這是xl save DomU后,其保存文件中頭部16個字符. if [ "$HEADER" = "$HEADCOMP" ]; then echo -n " ${dom##*/}" # CMD=/usr/sbin/xl XMR=`$CMD restore $dom 2>&1 1>/dev/null` #$CMD restore $dom if [ $? -ne 0 ]; then echo -e "\nAn error occurred while restoring domain ${dom##*/}:\n$XMR" rc_failed $? echo -e '!' else # mv $dom ${dom%/*}/.${dom##*/} # 若恢復成功則刪除XENDOMAINS_SAVE中相應的DomU保存的鏡像. rm $dom fi fi fi done echo -e fi # contains_something :檢查指定目錄下是否有文件,有則返回0,無則返回1 if contains_something "$XENDOMAINS_AUTO" then touch $LOCKFILE echo -n "Starting auto Xen domains:" # We expect config scripts for auto starting domains to be in # XENDOMAINS_AUTO - they could just be symlinks to files elsewhere # Create all domains with config files in XENDOMAINS_AUTO. # TODO: We should record which domain name belongs # so we have the option to selectively shut down / migrate later # If a domain statefile from $XENDOMAINS_SAVE matches a domain name # in $XENDOMAINS_AUTO, do not try to start that domain; if it didn't # restore correctly it requires administrative attention. # XENDOMAINS_AUTO=/etc/xen/auto # 這是自動列出/etc/xen/auto/下所有DomU的配置文件,并啟動. for dom in $XENDOMAINS_AUTO/*; do # dom=/etc/xen/auto/busybox-001 # ${dom##*/} = busybox-001 echo -n " ${dom##*/}" # $(echo $dom | sed -n 's/^.*\/\(.*\)$/\1/p') = busybox-001 shortdom=$(echo $dom | sed -n 's/^.*\/\(.*\)$/\1/p') # grep -w :表示單詞匹配模式 echo $saved_domains | grep -w $shortdom > /dev/null #is_running:判斷提供的DomU是否正在運行.0表示正在運行. if [ $? -eq 0 ] || is_running $dom; then echo -n "(skip)" else XMC=`$CMD create --quiet --defconfig $dom` if [ $? -ne 0 ]; then echo -e "\nAn error occurred while creating domain ${dom##*/}: $XMC\n" rc_failed $? echo -e '!' else # usleep函數是延時函數. # XENDOMAINS_CREATE_USLEEP=5000000 # usleep延時計算方法:sleep $1/1000000 usleep $XENDOMAINS_CREATE_USLEEP fi fi done fi }
(15) Xenstore的簡單說明:
列目錄
xenstore-ls :遞歸方式列出xenstored中所有的鍵值對. xenstore-list :僅顯示當前目錄中內容. 如: [root@node1 xen]# xenstore-list -s / #列出xenstored根目錄樹中的內容. tool : 暫時沒有數據. local :存放了活動虛擬機配置和驅動信息 vm :存放虛擬機管理信息 libxl :這是一個空文件。用途不詳.
讀寫
xenstore-read : 可用來讀取xenstored中文件的內容. xenstore-write : 可用來修改xenstored中的內容。
建立/刪除目錄
xenstore-mkdir xenstore-rm
監視
xenstore-watch
附件1:
Xen已解決的安全問題【原文:http://www.51ou.com/browse/xen/50466.html】
(1)Xen的訪問控制
Xen通過自己的訪問控制模塊ACM。能有效解決諸多訪問不當造成的安全問題。
ACM實現了兩種策略機制,分別是中國墻(Chinesewall)策略和簡單類型強制(simple type enforcement:STE)策略。其中,中圍墻策略定義了一組中國墻類型,并因此定義沖突集,然后根據類型定義標簽。該策略根據標簽來進行判斷,若兩個虛擬機的標簽處在同一個沖突集中。則不能同時在相同的系統上運行。因此該機制主要用于虛擬機之間的信息流控制。STE策略亦定義了一組類型(該類型針對的是域所擁有的資源),然后根據類型定義標簽,要求當上體擁有客體標簽時。主體才能訪問客體。以此來控制資源共享。除此以外,Xen的Domain 0用戶可以根據自己的需求制定安全策略。當虛擬機請求與別的虛擬機進行通信或訪問資源時。ACM模塊能根據用戶定義的策略判斷,以此達到對虛擬機的資源進行控制以及對虛擬機之間的信息流進行控制的目的。
(2)Xen的可信計算
可信計算技術是一種新興的信息安全手段,其安全措施是通過構建信任鏈來防御攻擊。通過傳遞機制,在系統啟動時可將B10S中最先啟動的代碼BIOS boot loader作為整個信任鏈的起點,依次逐級向上傳遞系統控制權并構建信任鏈,直到應用層??尚庞嬎憧梢杂行浹a傳統安全防議無法提供的有關通信終點節點完整性與可信性差的問題。
可信計算平臺是能夠提供可信計算服務的計算機軟硬件實體。它能夠提供系統的可靠性、可用性以及信息和行為的安全性。因此,建立可信平臺是應對云計算安全的一種重要手段。而可信平臺模塊(TPM)是可信計算的基石。
TPM實際上是一個含有密碼運算部件和存儲部件的系統級芯片,是云計算平臺重要的防篡改組件,這能有效保證平臺的安全。相對于傳統物理平臺,可信平臺在Xen等虛擬化平臺上實現TPM,有一定的優越性。平時計算機裝了太多軟件,這使得構建信任鏈變得很復雜。相對而言,使用虛擬機(VM)配合虛擬可信平臺模塊(vTPM)組成虛擬終端可信平臺要方便得多。這是因為虛擬終端可信平臺通常只為處理某種特定任務而產生,可由用戶自定義其所需功能,所以功能相對簡單,更容易構建信任鏈。此平臺可以來處理需要安全保障的在線服務或敏感數據的訪問。
現在,Xen 3.0以上的版本都能支持vTPM的實現。vTPM能實現虛擬計算系統中虛擬機的安全可靠。vTPM可以使平臺上的每個虛擬機利用其功能。讓每個需要TPM功能的虛擬機都感覺是在訪問自己私有的TPM一樣。在平臺搭建中,可以創建多個虛擬TPM,這樣每一個如實地效仿硬件TPM的功能,可有效維護各個虛擬機的安全。從而使Xen搭建的云計算平臺處于較穩定狀態。
Xen的現有問題及解決策略
目前的Xen的安全性還有較多的安全問題。比如,Domain 0是一個安全瓶頸,其功能較其他域強,所以容易被敵手發起蠕蟲、病毒、DoS等各種攻擊,如果Domain 0癱瘓或者被敵手攻破,那么將破壞整個虛擬機系統。Xen的隱通道問題沒有解決。在Xen上就不可能運行高安全等級的操作系統。虛擬機共享同一套硬件設備,一些網絡安全協議可能更加容易遭到惡意破壞和惡意實施。Xen提供了方便的保存和恢復機制。使得操作系統數據的回滾和重放非常容易,但這些將影響操作本身的密碼特性。除此之外,在Xen中,由于安全機制做在Guest OS中,所以不能保證VMM的安全。Xen只能限制頁表一級的內存I/O地址空間。而中斷和I/0端口地址空間的粒度要比頁表小得多。如果不同虛擬機中的驅動不幸被分配到同一個頁表空間,那么它們就可以訪問對方的內存地址空間,造成安全問題。
針對Domain 0的問題??上魅跛墓δ?。將其功能分解到其他域。這將會適當減少Domain 0的瓶頸作用。對于敏感數據要進行多次擦除防止再恢復。另外,Xen的ACM模塊不能完全解決設備隔離和資源隔離問題,將Xen和LaGrande技術結合是一個不錯的選擇。LaGrande是lnfel將要實施的一種硬件技術,它是一組通用的硬件安全增強組件。用來防止敏感的信息被惡意軟件攻擊。其安全功能將被整合到處理器和芯片集中。能有效增強設備隔離,實現I/O保護、內存越界保護、鍵盤、顯示的隔離保護等。
業界對虛擬化安全的努力
針對傳統安全防火墻技術不能有效監控虛擬機流量的問題,mtor Networks公司使用VMware的API來開發虛擬安全分析器,以檢測虛擬交換機流量——在虛擬層之上的網絡層流量。該公司也開發了虛擬網絡防火墻,該防火墻基于虛擬機管理器,可認證有狀態的虛擬防火墻,檢查所有通過虛擬機的數據分組,組織所有未經批準的連接和允許對數據分組進行更深層次的檢查,確保了虛擬機間通信的安全。針對虛擬環境的安全問題,目前Resolution Enterprise公司提出要對虛擬化環境采取深層防護戰略。
除此以外。開源Xen管理程序社區Xen.org已經開始實施Xen云平臺(XCP)計劃。目的是在云環境中利用領先的Xen管理程序。為未來的云服務提供安全的、經過驗證的開源基礎設施乎臺。目前。已經發布了XCPl.0及其修正版,并將慢慢發布更加穩定的版本。
Citrix
Citrix系統公司是全球領先的應用服務器軟件方案供應商。Citrix憑借其卓越的技術方案和業務成就,贏得了業界與用戶的廣泛贊譽。收購XenSource之后,Ctrix在虛擬化領域的能力進一步提高,具有了足夠的技術儲備應對云計算挑戰。Citrix與其它云端服務供貨商的最大不同在于,提供端對端的產品服務:包含Dazzle、XenDesktop、XenApp、NetScaler、XenServer與即將推出的XenClient,以及透過遵循開放標準等方式,與儲存設備、服務器業者結盟、推廣云端服務產品
附件2:
qemu-img是qemu用來實現磁盤映像管理的工具組件,其有許多子命令,分別用于實現不同的管理功能,而每一個子命令也都有一系列不同的選項。其使用語法格式為“qemu-img subcommand [options]”,支持的子命令如下。
◇ create:創建一個新的磁盤映像文件;
格式: qemu-img -f DISK_FORMAT -o ? /tmp/test.img #查看指定的DISK_FORMAT所支持的額外特性參數.
注: 如果“-o”選項中使用了backing_file這個選項來指定其后端鏡像文件,那么這個創建的鏡像文件僅記錄與后端鏡像文件的差異部分,后端鏡像文件不會被修改,除非在QEMU monitor中使用“commit”命令或者使用“qemu-img commit”命令去手動提交這些改動; 這種情況下,size參數不是必須需的,其值默認為后端鏡像文件的大小。另外,直接使用“-b backfile”參數也與“-o backing_file=backfile”效果相同。
qemu-img create -f qcow2 -b /tmp/rhel6u3.img /tmp/rhel6u3.qcow2 # 或 qemu-img create -f qcow2 -o backing_file=/tmp/rhel6u3.img /tmp/rhel6u3.qcow2 # 注: rhel6u3.qcow2 可以作為鏡像文件啟動, 有點類似VMware的連接克隆VM, # 但需要注意: 這并非是VMware的連接克隆,因為,當你啟動rhel6u3.qcow2的VM后, # 你在該VM中創建的文件、目錄等會在關閉該VM后,自動同步到rhel6u3.img中. # 若你啟動了rhel6u3.img這個VM,可能會造成rhel6u3.qcow2鏡像出現錯誤.
◇ check:檢查磁盤映像文件中的錯誤;
對磁盤鏡像文件進行一致性檢查,查找鏡像文件中的錯誤,目前僅支持對“qcow2”、“qed”、“vdi”格式文件的檢查。
(1) qcow2: QEMU 0.8.3版本引入的鏡像文件格式,也是目前使用最廣泛的格式。
(2) qed(QEMU enhanced disk): 從QEMU 0.14版開始加入的增強磁盤文件格式,
它是為了避免qcow2格式的一些缺點,同時提高性能而引入,目前還不夠成熟。
(3) vdi(Virtual Disk Image): Oracle的VirtualBox虛擬機中的存儲格式。
-f fmt: 指定文件的格式,如果不指定格式qemu-img會自動檢測,filename是磁盤鏡像文件的名稱(包括路徑)。
qemu-img check -f qcow2 /tmp/rhel6u3.qcow2
◇ convert:轉換磁盤映像的格式;
格式:qemu-img convert [-c] [-f fmt] [-O output_fmt] [-o options] filename [filename2 […]] output_filename
-c :對輸出的鏡像文件進行壓縮,僅支持qcow2和qcow格式,且此壓縮是只讀的,若壓縮的扇區被重寫,則會被重寫為未壓縮的數據。
-f : 指定源磁盤映像文件的格式.
-O : 指定輸出磁盤映像文件的格式.
-o : 指定輸出磁盤映像文件的其它選項:如:后端鏡像、文件大小、是否加密等等
注: 使用backing_file選項來指定后端鏡像,讓生成的文件是copy-on-write的增量文件,
這時必須讓轉換命令中指定的后端鏡像與輸入文件的后端鏡像的內容是相同的,
盡管它們各自后端鏡像的目錄、格式可能不同。
注: 一般來說,輸入文件格式fmt由qemu-img工具自動檢測到,而輸出文件格式output_fmt根據自己需要來指定,默認會被轉換為raw文件格式(且默認使用稀疏文件的方式存儲以節省存儲空間)。另外如果使用qcow2、qcow、cow等作為輸出文件格式來轉換raw格式的鏡像文件(非稀疏文件格式),鏡像轉換還可以起到將鏡像文件轉化為更小的鏡像,因為它可以將空的扇區刪除使之在生成的輸出文件中并不存在。
qemu-img convert /tmp/my-vmware.vmdk /tmp/my-kvm.img
◇ info:顯示指定磁盤映像的信息;
注: 如果文件是使用稀疏文件的存儲方式,也會顯示出它的本來分配的大小以及實際已占用的磁盤空間大小。如果文件中存放有客戶機快照,快照的信息也會被顯示出來。
qemu-img info /tmp/rhel6u3.img
◇ snapshot:管理磁盤映像的快照;
格式: qemu-img snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename
-l: 選項是查詢并列出鏡像文件中的所有快照
-a snapshot : 是讓鏡像文件使用某個快照
-c snapshot : 是創建一個快照
-d snapshot : 是刪除一個快照。
◇ commit:提交filename文件中的更改到后端支持鏡像文件(創建時通過backing_file指定的)中去;
格式: qemu-img commit [-f fmt] filename
◇ rbase:改變鏡像文件的后端鏡像文件,只有qcow2和qed格式支持rebase命令;
格式: qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
-b backing_file:指定作為后端磁盤映像的文件
-F backing_fmt:指定將后端映像文件轉換為何種磁盤映像格式。
注:rbase操作可工作于兩種模式下,安全模式(Safe Mode)【默認模式】和 非安全模式【Unsafe Mode】
在安全模式下qemu-img會去比較原來的后端鏡像與現在的后端鏡像的不同進行合并處理;
-u 可指定非安全模式(Unsafe Mode),此模式主要用于將后端鏡像進行了重命名或移動位置之后對前端鏡像文件的修復處理,由用戶去保證后端鏡像的一致性。
◇ resize:增大或縮減磁盤映像文件的大??;
格式: qemu-img resize filename [+ | -]size
+ : 增加
– :減少
size: 單位支持:K/M/G/T
縮小鏡像的大小前,需保證客戶機里面的文件系統有空余空間,否則會數據丟失,
另外,qcow2格式文件不支持縮小鏡像的操作。在增加了鏡像文件大小后,也需啟動客戶機到
里面去使用“fdisk”、“parted”等分區工具進行相應的操作才能真正讓客戶機使用到增加后的鏡像空間。
不過使用resize命令時需要小心(最好做好備份),如果失敗的話,可能會導致鏡像文件無法正常使用而造成數據丟失。
qemu-img resize /tmp/rhel6u3-a.img +2G
附件3:
1.1 創建一個Busybox虛擬機示例:
(1) 創建一個虛擬磁盤映像文件:
qemu-img create -f raw -o size=2G /images/xen/busybox.img
(2) 將其格式化并掛載:
cd /images/xen mkfs.ext2 busybox.img mount -o loop /images/xen/busybox.img /mnt
(3) 編譯busybox
# 下載busybox: tar xvjf busybox-*.tar.bz2 cd busybox* make menuconfig # 注:若busybox需要進行靜態編譯則需要安裝: yum install glibc-static ; # 此RPM包可以支持靜態編譯,使編譯的應用程序可直接包含所需要的外部庫,而非連接載入外部庫. busybox Settings-->Build Optons-->Build BusyBox as a static binary(no shared libs) |-->Installation Options(”make install" behavior) make make install #注:安裝后,busybox會文件安裝到當前編譯目錄下的_install目錄中. cd _install cp -a * /mnt #將busybox的所有文件copy到busybox.img中,作為一個模擬的根文件系統. # 提供以下目錄,也是十分重要的: mkdir -pv /mnt/{proc, var, sys, etc, dev, usr, tmp, home, root, opt}
(4) chroot測試:
chroot /mnt
(5) 在Dom0上創建橋設備
# 注: 添加橋,并配置DomU啟動時,自動橋接到Dom0上創建的橋設備. # 這里存在一個Kernel-Bug: 若使用kernel-3.6.10-68、3.6.18都存在將物理網卡橋到橋設備后,Kernel無響應的問題. # 建議: 做橋實驗時,采用kernel-3.6.7版本的。 yum install bridge-utils vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 NM_CONTROLLED=no TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no BRIDGE=xenbr0 vim /etc/sysconfig/network-scripts/ifcfg-xenbr0 DEVICE=xenbr0 NM_CONTROLLED=no TYPE=Bridge BOOTPROTO=none IPADDR=192.168.1.10 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 ONBOOT=yes USERCTL=no DELAY=0 service NetworkManager stop chkconfig NetworkManager off #NetworkManager會導致橋創建失敗. service network restart
(6) 為busybox測試系統提供網卡驅動
cd /mnt/lib/modules/`uname -r`/kernel/drivers/net/ modinfo xen-netfront.ko #PV模式下,DomU應該使用網卡的前半段;因此這個驅動需要. # 查看xen-netfront.ko 有沒有依賴其他模塊,即"depends"段是否有依賴模塊. modinfo 8139too.ko modinfo mii.ko #8139依賴與mii模塊. mkdir -pv /mnt/lib/modules cp xen-netfront.ko 8139too.ko mii.ko /mnt/lib/modules/ umount /mnt #卸載busybox的映像文件.
(7) 創建啟動DomU的配置文件:
ls /etc/xen xl.conf #此配置文件為xl命令的全局通用配置文件. xlexample.hvm #這是一個HVM模式運行的DomU的示例配置文件. xlexample.pvlinux #這是PV模式運行的DomU配置文件示例. cp xlexample.pvlinux busybox vim busybox 【 name="busybox-001" kernel="/boot/vmlinuz" #注:這是Dom0的/boot下的vmlinuz,此為DomU啟動時的Kernel文件. ramdisk="/boot/initramfs.img" #它也是Dom0上的initramfs.img. extra="selinux=0 init=/bin/sh" #指定傳遞給kernel的額外參數,關閉selinux,系統啟動后第一個執行的程序為/bin/sh root="/dev/xvda ro" #指定根文件系統的位置; 這里需要注意: 因為busybox.img創建后,并沒有分區,就直接被格式化了. # 因此就一個分區,不存在其它分區,所以這里直接寫成/dev/xvda而不是/dev/xvda1. # 另外 系統在啟動初期是以只讀方式掛載的.這樣需要注意. memory=256 #指定內存大小為256M #maxmem = 512 #若啟用最大內存參數,則可以在DomU運行時,通過以下命令來動態調整DomU的內存. # xl mem-max 和 xl mem-set vcpus=2 disk=['/images/xen/busybox.img,raw,xvda,rw'] vif=[ 'mac=00:16:3e:00:00:01,bridge=xenbr0' ] # bridge:是關鍵參數,其它參數都是可選參數。 】
(8) 啟動busybox虛擬機登錄后:
ifconfig -a #是看不到任何接口的. insmod /lib/modules/xen-netfront.ko #安裝網卡接口驅動模塊 ifconfig -a ifconfig eth0 192.168.1.20 up ctrl + ] # 回到到Dom0,查看網絡接口狀態. Dom0: ifconfig -a #將可以看到一個新接口.vif#.@ # "#": 表示DomU的ID ; @:表示Dom0上創建的橋ID. Dom0: brctl show #將看到新接口已經被橋接到Dom0的橋設備上了。
1.2 創建自有Kernel和initramfs文件的busybox DomU
(1) 提供磁盤映像文件【注: Xen的VM對qcow2格式的磁盤可能無法識別,因此,這里建議自行測試,raw格式是沒有問題的.】
qemu-img create -f qcow2 -o size=5G,preallocation=metadata /images/xen/busybox3.img
(2) 對該映像文件進行分區
# losetup :這是一個將loop設備文件關聯到/dev/loop*的命令,只有關聯到/dev/loop設備后,才能對loop設備文件分區格式化. losetup -a #查看當前已經被關聯的loop設備情況. losetup -f #列出當前可用的第一個空閑loop設備. # 注:ls /dev/loop* 可用看到系統中已經存在的loop設備. losetup /dev/loop0 /images/xen/busybox3.img #將busybox3.img關聯到loop0設備,接著就可以對其做分區格式化了. #mount -o loop是先做關聯,然后就直接掛載loop設備到掛載點了。 fdisk /dev/loop0 kpartx -av /dev/loop0 #刷新loop0的分區信息,并創建分區映射到/dev/mapper中. ls /dev/mapper #分區刷新完成后,可在這里看到loop0的分區文件 mkfs.ext3 /dev/mapper/loop0p1 mkfs.ext3 /dev/mapper/loop0p2 #對loop0p2進行格式化.
(3)向 /images/xen/busybox3.img 中boot分區和root分區提供數據文件.:
# <1> 掛載分區到/mnt mkdir /mnt/{boot, sysroot} mount /dev/mapper/loop0p1 /mnt/boot mount /dev/mapper/loop0p2 /mnt/sysroot # <2>提供boot分區文件 cp /boot/vmlinuz-2.6.* /mnt/boot/ cp /boot/initramfs-2.6.* /mnt/boot/initramfs.img #安裝bootloader到/dev/loop0,復制啟動文件到/mnt/boot/grub。 grub-install --root-directory=/mnt /dev/loop0 vim /mnt/boot/grub/grub.conf 【 default=0 timeout=3 title Busybox (Linux-2.6.32) root (hd0,0) kernel /vmlinuz root=/dev/xvda1 ro selinux=0 init=/bin/bash initrd /initramfs.img 】 # <3>提供root分區文件 cp -a $BUSYBOX/_install/* /mnt/sysroot/ mkdir -pv /mnt/sysroot/{proc, var, dev, lib/modules, tmp, etc, home, root} cp /lib/modules/`uname -r`/kernel/drivers/net/xen-netfront.ko /mnt/sysroot/lib/modules/ # <4>手動拆除loop設備 losetup -a #查看當前已經關聯的loop設備 umount /mnt/boot umount /mnt/sysroot kpartx -d /dev/loop0 #刪除loop0中分區的映射.
(4) 提供busybox3的啟動配置文件
vim /etc/xen/busybox3 【 name="busybox-003" # 下面參數都去掉,因為busybox3已經有自己的grub.conf和kernel、initramfs了. #kernel="/boot/vmlinuz" #注:這是Dom0的/boot下的vmlinuz,此為DomU啟動時的Kernel文件. #ramdisk="/boot/initramfs.img" #它也是Dom0上的initramfs.img. #extra="selinux=0 init=/bin/sh" #指定傳遞給kernel的額外參數,關閉selinux,系統啟動后第一個執行的程序為/bin/sh #root="/dev/xvda ro" #指定根文件系統的位置; 這里需要注意: 因為busybox.img創建后,并沒有分區,就直接被格式化了. # 因此就一個分區,不存在其它分區,所以這里直接寫成/dev/xvda而不是/dev/xvda1. # 另外 系統在啟動初期是以只讀方式掛載的.這樣需要注意. memory=256 #指定內存大小為256M #maxmem = 512 vcpus=2 disk=['/images/xen/busybox3.img,qcow2,xvda,rw'] vif=[ 'mac=00:16:3e:00:00:02,bridge=xenbr0' ] # bridge:是關鍵參數,其它參數都是可選參數。 bootloader="/usr/bin/pygrub" #此pygrub是用python研發的工具,它可以向DomU提供啟動引導, #并自動找到busybox3.img中第一個分區并啟動kernel. # 注: 關于根文件系統(Root Filesystem):它包含了應用程序、系統組件及配置文件等運行DomU的各種所需文件的 # 文件系統,其并非必須包含Kernel及initramfs.img,它們完全可以放在Dom0中; 事實上,用于DomU的內核文件必須 # 要能夠允許Dom0訪問到,因為其運行時需要與Xen Hypervisor通信,因此這些組件必須位于Dom0能夠訪問到的 # 任何文件系統上; 然而目前基于pygrub的方式,允許DomU的內核文件直接放置于DomU的虛擬磁盤映像文件中, # 但pygrub實際上只是一種讓Dom0可以訪問到DomU虛擬磁盤映像文件中的kernel文件的工具. 】
附件4:
虛擬化面臨的重要問題:CPU、RAM、I/O的模擬。
CPU模擬:
(1) 所有OS設計時都認為Kernel是可以控制所有硬件,并可運行CPU的特權指令,即Kernel運行于CPU的Ring0上。
(2) 多個OS無法同時直接運行于硬件層之上,它們必須運行在Hypervisor層(下文稱:Host)上;就如同不安裝操作系統,就不能安裝VMware,沒有VMware就無法讓虛擬機(下文稱:Guest)運行起來一樣。那問題來了,若Guest必須運行在CPU的Ring0上,Host運行在哪里?
(3) OS設計時它認為自己是可以控制所有硬件資源的,那GuestOS之間不就可以相互影響了嗎?Guest1要關機,若
它直接執行CPU的特權指令關機,那它應該可以關閉整個物理機器,這不是虛擬化所希望的。
這些問題給CPU虛擬化帶來了諸多問題, 但實際上Host一定是真正能執行CPU的特權指令的,Guest運行起來后,它實際控制的CPU是通過軟件模擬的CPU,實際上任何物理硬件都是通過集成電路進行運算,通過微代碼向外提供輸出結果的接口,只有通過軟件模擬出這些接口就可以模擬硬件.
BT技術: BinaryTranslation(二進制翻譯)技術,它可以讓Guest在發起特權指令時,直接將其翻譯為Host的系統調用,以便加速Guest的執行性能.BT技術出現是因為Guest用戶空間的APP要進行特權操作時,Guest上的APP需要先將請求發給Guest的Kernel,Guest的Kernel經翻譯轉換發給模擬CPU,模擬CPU在將其轉換為Host的系統調用,再發給Host的Kernel再進行翻譯轉換后給物理CPU執行.最后返回,這使得GuestOS的執行性能不高.
<> 模擬CPU 和 虛擬CPU
》模擬CPU:是完整虛擬,即模擬出CPU的環0,環1,環2,環3;這通常在底層硬件與虛擬環境的硬件不同時采用模擬CPU的方式。
》虛擬CPU:僅模擬CPU的環0, Guest的用戶空間中的APP可直接運行在物理CPU的環3上,僅環0上的特權指令進行翻譯.這是Guest的硬件環境與底層硬件環境一致時用。
<> 完全虛擬化 和 半虛擬化
》完全虛擬化(Full-Virtulization): 即Guest不知道自己是運行在虛擬化環境中,它一直都認為自己是可以控制全部的硬件資源.
因此需要將GuestOS對特權指令的操作都進行翻譯后,由Host帶為執行。
VMware的BT技術 和 AMD CPU的AMD-v、Intel的VT-x這兩種HVM(硬件虛擬化)技術實際上都是完全虛擬化,
因為它們都是幫助Host高效完成特權指令翻譯的技術。
注:AMD-v 和 VT-x實現了將原先只有4環的CPU擴展為5環,并讓Host運行在-1環上,騰出環0給Guest用,這樣Guest就
認為自己是運行在環0上,并且可直接執行特權指令,但實際上,Guest調用環0上的特權指令時,CPU會直接將其翻譯為
真實的特權指令并激活Host的內核來調用環-1來執行特權指令,這進一步縮短了翻譯流程。
Memory虛擬化:
(1) 在物理機中,內存的使用經過虛擬化后,提供給物理機上運行的APP的。
(2) 在物理機中,APP看到的內存是:虛擬線性地址空間,即APP認為自己使用的是全部的物理內存,從0-1024(假設內存為1G)
內核看到的內存是:真實物理地址空間
(3) 由于物理機的內存已經被虛擬化過了, Guest訪問物理內存就需要再次被虛擬一層。
注:TLB: 轉換后頁面緩存
Host上的APP訪問內存的流程:
APP–>發送訪問線性地址:10page的數據–>CPU–>將10page的線性地址轉給MMU–>
查詢線性與物理地址映射表–>緩存映射關系到TLB,并讀取物理地址中的數據–>返回。
Guest上的APP訪問內存的流程:
Shadow Page Table的方式:
注: 假設將Guest的APP訪問的虛擬線程地址稱為:GVA.
將Guest虛擬機所獲得的虛擬物理內存地址稱為:GPA
Guest-APP–>發送訪問線性地址(GVA):10page的數據–>虛擬CPU–>將其轉給虛擬MMU–>
查詢并緩存映射到虛擬TLB–>GPA的訪問請求被發給Host–>
但GPA并非Host的虛擬線性地址,又非真實物理地址,因此無法由真實CPU處理–>
Host上不得不采用軟件模擬來完成將GPA轉換為真實物理內存的物理地址,
此方式叫 Shadow page table(影子頁表),并最終獲得物理內存中的數據,返回給Guest.
Intel的EPT(Extended Page Table:擴展頁表) 和 AMD的NPT(Nested Page Table:嵌入頁表)技術
》MMU虛擬化 和 TLB虛擬化
注: TLB虛擬化: 由于GuestA和GuestB都被分配了1G的內存,GuestA和GuestB將具有相同的內存地址,
但GuestA和GuestB它們實際映射到Host上的物理內存的地址段肯定是不同的。但GuestA
訪問它的10page的數據若被緩存在TLB中,GuestB到CPU執行時,它恰巧也要訪問它的10page的數據
那TLB中緩存的條目肯定會對GuestB造成干擾,導致訪問錯誤,因此只能將TLB清空,即GuestB到CPU
上執行時,TLB是空的,因此CPU只能再通過MMU查映射關系,緩存TLB再訪問數據。這導致TLB成了擺設
沒有起到提高訪問物理內存效率的作用。這才出現了TLB的虛擬化, 而TLB的虛擬化將原先的只有兩個
字段緩存的TLB改成緩存三個字段: 一個GuestOS標識, 一個GVA,一個HPA(Host中真實物理地址)。
Guest-APP–>發生訪問線性地址(GVA): 10page的數據—>
這時訪問請求被同時發送了兩份,并同時分別走了以下路線
路線1–>虛擬CPU–>虛擬MMU–>虛擬TLB–>完成.
路線2–>EPT/NPT硬件實現的MMU–>EPT/NPT實現的TLB–>獲取真實物理地址中的數據–>返回給Guest.
這樣做后,即沒有改變GuestOS訪問內存的過程,同時提高了GuestOS訪問內存的效率。
I/O虛擬化:
(1) 外存設備虛擬化
磁盤、光驅、U盤
(2) 網絡設備虛擬化
網卡
(3) 輸入設備 : 它的虛擬化采用角點當前被誰捕獲來模擬的,若當前被虛擬機捕獲,則會動態將模擬鍵盤或鼠標與物理設備關聯.
ps/2、USB
(4) 顯示設備 : 它不能被模擬。
VGA
I/O虛擬化的三種技術:【注: 這三種技術只針對存儲和網絡,其I/O設備的模擬不采用這些技術?!?br /> 》模擬 : 如VMware那一個文件做為VM的磁盤,這就是模擬。
》半虛擬化:
模擬的過程:Guest-APP去訪問I/O設備,如網卡,Guest-Kernel需要先調用虛擬網卡的驅動–>虛擬網卡驅動將數據
轉發給虛擬網卡–>虛擬網卡再轉給Hypervisor上模擬的網卡進程–>該網卡進程再將數據放入IO Stack(IO棧)中
等待真實網卡驅動將其轉給物理網卡并由其將數據轉發出去。
半虛擬化的過程:Guest-APP去訪問I/O設備,如網卡,但此時GuestOS明確知道自己不能直接訪問到物理網卡,因此,
直接將數據轉給前端設備(它類似一個轉發器,但對GuestOS中的用戶看來它是一個網卡設備)–>前端設備直接與
Hypervisor上的網卡進程通信–>網卡進程將數據轉到IO Stack中–>物理機驅動將其轉發給物理網卡。
注: 前端設備(IO frontend):在Guest端省去了Guest虛擬網卡驅動的步驟。
后端設備(IO backend):在Hypervisor端從虛擬網卡進程到物理網卡稱為后端設備。
》I/O透傳:
假如規劃中該主機上需要運行4臺虛擬機,該主機上安裝了6塊盤,6塊網卡,物理機磁盤和網卡都使用兩個,
剩余的都給虛擬機使用,那完全可以給每個虛擬機分一個物理磁盤和一個物理網卡,這樣其性能可幾乎接近于硬件
訪問,但這需要Hypervisor來中的設備管理器來分配。
x86平臺上DMA(直接內存訪問)是集中共享式管理的
假如當前Hypervisor管理著4塊網卡,現在GuestA和GuestB要發生數據到網卡上,
GuestA和GuestB都需要借助DMA來代其完成,但DMA是共享式管理,它僅僅負責接收
Kernel發來的命令然后,根據指示將指定內存地址中的數據發送到指定IO設備,如網卡,
或將網卡上收到的數據存入到指定的內存地址中。問題是Guest通過復雜的kernel調用
過程完成了DMA代其發送數據包到網卡,但GuestOS并不知道DMA將數據包發到那個網卡
上了,更沒有人知道回應的包到網卡后,應該轉發給那個GuestOS.
注: DMA:它的作用是幫助Kernel完成一些需要長時間等待的任務,如:寫數據到磁盤,
從磁盤中讀數據到內存,將網卡上收到的數據讀到內存等; 這對提高Kernel的執行
效率是非常有幫助的。
IO設備:
每個IO設備上都有控制器,并且每個IO設備的控制器上都有寄存器且都有相應的端口地址。
IOMMU: IO內存地址管理單元
它的作用是自動將IO總線與相應的IO端口關聯的設備。
若需要將某塊網卡綁定給某GuestOS單獨使用,就需要在Hypervisor級別來控制對I/O端口的調用
就只能接受該GuestOS的調用了,而它的實現就需要借助DMA中實現IOMMU來完成。而Intel的VT-d
就是這樣一種技術,它在DMA中實現了IOMMU,并自動來完成IO總線與IO端口的映射關聯。
IOMMU的映射是完成將物理IO設備綁定給GuestOS的第一步,接著還需完成將物理IO設備的中斷信號
也要映射給該GuestOS,要知道物理設備在實現中斷映射通常采用中斷控制器 或 DMA等方式實現,而采用DMA方式
則需要DMA必須能夠訪問全部的物理內存,因為DMA需要將IO設備的寄存器中的數據搬到指定的內存地址空間
或反過來;而若將物理硬件綁定給GuestOS,則DMA就需要訪問GuestOS的全部物理內存,但實際上GuestOS
的內存是虛擬的,這就需要經過復雜的轉換后才能訪問到其對應的物理內存地址空間,這也進一步加大了
中斷信號與GuestOS的映射;而這還是完成虛擬機綁定硬件的第二步。最后一步是完成IO設備緩沖區與GuestOS
的映射,這里必須知道緩沖區一定是物理內存中的一段空間,如何讓虛擬機的內核知道這是自己所管理的物理IO設備的
IO緩沖區?;而這一切Intel的VT-d都幫我們實現了。
Intel的VT-d
簡單來說 VT-d 是一種基于北橋的硬件輔助虛擬化技術。
Intel的硬件輔助虛擬化技術:
CPU: vt-x, EPT, tagged-TLB
IO: vt-d,SR-IOV:單根設備虛擬化協議, VMDq
這些技術詳細分為三類:
第一類: 跟處理器相關: VT-x, EPT, tagged-TLB
第二類: 跟芯片相關: vt-d
第三類: 跟IO輸入輸出相關: VMDq 和 SR-IOV
IO虛擬化技術: QEMU(法國天才程序員開發) 、virtio(澳大利亞天才程序員開發)
KVM和Xen都需要借助以上兩種虛擬化技術實現IO虛擬化。
虛擬化技術分類:
(1) 模擬:【特點:虛擬硬件環境與底層硬件環境無關.】
著名的模擬器: PearPC, Bochs, QEMU
(2) 完全虛擬化: 【特點: 虛擬硬件環境與底層硬件環境必須一致?!?br /> 在完全虛擬化中通常采用兩種加速技術:
BT : 二進制翻譯加速技術
HVM: 基于硬件的虛擬化
知名的產品:VMware Workstation, VMware Server, Parallels Disktop(iMac上用), KVM, Xen(HVM)
(3) 半虛擬化:【同樣要求虛擬硬件環境與底層硬件環境必須保持一致】
知名的開源產品: xen, uml(user-mode linux)
(4) OS級別的虛擬化:
OpenVZ, LXC(LinuX Container), libcontainer, Virtuozzo, Linux V Servers
Solaris Containers
FressBSD jails
(5) 庫虛擬化:
wine
原創文章,作者:Wn1m,如若轉載,請注明出處:http://www.www58058.com/14764