天天看點

Virtualization——虛拟化技術

虛拟化技術

一:虛拟化簡介

1.什麼是虛拟化

虛拟化(Virtualization)技術最早出現在 20 世紀 60 年代的 IBM 大型機系統,在70年代的 System 370 系列中逐漸流行起來,這些機器通過一種叫虛拟機監控器(Virtual Machine Monitor,VMM)的程式在實體硬體之上生成許多可以運作獨立作業系統軟體的虛拟機(Virtual Machine)執行個體。随着近年多核系統、叢集、網格甚至雲計算的廣泛部署,虛拟化技術在商業應用上的優勢日益展現,不僅降低了 IT 成本,而且還增強了系統安全性和可靠性。

虛拟化是一個廣義的術語,對于不同的人來說可能意味着不同的東西,這要取決他們所處的環境。在計算機科學領域中,虛拟化代表着對計算資源的抽象,而不僅僅局限于虛拟機的概念。例如對實體記憶體的抽象,産生了虛拟記憶體技術,使得應用程式認為其自身擁有連續可用的位址空間(Address Space),而實際上,應用程式的代碼和資料可能是被分隔成多個碎片頁或段),甚至被交換到磁盤、閃存等外部存儲器上,即使實體記憶體不足,應用程式也能順利執行。

2.虛拟化分類

平台虛拟化(Platform Virtualization),針對計算機和作業系統的虛拟化。

資源虛拟化(Resource Virtualization),針對特定的系統資源的虛拟化,比如記憶體、存儲、網絡資源等。

應用程式虛拟化(Application Virtualization),包括仿真、模拟、解釋技術等。

虛拟化主要是指平台虛拟化技術,通過使用控制程式(Control Program,也被稱為 Virtual Machine Monitor 或Hypervisor),隐藏特定計算平台的實際實體特性,為使用者提供抽象的、統一的、模拟的計算環境(稱為虛拟機)。虛拟機中運作的作業系統被稱為客戶機作業系統(Guest OS),運作虛拟機監控器的作業系統被稱為主機作業系統(Host OS),當然某些虛拟機監控器可以脫離作業系統直接運作在硬體之上(如 VMWARE 的 ESX 産品)。運作虛拟機的真實系統我們稱之為主機系統。

部分虛拟化(Partial Virtualization)

VMM 隻模拟部分底層硬體,是以客戶機作業系統不做修改是無法在虛拟機中運作的,其它程式可能也需要進行修改。在曆史上,部分虛拟化是通往全虛拟化道路上的重要裡程碑,最早出現在第一代的分時系統 CTSS 和 IBM M44/44X 實驗性的分頁系統中。

全虛拟化(Full Virtualization)

全虛拟化是指虛拟機模拟了完整的底層硬體,包括處理器、實體記憶體、時鐘、外設等,使得為原始硬體設計的作業系統或其它系統軟體完全不做任何修改就可以在虛拟機中運作。作業系統與真實硬體之間的互動可以看成是通過一個預先規定的硬體接口進行的。全虛拟化 VMM 以完整模拟硬體的方式提供全部接口(同時還必須模拟特權指令的執行過程)。比較著名的全虛拟化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac 和 QEMU。

超虛拟化(Paravirtualization)

這是一種修改 Guest OS 部分通路特權狀态的代碼以便直接與 VMM 互動的技術。在超虛拟化虛拟機中,部分硬體接口以軟體的形式提供給客戶機作業系統,這可以通過 Hypercall(VMM 提供給 Guest OS 的直接調用,與系統調用類似)的方式來提供。例如,Guest OS 把切換頁表的代碼修改為調用 Hypercall 來直接完成修改影子 CR3 寄存器和翻譯位址的工作。由于不需要産生額外的異常和模拟部分硬體執行流程,超虛拟化可以大幅度提高性能,比較著名的 VMM 有 Denali、Xen。

硬體輔助虛拟化(Hardware-Assisted Virtualization)

硬體輔助虛拟化是指借助硬體(主要是主機處理器)的支援來實作高效的全虛拟化。例如有了 Intel-VT 技術的支援,Guest OS 和 VMM 的執行環境自動地完全隔離開來,Guest OS 有自己的““套寄存器”,可以直接運作在最進階别。是以在上面的例子中,Guest OS 能夠執行修改頁表的彙編指令。Intel-VT 和 AMD-V 是目前 x86 體系結構上可用的兩種硬體輔助虛拟化技術。

這種分類并不是絕對的,一個優秀的虛拟化軟體往往融合了多項技術。例如 VMware Workstation 是一個著名的全虛拟化的 VMM,但是它使用了一種被稱為動态二進制翻譯的技術把對特權狀态的通路轉換成對影子狀态的操作,進而避免了低效的 Trap-And-Emulate 的處理方式,這與超虛拟化相似,隻不過超虛拟化是靜态地修改程式代碼。對于超虛拟化而言,如果能利用硬體特性,那麼虛拟機的管理将會大大簡化,同時還能保持較高的性能。

