現在使用的計算機都離不開馮諾依曼體系結構,如圖所示,有輸入設備、輸出設備、存儲器、cpu 這就算是完整的計算機硬件環境了(當然還需要網卡、顯卡等等)。虛擬化技術就是在一臺機器上模擬出獨立的 cpu、存儲器等使得同一臺主機能虛擬為多臺主機或者多臺主機能虛擬為一臺主機。
虛擬化使用軟件的方法重新定義劃分 IT 資源,可以實現 IT 資源的動態分配、靈活調度、跨域共享,提高 IT 資源利用率,使 IT 資源能夠真正成為社會基礎設施,服務于各行各業中靈活多變的應用需求。
半虛擬化、全虛擬化、寄居虛擬化、裸金屬虛擬化、硬件虛擬化、軟件虛擬化、CPU、內存、磁盤、網絡虛擬化
最理想的虛擬化的兩個目標如下:
純軟件的虛擬化可以做到第一個目標,但性能不是很好,而且軟件設計的復雜度大大增加。那么如果放棄第一個目標呢?讓客戶機意識到自己是運行在虛擬化環境里,并做相應修改以配合 VMM,這就是半虛擬化(Para-Virtualization)。
一方面,可以提升性能和簡化 VMM 軟件復雜度;另一方面,也不需要太依賴硬件虛擬化的支持,從而使得其軟件設計(至少是 VMM 這一側)可以跨平臺且是優雅的。“本質上,準虛擬化弱化了對虛擬機特殊指令的被動截獲要求,將其轉化成客戶機操作系統的主動通知。但是,準虛擬化需要修改客戶機操作系統的源代碼來實現主動通知。” 典型的半虛擬化技術就是 virtio,使用 virtio 需要在宿主機 / VMM 和客戶機里都相應地裝上驅動。
與半虛擬化相反的,全虛擬化(Full Virtualization)堅持第一個理想化目標:客戶機的操作系統完全不需要改動。敏感指令在操作系統和硬件之間被 VMM 捕捉處理,客戶操作系統無須修改,所有軟件都能在虛擬機中運行。因此,全虛擬化需要模擬出完整的、和物理平臺一模一樣的平臺給客戶機,這在達到了第一個目標的同時也增加了虛擬化層(VMM)的復雜度。
性能上,2005 年硬件虛擬化興起之前,軟件實現的全虛擬化完敗于 VMM 和客戶機操作系統協同運作的半虛擬化,這種情況一直延續到 2006 年。之后以 Intel VT-x、VT-d 為代表的硬件虛擬化技術的興起,讓由硬件虛擬化輔助的全虛擬化全面超過了半虛擬化。但是,以 virtio 為代表的半虛擬化技術也一直在演進發展,性能上只是略遜于全虛擬化,加之其較少的平臺依賴性,依然受到廣泛的歡迎。
最底層是物理硬件,物理硬件之上是主機的操作系統,操作系統之上是 VMM(virtual machine monitor, 虛擬機管理層),再往上就是客戶的虛擬戶了。
在這種技術里面,虛擬機對各種物理設備(cpu、內存、硬盤等)的調用,都是通過 VMM 層和宿主機的操作系統一起協調才完成的。VMware 和 VirtualBox 都是基于這種方式實現的。
裸機虛擬化指的是,直接將 VMM 安裝在硬件設備與物理硬件之間。VMM 在這種模式下又叫做 Hypervisor, 虛擬機有指令要執行時, Hypervisor 會接管該指令,模擬相應的操作。
Hypervisor 是一種在虛擬環境中的 “元” 操作系統。他們可以訪問服務器上包括磁盤和內存在內的所有物理設備。 Hypervisor 不但協調著這些硬件資源的訪問,也同時在各個虛擬機之間施加防護。當服務器啟動并執行 Hypervisor 時,它會加載所有虛擬機客戶端的操作系統同時會分配給每一臺虛擬機適量的內存,CPU,網絡和磁盤。
硬件虛擬化技術就是指計算機硬件本身提供能力讓客戶機指令獨立執行,而不需要(嚴格來說是不完全需要)VMM 截獲重定向。
以 x86 架構為例,它提供一個略微受限制的硬件運行環境供客戶機運行(non-root mode),在絕大多數情況下,客戶機在此受限環境中運行與原生系統在非虛擬化環境中運行沒有什么兩樣,不需要像軟件虛擬化那樣每條指令都先翻譯再執行,而 VMM 運行在 root mode,擁有完整的硬件訪問控制權限。僅僅在少數必要的時候,某些客戶機指令的運行才需要被 VMM 截獲并做相應處理,之后客戶機返回并繼續在 non-root mode 中運行。可以想見,硬件虛擬化技術的性能接近于原生系統,并且,極大地簡化了 VMM 的軟件設計架構。
軟件虛擬化,顧名思義,就是通過軟件模擬來實現 VMM 層,通過純軟件的環境來模擬執行客戶機里的指令。最純粹的軟件虛擬化實現當屬 QEMU。在沒有啟用硬件虛擬化輔助的時候,它通過軟件的二進制翻譯仿真出目標平臺呈現給客戶機,客戶機的每一條目標平臺指令都會被 QEMU 截取,并翻譯成宿主機平臺的指令,然后交給實際的物理平臺執行。由于每一條都需要這么操作一下,其虛擬化性能是比較差的,同時其軟件復雜度也大大增加。但好處是可以呈現各種平臺給客戶機,只要其二進制翻譯支持。
詳細內容可參考:https://www.pianshen.com/article/701760589/
cpu 虛擬化指的就是把物理的 cpu 虛擬為多個虛擬 cpu,從而實現一個 cpu 能被多臺虛擬機共用,但是卻相互隔離的場景。cpu 的運轉是以時間為單位的,cpu 虛擬化要解決的問題主要是隔離和調度問題,隔離指的是讓不同的虛擬機之間能夠相互獨立的執行命令,調度指的是 VMM 決定 cpu 當前在哪臺虛擬機上執行。
由于 x86 體系設計的 cpu 在虛擬化上具有一定的缺陷,所以我們有兩種方法來實現 cpu 的虛擬化。其一是采用完全虛擬化的方式,利用動態指令轉換或者硬件輔助來幫助實現 cpu 的虛擬化;其二是采用半虛擬化得方式,在客戶的操作系統內核上進行一定的更改使得操作系統自己明白自己是虛擬機的角色,能夠在 VMM 的管理下盡可能的訪問硬件。(硬件輔助虛擬化 軟件輔助虛擬化)
影子頁表:https://www.51cto.com/article/686032.html
擴展表 EPT:https://www.pianshen.com/article/701760589/
內存提出的原因:
首先,內存存在的原因是 cpu 運轉速度極快,超過了磁盤的讀取速度,如果 cpu 直接讀取硬盤的話,大部分的時間 cpu 都在等待。同時,程序訪問又擁有局部性原理(80% 的訪問都在訪問數據中 20% 的數據),于是乎就有牛人想到能不能用一小塊兒讀取速率快的存儲設備來存放經常被讀取的數據,這樣 cpu 處理數據的速度就能和存儲器讀取設備的速度相匹配。系統性能達到最大化。
虛擬內存:
早期的計算機內存,只有物理內存,而且空間是極其有限的,每個應用或進程在使用內存時都得小心翼翼,不能覆蓋別的進程的內存區。
為了避免這些問題,就提出了虛擬內存的概念,其抽象了物理內存,相當于對物理內存進行了虛擬化,保證每個進程都被賦予一塊連續的,超大的(根據系統結構來定,32 位系統尋址空間為 2^32,64 位系統為 2^64)虛擬內存空間,進程可以毫無顧忌地使用內存,不用擔心申請內存會和別的進程沖突,因為底層有機制幫忙處理這種沖突,能夠將虛擬地址根據一個頁表映射成相應的物理地址。
這種機制正是虛擬化軟件做的事,也就是 MMU 內存管理單元。
假設我們設定的虛擬內存是 4G, 虛擬內存就是給系統當中的每一個進程分配 4G 的虛擬地址,這樣每個進程都感覺自己是獨立的使用一塊兒內存,具有良好的隔離性,同時,每個進程都是從 0 的虛擬地址開始的,這樣就更有助于管理進程。但程序要運行,必須要運行在真實的內存上,所以會建立一種映射機制來幫助實現虛擬地址到物理地址之間的映射。
通過虛擬內存的方式實現了進程之間的地址隔離。(32 位的 CPU 的尋址空間是 4G , 所以虛擬內存的最大值為 4G , 而 windows 操作系統把這 4G 分成 2 部分, 即 2G 的用戶空間和 2G 的系統空間, 系統空間是各個進程所共享的, 他存放的是操作系統及一些內核對象等, 而用戶空間是分配給各個進程使用的, 用戶空間包括用: 程序代碼和數據, 堆, 共享庫, 棧。)
內存的虛擬化:
內存的虛擬化指的是把物理內存包裝成若干虛擬內存來使用,把物理內存抽象出來,給每一臺虛擬機都分配一個連續的內存空間。
內存軟件虛擬化的目標就是要將虛擬機的虛擬地址(Guest Virtual Address, GVA)轉化為 Host 的物理地址(Host Physical Address, HPA),中間要經過虛擬機的物理地址(Guest Physical Address, GPA)和 Host 虛擬地址(Host Virtual Address)的轉化,即:GVA -> GPA -> HVA -> HPA
硬盤虛擬化相對簡單一些,拿 VMvare 來舉例,在 VMvare 當中,會使用物理硬盤上的一個文件來當做虛擬機當中的一個硬盤,虛擬機通過調用相關進程(如 VMvare 進程)訪問相關的宿主機的文件系統,再通過文件系統調用 windows 內核,再調用驅動,然后在磁盤上進行讀寫。
網絡虛擬化是讓一個物理網絡能夠支持多個邏輯網絡,虛擬化保留了網絡設計中原有的層次結構、數據通道和所能提供的服務,使得最終用戶的體驗和獨享物理網絡一樣,同時網絡虛擬化技術還可以高效的利用網絡資源如空間、能源、設備容量等。網絡虛擬化的目的,是要節省物理主機的網卡設備資源。
傳統網絡架構:
在傳統網絡環境中,一臺物理主機包含一個或多個網卡(NIC),要實現與其他物理主機之間的通信,需要通過自身的 NIC 連接到外部的網絡設施
這種架構下,為了對應用進行隔離,往往是將一個應用部署在一臺物理設備上,這樣會存在兩個問題
虛擬化網絡架構:
借助虛擬化技術對一臺物理資源進行抽象,將一張物理網卡虛擬成多張虛擬網卡(vNIC),通過虛擬機來隔離不同的應用。
這樣對于上面的問題
虛擬機與虛擬機之間的通信,由虛擬交換機完成,虛擬網卡和虛擬交換機之間的鏈路也是虛擬的鏈路,整個主機內部構成了一個虛擬的網絡,如果虛擬機之間涉及到三層的網絡包轉發,則又由另外一個角色——虛擬路由器來完成。
一般,這一整套虛擬網絡的模塊都可以獨立出去,由第三方來完成,如其中比較出名的一個解決方案就是 Open vSwitch(OVS)。
OVS 的優勢在于它基于 SDN 的設計原則,方便虛擬機集群的控制與管理,另外就是它分布式的特性,可以「透明」地實現跨主機之間的虛擬機通信
總結:網絡虛擬化主要解決的是虛擬機構成的網絡通信問題,完成的是各種網絡設備的虛擬化,如網卡、交換設備、路由設備等。
KVM 為完全虛擬化技術,依賴在操作系統上,需要在操作系統上運行,不能直接在物理機上運行,這種虛擬化必須要求 cpu 支持虛擬化功能,即虛擬化模塊內置在 cpu 中,因此 kvm 就不用將 cpu 和內存全部模擬出來,直接調用物理機 cpu 和內存只需對它們執行分配操作,使得虛擬機的性能大大提升,其性能與物理機基本相當,kvm 模塊是內置在 linux 系統中的,是系統自帶的,無需再安裝。
半虛擬化,要求客戶機系統的內核要知道自己是在虛擬化環境中運行,所以客戶機系統架構要和宿主機或物理機系統架構相同,即需要支持客戶機系統內核的修改;支持內核修改的系統必然是開源系統,而閉源系統就不支持內核修改,例如微軟、蘋果的操作系統都不開源,不支持 xen 半虛擬化技術 ,這是 XEN 的一大缺陷,3.0 版本之后也支持完全虛擬化。
由于現在大多數 CPU 都內置虛擬化功能,所以基本都支持 KVM 虛擬化技術;而 XEN 虛擬化技術必須得是開源的操作系統、需要修改客戶機系統內核、要保持客戶機系統架構和宿主機系統架構一致,這是 XEN 的一大致命缺陷,避免不了逐漸被 KVM 替代,不過 3.0 版本之后 XEN 也支持完全虛擬化,提高了兼容性,由于 KVM 的火熱依然擋不住被 KVM 替代。
虛擬化 VNWARE-esxi 是一個獨立的操作系統,直接運行在物理機上,不依賴操作系統,esxi 有自帶的服務端管理服務器,可創建虛擬機,上傳鏡像文件,此管理服務器不支持虛擬機的移動;但將 vsphere-server 安裝在 window-server2008 上可以實現遠程服務端管理虛擬機,支持將虛擬機的移動到另一臺物理機上,同樣支持虛擬機的創建和 iso 鏡像文件的上傳。
導出虛擬機
編輯虛擬機設置
導入虛擬機
刪除虛擬機
常用鏡像盤類型
特點類型 | RAW | QCOW2 |
KVM 默認 | 否 | 是 |
I/O 效率 | 高 | 較高 |
占用空間 | 大 | 小 |
壓縮 | 不支持 | 支持 |
后端盤復用 | 不支持 | 支持 |
快照 | 不支持 | 支持 |
創建虛擬機磁盤鏡像
創建 / 還原 / 刪除快照
重點!!!
一臺 KVM 虛擬機的組成
基本思路