² 解決資源浪費python
² 解決一塊兒使用的資源槍戰衝突linux
VMware是收費的(對於企業)對於我的來講是免費的web
開源版本KVM數據庫
公司使用場景:底層使用KVM,上層使用OpenStack,經過OpenStack管理KVM編程
軟件虛擬化 QEMU安全
(1)軟件全虛擬化ruby
軟件捕獲翻譯至關於翻譯官bash
VMware,有一個專門的虛擬化引擎。經過虛擬化引擎,捕獲虛擬機的指令,並進行處理,這也是爲何在虛擬機上雖然使用的是物理機同樣的指令,可是虛擬機不能對硬件進行操做的緣由,好比重啓虛擬機不會引發宿主機的重啓。這種解決方案也叫軟件全虛擬化方案。服務器
(2)半虛擬化網絡
虛擬化是另外一種相似於全虛擬化的技術,它使用Hypervisor分享存取底層的硬件,可是它的guest操做系統集成了虛擬化方面的代碼。該方法無需從新編譯或引發陷阱,由於操做系統自身可以與虛擬進程進行很好的協做。
(3)硬件支持的全虛擬化
硬件支持的全虛擬化:硬件支持的虛擬化層翻譯--》kvm==》美國人懂中文了
Docker是一個開源的引擎,能夠輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試經過的容器能夠批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集羣和其餘的基礎應用平臺。
Docker一般用於以下場景:
² web應用的自動化打包和發佈;
² 自動化測試和持續集成、發佈;
² 在服務型環境中部署和調整數據庫或其餘的後臺應用;
² 從頭編譯或者擴展示有的OpenShift或Cloud Foundry平臺來搭建本身的PaaS環境。
①更高的資源利用率——虛擬可支持實現物理資源和資源池的動態共享,提升資源利用率,特別是針對那些平均需求遠低於須要爲其提供專用資源的不一樣負載。
②下降管理成本——虛擬可經過如下途徑提升工做人員的效率:減小必須進行管理的物理資源的數量;隱藏物理資源的部分複雜性;經過實現自動化、得到更好的信息和實現中央管理來簡化公共管理任務;實現負載管理自動化。另外,虛擬還能夠支持在多個平臺上使用公共的工具。
③提升使用靈活性——經過虛擬可實現動態的資源部署和重配置,知足不斷變化的業務需求。
④提升安全性——虛擬可實現較簡單的共享機制沒法實現的隔離和劃分,這些特性可實現對數據和服務進行可控和安全的訪問。
⑤更高的可用性——虛擬可在不影響用戶的狀況下對物理資源進行刪除、升級或改變。
⑥更高的可擴展性——根據不一樣的產品,資源分區和匯聚可支持實現比個體物理資源小得多或大得多的虛擬資源,這意味着您能夠在不改變物理資源配置的狀況下進行規模調整。
⑦互操做性和投資保護——虛擬資源可提供底層物理資源沒法提供的與各類接口和協議的兼容性。
⑧改進資源供應——與個體物理資源單位相比,虛擬可以以更小的單位進行資源分配。
KVM 全稱是 基於內核的虛擬機(Kernel-based Virtual Machine),它是一個 Linux 的一個內核模塊,該內核模塊使得 Linux 變成了一個 Hypervisor:
² 它由 Quramnet 開發,該公司於 2008年被 Red Hat 收購。
² 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
² 它從 Linux 2.6.20 起就做爲一模塊被包含在 Linux 內核中。
² 它須要支持虛擬化擴展的 CPU。
² 它是徹底開源的。
² KVM虛擬機=KVM內核模塊+QEMU模擬器
KVM是linux內核的模塊,它須要CPU的支持,採用硬件輔助虛擬化技術Intel-VT,AMD-V,內存的相關如Intel的EPT和AMD的RVI技術,Guest OS的CPU指令不用再通過Qemu轉譯,直接運行,大大提升了速度,KVM經過/dev/kvm暴露接口,用戶態程序能夠經過ioctl函數來訪問這個接口。
KVM內核模塊自己只能提供CPU和內存的虛擬化,因此它必須結合QEMU才能構成一個完成的虛擬化技術。
qemu將KVM整合進來,經過ioctl調用/dev/kvm接口,將有關CPU指令的部分交由內核模塊來作。kvm負責cpu虛擬化+內存虛擬化,實現了cpu和內存的虛擬化,但kvm不能模擬其餘設備。qemu模擬IO設備(網卡,磁盤等),kvm加上qemu以後就能實現真正意義上服務器虛擬化。由於用到了上面兩個東西,因此稱之爲qemu-kvm。
Qemu模擬其餘的硬件,如Network, Disk,一樣會影響這些設備的性能,因而又產生了pass through半虛擬化設備virtio_blk, virtio_net,提升設備性能。
KVM虛擬機是基於linux內核虛擬化,自linux2.6.20以後就集成在linux的各個主要發行版本中。它使用linux自身的調度器進行管理,因此相對於xen,其核心源碼不多。KVM的虛擬化須要硬件的支持(如intel VT技術或者AMD V技術),是基於硬件的徹底虛擬化。而xen早期則是基於軟件模擬的para-virtualization,新版本是基於硬件支持的徹底虛擬化。
qemu是一種模擬處理器,如今運用最多的就是將KVM和QEMU結合起來。
準確來講,KVM是Linux kernel的一個模塊,能夠用命令modprobe去加載KVM模塊。加載了該模塊後,才能進一步經過工具建立虛擬機。可是僅有KVM模塊是不夠的。由於用戶沒法直接控制內核去作事情,還必須有一個運行在用戶空間的工具才行。這個用戶空間的工具,kvm開發者選擇了已經成型的開源虛擬化軟件QEMU。提及來QEMU也是一個虛擬化軟件。它的特色是可虛擬不一樣的CPU。好比說在x86的CPU上可虛擬一個power的CPU,並可利用它編譯出可運行在power上的CPU,並可利用它編譯出可運行在power上的程序。KVM使用了QEMU的一部分,並稍加改造,就成了可控制KVM的用戶空間工具了。因此你會看到,官方提供的KVM下載有兩大部分(qemu和kvm)三個文件(KVM模塊、QEMU工具以及兩者的合集)。也就是說,你能夠只升級KVM模塊,也能夠只升級QEMU工具。
QEMU是一個開源項目,實際就是一臺硬件模擬器,能夠模擬許多硬件,包括X86架構處理器、AMD64架構處理器等。
QEMU的好處:由於是純軟件模擬,因此能夠支持的平臺模擬支持的設備。
QEMU的缺點:是純軟件模擬,所以很是慢。
KVM只是內核模塊,只提供CPU和內存。因此還使用qemu模擬io設備如磁盤網卡。
現代 CPU 自己了對特殊指令的截獲和重定向的硬件支持,甚至新的硬件會提供額外的資源來幫助軟件實現對關鍵硬件資源的虛擬化從而提升性能。以 X86 平臺爲例,支持虛擬化技術的 CPU 帶有特別優化過的指令集來控制虛擬化過程。經過這些指令集,VMM 很容易將客戶機置於一種受限制的模式下運行,一旦客戶機視圖訪問物理資源,硬件會暫停客戶機的運行,將控制權交回給 VMM 處理。VMM 還能夠利用硬件的虛級化加強機制,將客戶機在受限模式下對一些特定資源的訪問,徹底由硬件重定向到 VMM 指定的虛擬資源,整個過程不須要暫停客戶機的運行和 VMM 的參與。因爲虛擬化硬件提供全新的架構,支持操做系統直接在上面運行,無需進行二進制轉換,減小了相關的性能開銷,極大簡化了VMM的設計,使得VMM性能更增強大。從 2005 年開始,Intel 在其處理器產品線中推廣 Intel Virtualization Technology 即 IntelVT 技術。
libvirt是目前使用最爲普遍的對KVM虛擬機進行管理的工具和API。Libvirtd是一個daemon進程,能夠被本地的virsh調用,也能夠被遠程的virsh調用,Libvirtd調用qemu-kvm操做虛擬機。
組成 :
n 一套API的lib庫,支持主流的編程語言,包括c,python。ruby等。
n libvirtd服務。
n 命令行工具virsh
VM是最底層的hypervisor,它是用來模擬CPU的運行,它缺乏了對network和周邊I/O的支持,因此咱們是無法直接用它的。
QEMU-KVM就是一個完整的模擬器,它是構建基於KVM上面的,它提供了完整的網絡和I/O支持。
Openstack不會直接控制qemu-kvm,它會用一個叫libvirt的庫去間接控制qemu-kvm。libvirt提供了跨VM平臺的功能,它能夠控制除了QEMU以外的模擬器,包括vmware, virtualbox, xen等等。
因此爲了openstack的跨VM性,因此openstack只會用libvirt而不直接用qemu-kvm。libvirt還提供了一些高級的功能,例如pool/vol管理。
在BIOS開啓虛擬化
虛擬機版本是新版
虛擬機開啓虛擬化配置
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install python-virtinst-0.600.0-29.el6.noarch # 一套Python的虛擬機安裝工具 gpxe-roms-qemu-0.9.7-6.14.el6.noarch # 虛擬機iPXE的啓動固件,支持虛擬機從網絡啓動 virt-manager-0.9.0-29.el6.x86_64 # 基於Libvirt的圖像化虛擬機管理軟件,須要圖形界面操做系統 qemu-img-0.12.1.2-2.479.el6.x86_64 # 用於操做虛擬機硬盤鏡像的建立、查看和格式轉化 libvirt-python-0.10.2-54.el6.x86_64 # libvirt爲Python提供的API qemu-kvm-0.12.1.2-2.479.el6.x86_64 # KVM在用戶空間運行的程序 qemu-kvm-tools-0.12.1.2-2.479.el6.x86_64 libvirt-0.10.2-54.el6.x86_64 # 用於管理虛擬機,它提供了一套虛擬機操做API libvirt-client-0.10.2-54.el6.x86_64 # Libvirt的客戶端,最重要的功能之一就是就在宿主機關機時能夠通知虛擬機也關機,使虛擬機系統正常關機,而不是被強制關機,形成數據丟失 virt-top-1.0.4-3.15.el6.x86_64 # 相似於top命令,查看虛擬機的資源使用狀況 virt-what-1.11-1.2.el6.x86_64 # 在虛擬機內部執行,查看虛擬機運行的虛擬化平臺 virt-viewer-0.5.6-8.el6.x86_64 # 顯示虛擬機的控制檯console [root@oldboyedu ~]# mkdir -p /application/tools/ [root@oldboyedu ~]# dd if=/dev/sr0 of=/application/tools/CentOS7_2.iso 查看: [root@oldboyedu39 ~]# lsmod |grep kvm kvm_intel 162153 0 kvm 525259 1 kvm_intel [root@oldboyedu39 ~]# grep -Eo '(vmx|svm)' /proc/cpuinfo vmx vmx [root@oldboyedu39 ~]# cd /application/tools/ [root@oldboyedu39 tools]# ls CentOS-7-x86_64-DVD-1511.iso 啓動服務 systemctl start libvirtd.service [root@oldboyedu39 ~]# mkdir -p /application/kvm_data [root@oldboyedu39 ~]# cd /application/kvm_data [root@oldboyedu39 kvm_data]# qemu-img create -f qcow2 /application/kvm_data/moban.qcow2 20G Formatting '/application/kvm_data/moban.qcow2', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 lazy_refcounts=off [root@oldboyedu39 kvm_data]# ll -h total 196K -rw-r--r-- 1 root root 193K Oct 23 10:17 moban.qcow2 [root@oldboyedu39 kvm_data]#
[root@oldboyedu39 ~]# mkdir -p /application/kvm_data [root@oldboyedu39 ~]# cd /application/kvm_data [root@oldboyedu39 kvm_data]# qemu-img create -f qcow2 /application/kvm_data/moban.qcow2 20G Formatting '/application/kvm_data/moban.qcow2', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 lazy_refcounts=off [root@oldboyedu39 kvm_data]# ll -h total 196K -rw-r--r-- 1 root root 193K Oct 23 10:17 moban.qcow2 [root@oldboyedu39 kvm_data]# qemu-img info moban.qcow2 image: moban.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 196K cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false [root@oldboyedu39 kvm_data]# virt-install --virt-type=kvm --name=c72-moban --vcpus=1 -r 1024 -c /application/tools/CentOS7_2.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel7 --disk path=/application/kvm_data/moban.qcow2,size=20,format=qcow2
[root@oldboyedu39 kvm_data]# virsh start c72-moban 開機 Domain c72-moban started [root@oldboyedu39 kvm_data]# virsh list 查看狀態 Id Name State ---------------------------------------------------- 2 c72-moban running [root@oldboyedu39 kvm_data]# 生成kvm虛擬機:virt-install 查看在運行的虛擬機:virsh list 查看全部虛擬機:virsh list --all 查看kvm虛擬機配置文件:virsh dumpxml name 啓動kvm虛擬機:virsh start name 正常關機:virsh shutdown name 非正常關機(至關於物理機直接拔掉電源):virsh destroy name 刪除:virsh undefine name(完全刪除,找不回來了,若是想找回來,須要備份/etc/libvirt/qemu的xml文件) 根據配置文件定義虛擬機:virsh define file-name.xml 掛起,終止:virsh suspend name 恢復掛起狀態:virsh resume name
模板機配置文件 [root@oldboyedu39 ~]# cd /etc/libvirt/qemu/ [root@oldboyedu39 qemu]# ls c72-moban.xml networks [root@oldboyedu39 qemu]# 磁盤文件 [root@oldboyedu39 tools]# cd /application/kvm_data/ [root@oldboyedu39 kvm_data]# ls moban.qcow2 [root@oldboyedu39 kvm_data]#
raw和qcow2簡單區別
² raw不支持快照
² qcow2支持快照
老牌的格式了,用一個字來講就是裸,也就是赤裸裸,你隨便dd一個file就模擬了一個raw格式的鏡像。因爲裸的完全,性能上來講的話仍是不錯的。目前來看,KVM和XEN默認的格式好像仍是這個格式。由於其原始,有不少原生的特性,例如直接掛載也是一件簡單的事情。
裸的好處還有就是簡單,支持轉換成其它格式的虛擬機鏡像對裸露的它來講仍是很簡單的(若是其它格式須要轉換,有時候仍是須要它作爲中間格式),空間使用來看,這個很像磁盤,使用多少就是多少(du -h看到的大小就是使用大小),但若是你要把整塊磁盤都拿走的話得全盤拿了(copy鏡像的時候),會比較消耗網絡帶寬和I/O。接下來還有個有趣的問題,若是那天你的硬盤用着用着不夠用了,你咋辦,在買一塊盤。但raw格式的就比較犀利了,能夠在原來的盤上追加空間:
dd if=/dev/zero of=zeros.raw bs=1024k count=4096(先建立4G的空間)
cat foresight.img zeros.raw > new-foresight.img(追加到原有的鏡像以後)
固然,好東西是吹出來的,誰用誰知道,仍是有挺多問題的。因爲原生的裸格式,不支持snapshot也是很正常的。傳說有朋友用版本管理軟件對raw格式的文件作版本管理從而達到snapshot的能力,估計可行,但沒試過,這裏也不妄加評論。但若是你使用LVM的裸設備,那就另當別論。說到LVM仍是十分的犀利的,當年用LVM作虛擬機的鏡像,那性能槓槓的。並且如今好多兄弟用虛擬化都採用LVM來作的。在LVM上作了不少的優化,國外據說也有朋友在LVM增量備份方面作了不少的工做。目前來LVM的snapshot、性能、可擴展性方面都仍是有至關的效果的。目前來看的話,備份的話也問題不大。就是在虛擬機遷移方面仍是有很大的限制。但目前虛擬化的現狀來看,真正須要熱遷移的狀況目前需求還不是是否的強烈。雖然使用LVM作虛擬機鏡像的相關公開資料比較少,但目前來看犧牲一點靈活性,換取性能和便於管理仍是不錯的選擇。
如今比較主流的一種虛擬化鏡像格式,通過一代的優化,目前qcow2的性能上接近raw裸格式的性能,這個也算是redhat的官方渠道了,哈哈,但願有朋友能拍他們磚:
對於qcow2的格式,幾點仍是比較突出的,qcow2的snapshot,能夠在鏡像上作N多個快照:
² 更小的存儲空間,即便是不支持holes的文件系統也能夠(這下du -h和ls -lh看到的就同樣了)
² Copy-on-write support, where the image only represents changes made to an underlying disk image(這個特性SUN ZFS表現的淋漓盡致)
² 支持多個snapshot,對歷史snapshot進行管理
² 支持zlib的磁盤壓縮
² 支持AES的加密
Mware的格式,這個格式說的蛋疼一點就有點牛X,本來VMware就是作虛擬化起家,本身作了一個集羣的VMDK的pool,作了本身的虛擬機鏡像格式。又拉着一些公司搞了一個OVF的統一封包。從性能和功能上來講,vmdk應該算最出色的,因爲vmdk結合了VMware的不少能力,目前來看,KVM和XEN使用這種格式的狀況不是太多。但就VMware的Esxi來看,它的穩定性和各方面的能力仍是可圈可點。
通用方法:既可以本機克隆,也能跨機克隆
前提:關機克隆
[root@oldboyedu39 qemu]# virsh list --all 查看狀態 Id Name State ---------------------------------------------------- - c72-moban shut off [root@oldboyedu39 qemu]# 克隆磁盤文件 [root@oldboyedu39 kvm_data]# virsh dumpxml c72-moban >/tmp/moban.xml [root@oldboyedu39 kvm_data]# cp moban.qcow2 clone.qcow2 [root@oldboyedu39 kvm_data]# ll total 3034052 -rw-r--r-- 1 root root 1553465344 Oct 23 11:34 clone.qcow2 -rw-r--r-- 1 root root 1553465344 Oct 23 11:32 moban.qcow2 [root@oldboyedu39 kvm_data]# pwd /application/kvm_data [root@oldboyedu39 kvm_data]# ll -h total 2.9G -rw-r--r-- 1 root root 1.5G Oct 23 11:34 clone.qcow2 -rw-r--r-- 1 root root 1.5G Oct 23 11:32 moban.qcow2 [root@oldboyedu39 kvm_data]# 克隆配置文件 [root@oldboyedu39 ~]# sed -i "2s#c72-moban#c72-clone#;3s#.*#<uuid>`uuidgen`</uuid>#;s#moban.qcow2#clone.qcow2#;s#^.*<mac address=.*/># <mac address='52:54:00:e2:f9:5e'/>#" /tmp/moban.xml 對比 [root@oldboyedu39 ~]# diff /tmp/moban.xml{,.ori} 2,3c2,3 < <name>c72-clone</name> < <uuid>39fed509-08ef-4892-b429-3206f9e292ae</uuid> --- > <name>c72-moban</name> > <uuid>da066b7c-a502-43b4-b1ae-08f59f6d5225</uuid> 34c34 < <source file='/application/kvm_data/clone.qcow2'/> --- > <source file='/application/kvm_data/moban.qcow2'/> 67c67 < <mac address='52:54:00:e2:f9:5e'/> --- > <mac address='52:54:00:ae:5e:af'/> [root@oldboyedu39 ~]# [root@oldboyedu39 ~]# virsh define /tmp/moban.xml 定義域 c72-clone(從 /tmp/moban.xml) [root@oldboyedu39 ~]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- - c72-clone 關閉 - c72-moban 關閉 [root@oldboyedu39 ~]# 開機 [root@oldboyedu39 ~]# virsh start c72-clone 域 c72-clone 已開始 [root@oldboyedu39 ~]# virsh start c72-moban 域 c72-moban 已開始 [root@oldboyedu39 ~]# [root@oldboyedu39 ~]# virsh list --all Id 名稱 狀態 ---------------------------------------------------- 3 c72-clone running 4 c72-moban running [root@oldboyedu39 ~]#
注意事項
1.克隆的CentOS6虛擬機,首先要作的是:
² 清除網卡配置文件的UUID和MAC地址,不然克隆後網卡錯亂
² 清空> /etc/udev/rules.d/70-persistent-net.rules,不然克隆後網卡錯亂
² 最後關閉虛擬機,在虛擬機中使用halt命令關機。
2.克隆CentOS7能夠直接克隆:
² 清除網卡配置文件的UUID和MAC地址(不清除網卡也能啓動)
² 關機作克隆
建立快照(關機作快照節省空間) [root@oldboyedu39 ~]# virsh shutdown c72-moban 域 c72-moban 被關閉 [root@oldboyedu39 ~]# virsh shutdown c72-clone 域 c72-clone 被關閉 [root@oldboyedu39 ~]# [root@oldboyedu39 ~]# virsh shutdown c72-clone 建立快照 域 c72-clone 被關閉 [root@oldboyedu39 ~]# virsh snapshot-create-as c72-clone c72-clone-kuaizhao1 已生成域快照 c72-clone-kuaizhao1 [root@oldboyedu39 ~]# virsh snapshot-list c72-clone 查看快照 名稱 生成時間 狀態 ------------------------------------------------------------ c72-clone-kuaizhao1 2017-10-23 12:05:44 +0800 shutoff [root@oldboyedu39 ~]# [root@oldboyedu39 ~]# virsh snapshot-revert c72-clone c72-clone-kuaizhao1#恢復快照 virsh snapshot-delete c72-clone c72-clone-kuaizhao1 # 刪除快照
默認KVM的網絡是NAT模式,那如何讓KVM的網絡和宿主機同網段呢?這就須要橋接網卡了
Bridge方式即虛擬網橋的網絡鏈接方式,是客戶機和子網裏面的機器可以互相通訊。可使虛擬機成爲網絡中具備獨立ip的主機。
橋接網絡(也叫物理設備共享)被用做把一個物理設備複製到另外一臺虛擬機。網橋多用作高級設置,特別是主機多個網絡接口的狀況。
#四處須要修改 <name>c72-moban</name> <uuid>00e0ff50-c410-40d8-a46e-8919199b2828</uuid> <source file='/application/kvm_data/moban.qcow2'/> <mac address='52:54:00:e2:f9:6e'/> [root@oldboyedu39 ~]# cp /etc/sysconfig/network-scripts/{ifcfg-eth0,ifcfg-br0} #複製網卡 [root@oldboyedu39 ~]# cat>/etc/sysconfig/network-scripts/ifcfg-eth0<<EOF #修改 > DEVICE=eth0 > TYPE=Ethernet > ONBOOT=yes > BRIDGE=br0 > EOF [root@oldboyedu39 ~]# [root@oldboyedu39 ~]# sed -i.ori 's#Ethernet#Bridge#;s#eth0#br0#g' /etc/sysconfig/network-scripts/ifcfg-br0 [root@oldboyedu39 ~]# diff /etc/sysconfig/network-scripts/ifcfg-br0{,.ori} 1c1 < TYPE=Bridge --- > TYPE=Ethernet 7c7 < NAME=br0 --- > NAME=eth0 9c9 < DEVICE=br0 ---貓 > DEVICE=eth0 [root@oldboyedu39 ~]# 並把ifcfg-br0配置文件的uuid刪除 systemctl restart network [root@oldboyedu kvm_data]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29450547 no eth0 virbr0 8000.fe5400e2f95e yes vnet0 新建立主機採用橋接網卡將 --network network=default換成--network bridge=br0。 對已經建立的主機,修改爲橋接方式。修改配置文件
a.關閉虛擬機 b.virsh edit c72-moban 給虛擬機再次添加一塊新的網卡,虛擬機須要運行狀態。 virsh attach-interface c72-clone --type bridge --source br0 [root@kvm1 qemu]# virsh --help | grep bridge iface-bridge 生成橋接設備併爲其附加一個現有網絡設備 iface-unbridge 分離其輔助設備後取消定義橋接設備 [root@kvm1 qemu]# virsh iface-bridge eth0 br0