二:KVM基礎

1.簡介

從rhel6開始使用 直接把kvm的子產品做成了核心的一部分

KVM 針對運作在 x86 硬體上的、駐留在核心中的虛拟化基礎結構。KVM 是第一個成為原生 Linux 核心(2.6.20)的一部分的 hypervisor,它是由 Avi Kivity 開發和維護的,現在歸 Red Hat 所有。

這個 hypervisor 提供 x86 虛拟化,同時擁有到 PowerPC® 和 IA64 的通道。另外,KVM 最近還添加了對對稱多處理(SMP)主機(和來賓)的支援,并且支援企業級特性,比如活動遷移(允許來賓作業系統在實體伺服器之間遷移)。

KVM 是作為核心子產品實作的,是以 Linux 隻要加載該子產品就會成為一個hypervisor。KVM 為支援 hypervisor 指令的硬體平台提供完整的虛拟化(比如 Intel® Virtualization Technology [Intel VT] 或 AMD Virtualization [AMD-V] 産品)。KVM 還支援準虛拟化來賓作業系統,包括 Linux 和 Windows®。

這種技術由兩個元件實作。第一個是可加載的 KVM 子產品,當在 Linux 核心安裝該子產品之後,它就可以管理虛拟化硬體,并通過 /proc 檔案系統公開其功能。第二個元件用于 PC 平台模拟,它是由修改版 QEMU 提供的。QEMU 作為使用者空間程序執行,并且在來賓作業系統請求方面與核心協調。

2.安裝

檢視CPU是否支援VT技術:

[root@xingdian ~]# cat /proc/cpuinfo | egrep 'vmx|svm'
           

安裝:

[root@xingdian ~]# yum install *qemu* *virt* *kvm* -y
           

啟動服務:

centos7:
[root@xingdian ~]# systemctl start libvirtd
           

檢視kvm子產品加載:

[root@xingdian ~]# lsmod | grep kvm
kvm_intel 53484 3
kvm 316506 1 kvm_intel
           

圖形模式安裝guest os:

[root@xingdian ~]# yum -y install virt-manager
           

2.指令行的方式安裝虛拟機

模闆鏡像+配置檔案

1.拷貝模闆鏡像和配置檔案

[root@xingdian ~]# cp /var/lib/libvirt/images/vm2.qcow2 /var/lib/libvirt/images/vm3.qcow2
[root@xingdian ~]# cp /etc/libvirt/qemu/vm2.xml /etc/libvirt/qemu/vm3.xml
           

2.修改配置檔案

[root@xingdian ~]# vim /etc/libvirt/qemu/vm3.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit xingdian-1
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>xingdian-1</name>
<uuid>fe831f0e-2676-4a26-81a7-aacdf07c670e</uuid>
<memory unit='KiB'>3072000</memory>
<currentMemory unit='KiB'>3072000</currentMemory>
<vcpu placement='static'>2</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu mode='custom' match='exact' check='full'>
<model fallback='forbid'>SandyBridge-IBRS</model>
<feature policy='require' name='hypervisor'/>
<feature policy='require' name='xsaveopt'/>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/xingdian-1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
</controller>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<interface type='network'>
<mac address='52:54:00:17:54:16'/>
<source network='xingdian-2'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
</channel>
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='spice' autoport='yes'>
<listen type='address'/>
<image compression='off'/>
</graphics>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<address type='usb' bus='0' port='3'/>
</redirdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
</devices>
</domain>
           

3.建立虛拟機:

[root@xingdian ~]# virsh define /etc/libvirt/qemu/vm2.xml
           

3.配置檔案

必須修改的選項:(使用)

虛拟機名稱

uuid

磁盤鏡像檔案名稱

mac位址

可以通過配置檔案修改的内容:

cpu

memory

disk

network

cdrom

4.基本指令

虛拟機的組成部分:

1.虛拟機配置檔案

[root@localhost qemu]# ls /etc/libvirt/qemu
centos7.0.xml centos7.xml networks
           

2.儲存虛拟機的媒體

[root@localhost qemu]# ls /var/lib/libvirt/images/
centos7.0.qcow2
           

檢視:

檢視虛拟機:

[root@qf-xingdian images]# virsh list
Id Name State
----------------------------------------------------
[root@qf-xingdian images]# virsh list --all
Id Name State
----------------------------------------------------
- harbor-2 shut off
- server-1 shut off
- xingdian-1 shut off
- xingdian-2 shut off
- xingdian-3 shut off
           

檢視kvm虛拟機配置檔案:

[root@qf-xingdian images]# virsh dumpxml xingdian-1
           

