VMware虛擬機的實現是什麼原理?如何理解虛擬這個詞?


虛擬化在VMware系列產品上只能說有交集,VMware的產品用到了虛擬化的部分功能,同時VMware也不僅有虛擬化的功能支持。

虛擬化來自於虛擬,即把一個不存在的東西,通過現有存在的物體的模擬,來模擬的實現。在虛擬化這個概念上,這些被虛擬出來的設備,通常是為了計算機軟體(包括系統)服務,而不是為人服務。例如顯示器把現實中不存在的一個圖形顯示出來,這不算作虛擬化的概念。

虛擬化的實現是一個互相促進的過程,類似於顯卡的發展歷程。用戶有需求-&>軟體有實現-&>硬體有加速-&>修改軟體的實現-&>帶動更多的用戶需求。
打個比方,辦公室裡面有一台傳統的印表機,連接在一台電腦上。這個電腦可以列印了。之後,這台電腦把印表機共享出來,即是一種虛擬化,供其他電腦來使用。對於其他電腦來說,這個被共享出來的印表機,雖然並不是真實物理存在的印表機,但是可以當做真實存在的印表機來使用。
在硬體虛擬化層面上,在有虛擬機軟體之前,就有了虛擬化的概念。CPU設計上就分為了多個指令層,其中Ring0層可以執行所有指令,而其他的層只有一般程序所需的指令集。操作系統獨佔把持Ring0,調度其他程序執行。而其他程序則可以「獨佔」一個虛擬的CPU,來執行自己的指令,只要它不使用Ring0才有的指令集即可。在內存管理上,操作系統引入了分頁管理,也使得每個程序可以「獨佔」2G(32位程序)或更多的內存。其他IO上也有類似的設計。
虛擬機引入後,首先設計了一個模擬硬體環境的軟體。將這些原本真實硬體的功能進行軟體的實現。就好像上面的印表機的例子。對於這個模擬環境下的操作系統來說,這個環境是真實有效的。而對於上層宿主系統來說,它只是一個特殊設計的程序。這個軟體將硬體實現的指令集進行封裝,並交由實際的硬體來執行,再將結果反饋。這種最早的設計方式就叫做軟體模擬方式。它優勢是有良好的兼容性(甚至可以在PC上運行RISC指令集的程序),缺點就是對指令的逐個翻譯和解釋導致性能嚴重下降。
後來,硬體廠商認識到虛擬化的實際應用前景後,即配合軟體進行了很多改良,在多個維度上實現了硬體虛擬化的支持。例如VT-d VT-x等均是相關的技術。簡單說就是提供了特殊的處理方式,可以讓虛擬化軟體將一部分功能直接交給硬體來做。例如新的CPU包含有虛擬化功能,虛擬化控制軟體可以獲得一個假Ring0層,並允許通過虛擬化的Id區分不同的系統。因此虛擬化系統中運行的軟體可以幾乎不加翻譯的在物理CPU上執行,而不必擔心影響宿主系統安全。同樣內存管理的地址虛擬化映射,也使得虛擬機軟體無需關心真實內存的佔用和分布情況。最新推出的IO虛擬化更是把主板資源通過硬體的方式模擬出,直接交給虛擬機使用。這些改動會極大的提高虛擬化軟體的執行速度,當然同時也需要相關的軟硬體做出修改以配合。這就好比顯卡、DirectX、遊戲之間的關係,互相促進。