将node4虛拟機的配置檔案儲存至node6.xml:

[root@qf-xingdian ~]# virsh dumpxml node4 > /etc/libvirt/qemu/node6.xml
           

修改node6的配置檔案:

[root@qf-xingdian ~]# virsh edit node6
           

如果直接用vim編輯器修改配置檔案的話,需要重新開機libvirtd服務

啟動:

[root@localhost ~]# virsh start vm1
Domain vm1 started
           

暫停虛拟機:

[root@localhost ~]# virsh suspend vm_name
           

恢複虛拟機:

[root@localhost ~]# virsh resume vm_name
           

關閉:

[root@localhost ~]# virsh shutdown vm1
Domain vm1 is being shutdown
           

重新開機:

[root@localhost ~]# virsh reboot vm1
Domain vm1 is being reboote
           

重置:

[root@localhost ~]# virsh reset vm1
Domain vm1 was reset
           

删除虛拟機:

[root@localhost ~]# virsh undefine vm2
Domain vm2 has been undefined
           

注意:虛拟機在開啟的情況下undefine是無法删除的

連接配接虛拟機的方法:

1.使用virt-viewer圖形連接配接已啟動的虛拟機

[root@localhost ~]# virt-viewer vm1
           

5.虛拟機克隆

  • 1.圖形界面:

    關閉要克隆的虛拟機,右鍵點選虛拟機選擇Clone

  • 2.字元終端,指令克隆:
[root@localhost ~]# virt-clone -o vm1 --auto-clone
WARNING 設定圖形裝置端口為自動端口,以避免互相沖突。
正在配置設定 'vm1-clone.qcow2' | 6.0 GB 00:00:05
成功克隆 'vm1-clone'。
-o origin
[root@localhost ~]# virt-clone -o vm1 -n vm2 --auto-clone
WARNING 設定圖形裝置端口為自動端口,以避免互相沖突。
正在配置設定 'vm2.qcow2' | 6.0 GB 00:00:06
成功克隆 'vm2'。
[root@localhost ~]# virt-clone -o vm1 -n vm2 -f /var/lib/libvirt/images/vm2.img
正在克隆 vm1.img | 8.0 GB 01:03
Clone 'vm2' created successfully.
           

6.存儲池

概念:

kvm必須要配置一個目錄當作他存儲磁盤鏡像(存儲卷)的目錄,我們稱這個目錄為存儲池

預設存儲池:

/var/lib/libvirt/images/

1.建立基于檔案夾的存儲池(目錄)
[root@xingdian ~]# mkdir -p /home/vmfs
2.定義存儲池與其目錄
[root@xingdian ~]# virsh pool-define-as vmdisk --type dir --target /home/vmfs/
Pool vmdisk defined
3.建立已定義的存儲池
(1)建立已定義的存儲池
[root@xingdian ~]# virsh pool-build vmdisk
Pool vmdisk built
(2)檢視已定義的存儲池,存儲池不激活無法使用。
[root@xingdian ~]# virsh pool-list --all
Name State Autostart
-------------------------------------------
default active yes
vmdisk inactive no
4.激活并自動啟動已定義的存儲池
[root@xingdian ~]# virsh pool-start vmdisk
Pool vmdisk started
[root@xingdian ~]# virsh pool-autostart vmdisk
Pool vmdisk marked as autostarted
這裡vmdisk存儲池就已經建立好了,可以直接在這個存儲池中建立虛拟磁盤檔案了。
           

三:KVM網絡

KVM虛拟機網絡配置一般的兩種方式:

NAT:

(預設上網) 虛拟機利用host機器的ip進行上網.對外顯示一個ip

Bridge:

将虛拟機橋接到host機器的網卡上,guest和host機器都通過bridge上網.對外不同的ip

Host-Only:

在Host-Only模式下,虛拟網絡是一個全封閉的網絡,它唯一能夠通路的就是主機。其實Host-Only網絡和NAT網絡很相似,不同的地方就是Host-Only網絡沒有NAT服務,是以虛拟網絡不能連接配接到Internet。主機和虛拟機之間的通信是通過VMware Network Adepter VMnet1虛拟網卡來實作的。

1.nat模式

原理:

NAT方式是kvm安裝後的預設方式。它支援主機與虛拟機的互訪,同時也支援虛拟機通路網際網路,但不支援外界通路虛拟機。

檢查目前的網絡設定:

[root@qf-xingdian ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
xingdian-1 active yes yes
xingdian-2 active yes yes
           

default是主控端安裝虛拟機支援子產品的時候自動安裝的

檢查目前的網絡接口:

[root@qf-xingdian ~]# ifconfig
enp0s25: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 00:21:cc:be:02:60 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 20 memory 0xf2500000-f2520000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 30326 bytes 29500363 (28.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 30326 bytes 29500363 (28.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:5d:40:08 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
           

其中virbr0是由主控端虛拟機支援子產品安裝時産生的虛拟網絡接口,也是一個switch和bridge,負責把内容分發到各虛拟機。

網絡拓撲圖:

Virtualization——虛拟化技術

圖上可以看出,虛拟接口和實體接口之間沒有連接配接關系,是以虛拟機隻能在通過虛拟的網絡通路外部世界,無法從網絡上定位和通路虛拟主機。

virbr0是一個橋接器,接收所有到網絡192.168.122.*的内容。從下面指令可以驗證:

[root@qf-xingdian ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.5254005d4008 yes virbr0-nic
virbr1 8000.525400876cc7 yes virbr1-nic
virbr2 8000.525400646e44 yes virbr2-nic
           

建立:

圖形化界面

指令方式

定義一個虛拟網絡

[root@qf-xingdian ~]# cat /etc/libvirt/qemu/networks/xingdian-3.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit xingdian-3
or other application using the libvirt API.
-->
<network>
<name>xingdian-3</name>
<uuid>baff2f58-f5df-4cd8-93ff-4b89bf807003</uuid>
<forward mode='nat'/>
<bridge name='virbr3' stp='on' delay='0'/>
<mac address='52:54:00:87:3c:c7'/>
<domain name='xingdian-1'/>
<ip address='10.0.3.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.0.3.2' end='10.0.3.254'/>
</dhcp>
</ip>
</network>
建立網絡
[root@qf-xingdian ~]# virsh net-define /etc/libvirt/qemu/networks/xingdian-3.xml
設定為開機啟動
[root@qf-xingdian networks]# virsh net-autostart xingdian-3
Network xingdian-3 marked as autostarted
啟動網絡
[root@qf-xingdian networks]# virsh net-start xingdian-3
Network xingdian-3 started
網絡啟動後可以用指令brctl show 檢視和驗證。
修改/etc/sysctl.conf中參數,允許ip轉發:
net.ipv4.ip_forward=1 2.bridge橋接
           

Bridge方式配置出來的接口對NAT方式沒有影響,因為NAT方式并沒有使用實體網卡。但作為客戶機,隻能選擇其中的一種。

建立橋接器

# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
NM_CONTROLLED=no
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.0.230
PREFIX=24
GATEWAY=192.168.1.254
DNS1=8.8.8.8
ONBOOT=yes
USERCTL=no
DELAY=0
           

将實體接口橋接到橋接器

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NM_CONTROLLED=no
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
USERCTL=no
BRIDGE=br0
           

重新開機加載網絡服務

# systemctl restart network
           

檢視目前橋接情況

# brctl show
           

四:IT系統架構發展

Virtualization——虛拟化技術

三個階段:

1. 實體機架構

這一階段,應用部署和運作在實體機上。 比如企業要上一個ERP系統,如果規模不大,可以找3台實體機,分别部署Web伺服器、應用伺服器和資料庫伺服器。 如果規模大一點,各種伺服器可以采用叢集架構,但每個叢集成員也還是直接部署在實體機上。 我見過的客戶早期都是這種架構,一套應用一套伺服器,通常系統的資源使用率都很低,達到20%的都是好的。

2. 虛拟化架構

摩爾定律決定了實體伺服器的計算能力越來越強,虛拟化技術的發展大大提高了實體伺服器的資源使用率。 這個階段,實體機上運作若幹虛拟機,應用系統直接部署到虛拟機上。 虛拟化的好處還展現在減少了需要管理的實體機數量,同時節省了維護成本。

3. 雲計算架構

虛拟化提高了單台實體機的資源使用率,随着虛拟化技術的應用,IT環境中有越來越多的虛拟機,這時新的需求産生了: 如何對IT環境中的虛拟機進行統一和高效的管理。 有需求就有供給,雲計算登上了曆史舞台。

雲計算分類

IaaS(Infrastructure as a Service)

提供的服務是虛拟機。IaaS 負責管理虛機的生命周期,包括建立、修改、備份、啟停、銷毀等。使用者從雲平台得到的是一個已經安裝好鏡像(作業系統+其他預裝軟體)的虛拟機。使用者需要關心虛機的類型(OS)和配置(CPU、記憶體、磁盤),并且自己負責部署上層的中間件和應用。

IaaS 的使用者通常是資料中心的系統管理者。典型的 IaaS 例子有 AWS、Rackspace、阿裡雲等

PaaS(Platform as a Service)

提供的服務是應用的運作環境和一系列中間件服務(比如資料庫、消息隊列等)。使用者隻需專注應用的開發,并将自己的應用和資料部署到PaaS環境中。PaaS負責保證這些服務的可用性和性能。

PaaS的使用者通常是應用的開發人員,典型的 PaaS 有 Google App Engine、IBM BlueMix 等

繼續閱讀