先來回答後者:所謂虛擬,既與真相對,又與假相反。如何獲取定義,取決於所在的位置。在虛擬之中,虛擬就是真;而在虛擬之外,虛擬就是假。(我知道大家想到了The Matrix

根據虛擬的理解,虛擬機無非就是計算機前面加個定義,對於虛擬機之外,這個計算機就是假的,而在虛擬機內,這個計算機就是真的。

別急,虛擬機裡面就一定認為是真的嗎?答案是否定的。

虛擬化一般分為全虛擬和半虛擬。比如HyperV、Xen這種是半虛擬,雖然的確可以運行單獨的操作系統,但他們更像是一種管理系統來管理部署多個操作系統。半虛擬在虛擬機內能明確感知(擬人)到自己所處於虛假的環境,而且或多或少直接訪問到真實的環境。這也是為什麼半虛擬的解決方案往往擁有更高的性能。

許多桌面應用,比如vmware workstation/vpc/virtual Box 等就是全虛擬,他們常常安裝在宿主機上,比如win7。通常情況下全虛擬部署簡便,管理省心,初中生都可以開個虛擬機多開遊戲來玩。全虛擬的情況下虛擬機內是不能明確感知(又是擬人)自己所處的虛假環境的。這裡說不能明確感知,表明刻意地去檢測,還是很容易檢測到虛擬的環境的。最按照套路出牌的是檢測一些硬體加速上的bug,網上去搜索一下挺有趣的。因為全虛擬會損失一定性能,虛擬機/宿主操作系統/物理硬體會提供一些技術來加速全虛擬的虛擬機,加之為了提供一些額外的功能,虛擬機內可以很容易地檢測,比如win8.1本身就有檢測虛擬機的能力(原理暫未深究)。當然還有一些非常規的做法,比如硬體的名稱(你電腦城買得到vmware的硬碟?買的倒vmware的顯示器?),還可以檢測一些虛擬環境一定需要的組建。不過,你可以通過完全地二進位模擬、關閉一些特性來儘可能地做到虛擬的完全性。

再來,假如當前環境是虛擬的,那麼上一個環境就是真實的,這樣說可以嗎?不可以!虛擬化可以嵌套,你完全可以虛擬一個intel vt-x 然後再虛擬機裡面裝ms2008玩hyperV。

以上胡亂說了虛擬機的大原理,似乎有些跑題,題主問虛擬機的實現原理,而且還限定vmware,我猜你並不是真的要問虛擬機的實現原理吧。首先做虛擬機的有很多,vmware公司更是擁有各個線的產品,要說實現原理還真不簡單。首先不同的產品有不同的技術,而且虛擬不同的硬體,提供各種借口,在物理硬體上調度,要實現的東西太多了。vmware 提供的是非開源的商業產品,你可以去官方找到各種白皮書,最佳實踐什麼的能找到很多實現的原理。但更多的實現原理恐怕只有待你加入vmware才能了解了。如果對虛擬化的實現感興趣,許多開源的虛擬化產品你可以去看下。

----全文原創,文章中的名稱商標等該歸誰有歸誰有。


所謂的虛擬機,也就是說通過軟體虛擬的方式搭建一個外殼,而且這個外殼就相當於我們的物理主機。在這個虛擬的外殼內部可以通過安裝的方式安裝另外一個操作系統。在虛擬機內部可以對劃分磁碟進行動態的分區,格式化,安裝操作系統安裝軟體,數據存儲和網路訪問。總之物理機既能夠實現的,虛擬機都可以實現。知道注意的一點就是虛擬機與物理機共享計算機的內存和磁碟,也就是共享計算機的資源。虛擬機可以通過NAT或者橋接的方式,共享物理機的網路。
同時在虛擬機中可以同時建立好幾個操作系統,但是這些操作系統都,共享物理系的內存,見過最多的時候同時打開了10個操作系統。
虛擬機一般用來對一些,軟硬體進行模擬,測試分析。比如對於一個軟體穩定性進行分析試驗。


x86虛擬化曾經有段時間效率感人,因為x86架構不滿足波佩克與戈德堡虛擬化需求。簡單點來說可以認為在模擬一般指令的時候VM幾乎是全速(因為幾乎不需要修改就能全速運行),但到特權指令的時候效率就gg了。至少在硬體虛擬化指令出現之前,VMware使用了一系列複雜專利技術來提高模擬特權指令的效率,所以它那時能比QEMU之流效率高。

後來硬體虛擬化指令出了,特權指令也能以正常速度模擬,開源的QEMU/KVM的效率和vSphere已經差不了多少了。現在像DO啊,Vultr啊,還有BuyVM之類的VPS商提供的VPS都是KVM,而且他們的基礎架構都是自己寫的基於QEMU/KVM的VMM Webapp,而且他們的VPS也是什麼系統都能裝,比OpenVZ那樣的半虛擬化不知高到哪兒去了。再說了我反正沒見過哪個VPS商用vSphere做他們的基礎架構的(除了VMware自己的公用雲)。

第一段主要來自某個姓卡巴斯基的作者寫的win32反編譯指南里虛擬機調試一章的前三節,逆向沒學會反倒是虛擬化的內容我?記得挺清楚的,也是感人


虛擬就是虛擬。沒有這麼麻煩的。


利用cpu提供的硬體借口,能夠區分出代碼(不一定是進程,因為運行操作系統還包括驅動)在真實環境里運行還是在虛擬環境中運行,確保虛擬環境的代碼無法影響到真實環境(包括但不限於數據,代碼)。

如果cpu沒有提供硬體借口,vmware還提供一套純軟體模擬的硬體,使得系統運行在一個純軟體模擬的環境了。當然效率可想而知。

虛擬就在於:
1、無法影響真實環境;
2、可以保存虛擬環境中的某個時刻的狀態,隨時可以恢復(回退)到保存的狀態。


推薦閱讀:

VMware Fusion和Parallels Desktop哪個更適合開發人員?
怎樣禁止用戶把vmware虛擬機中的文件拷貝出來?
如何在VMware虛擬機中的kali系統使用360wifi2?
讓 Windows Phone 支持運行 Android 應用,會是個好的策略嗎?
jvm虛擬機真的那麼重要嗎?

TAG:虛擬機 | VMware威睿 | VMwareView |