虛擬機中運行虛擬機中運行虛擬機……如此循環能運行多少個?
如此循環能運行多少層虛擬機?不同的虛擬機實現技術是否有不同結果?
來來來,這個問題我好久之前就想過了。只不過以前機子太爛跑兩層膝蓋就跪了。
正好鳥槍換炮了。可以試一試。往虛擬機拷東西時間太長了,先上方案,一會過來貼結果。
研究問題:
虛擬機嵌套能力測試:
1.無窮嵌套是否可行。
2.實際可行嵌套層數。
提出猜想:
VMWare支持無限嵌套。
由於VMWare支持虛擬化VT和VTx,所以猜測理論上可以無限進行嵌套。
若虛擬機內虛擬化"虛擬化"的能力隨嵌套層數增加不降,則該假設成立。
實驗環境:
實驗條件:VMWare10 + XP 固定配置嵌套
實驗方案:
1.在宿主機中安裝VMWare,安裝XP虛擬機XP-VM1,並進行備份。
2.將備份XPVM1複製入原始XP-VM1,原始XP-VM1中的備份XP-VM1重新編號為XP-VM2,代表嵌套層級2。
3.將原始XP-VM1複製入備份XP-VM1,修改備份XP-VM1中各XP-VM的嵌套等級4.至此基礎設施搭建完畢,每當需要加深一級嵌套時將原始(左側)XP-VM1複製入最深層的VMWare即可。實驗過程:
第一層沒問題,虛擬機里安裝VMWare成功。
然後運行VM-XP2時,載入了啟動畫面,然後VM就崩掉了。這神奇的錯誤竟然也沒有文檔可查。
但是Linux的虛擬機是可以正常運行的,並且是以VT-x/EPT虛擬化模式運行的
因此可以肯定多層嵌套實際是可行的。
實際上用純粹的軟體模擬硬體操作當然也行,比如Bochs.但性能會有好幾個數量級的下降。
VM-XP這種搭配性能下降的太厲害了。而且中間也尿掉了。我覺得換著VMWare,Hyper-V,VirtualBox,Xen甚至是Bochs這些配著Linux,Windows換著來可能效果會好一點。
算了,知道了反正能繼續搞下去。。。我已經失去了研究能嵌套多少層的興趣了,反正沒什麼意義。
但是 @yskin 說的內層虛擬機遠程桌面連接外面的主意實在是絕了。《GEB》裡面有過這個實驗的設計,就是攝像機--顯示器自指系統,這次順便試一下。
首先Window的遠程桌面肯定是不能用了,因為一連接上原來的用戶就會掉線。
曲線救國多快好省就用QQ的遠程桌面吧。
首先是。。非全屏狀態下:
拖動最外層的窗口,動作會一層層的顯示下去,就像水波和抖繩子一樣,搖擺搖擺,相當有意思。
虛擬機本身和遠程桌面程序都全屏後,理論上畫面會維持最後一刻的狀態不變。
不過實際情況是畫面會逐漸暗淡。
還有如同嗑藥一般的神奇動態變色。
台階藝術。
不過神奇的是。。對於滑鼠指針,虛擬機的嵌套卻一點影響都沒有。可能是由於滑鼠消息事件的處理機制決定的。
先這些吧。
=_=。。。實驗做了一半跑了,摺疊我吧。
曾經深陷此坑,膝蓋跪爛,好不容易才爬出來的苦逼研究僧跑來回答這個問題。
這個問題叫做嵌套式虛擬化nested virtualization。
x86上的全系統虛擬化有三種主要的途徑:- 二進位翻譯binary translation(BT),把降權執行會silently fail的指令替換掉,如純Qemu、Bochs、早期的VMware
- 半虛擬化para virtualization(PV),修改guest操作系統把敏感操作換成hypercall,如早期的Xen
- 硬體虛擬化(HVM),處理器VMX擴展原生支持guest在非根模式運行,如KVM
如果純粹採用BT方案,理論上可虛擬化的層數是無限的。直白地說,虛擬化可以理解為精確模擬執行guest中的每一條指令,而VMM總可以用若干條指令來模擬guest中的一條指令(大不了就像解釋型jvm一樣一條一條模擬執行bytecode)。只是guest性能會呈指數級下降。
如果純粹採用PV,最多只能跑一層。其實PV現在在HVM出來以後就很少使用了,不過PV的思想在SOSP03那時是一大創舉,微軟為此都向劍橋貢獻了XP的代碼。
如果純粹採用HVM,現在KVM已經能做到兩層,OSDI10年的Turtles做的就是這個事情,這個也已經被merge到了KVM的mainsteam中。不過Intel和AMD在設計虛擬化擴展的時候並沒有將nested virtualization考慮進去,再加上每次VMExit的開銷其實非常大,我估計嵌套之後的性能說不定還比不上純粹的BT方案。但從理論上說,通過複雜的實現,也是可以做到多層嵌套的。(有多複雜?我用L0、L1、L2 、L3來表示各層,L3要做的工作是1,L2要做的就是2^2,L1要做的就是3^2,L0要做的是4^2。。。因為,越是下面的那層要處理所有上層之間的交互,事實上KVM現在兩層的實現已經非常複雜了)
最後奉上一張很形象的圖。
嵌套運行多層當然是沒有問題的。具體多少層就要看你的硬體水平了。OS都有個最低硬體要求,嵌套至一定層數,虛擬機的虛擬機的。。。「硬體」就滿足不了下一層虛擬機的運行了。而且還有一個問題,管你嵌套多少次,佔用的還是你實際宿主機的資源。你的虛擬機也都是宿主機的一個程序。所以嵌套到最後,你的整個電腦都會卡死,從內到外,從外到內。
虛擬機里打開Javascript PC Emulator算嗎...
虛擬機,然後遠程桌面實體機,非常有意思。
我記得有人用六種方式嵌套過六個。
最好是自己搞個大內存的做做測試。另外不知道最裡層直接遠程桌面到最外層是什麼效果。最近親測, Oracle VM Server不能在VMware, VirtualBox中嵌套虛擬化。但是VMware自身是可以的,VirtualBox沒有測試。Hyper-V明確有支持嵌套虛擬化的計劃
我倒是想知道,最先卡死的是哪一層?
其實現實世界也是個虛擬機,外面的虛擬機里正有一個你正看著虛擬機里的你玩虛擬機里的虛擬機。
理論上是可以運行好幾個的,只要電腦不卡。還有一個不是特別重要的因素——只要顯示器夠大,能夠顯示得下。第一層開始的虛擬機,裡面的字會很小。我的思路是這樣的,完全使用真機上已存在的虛擬機,在虛擬機里掛載真機的目錄,然後繼續開虛擬機。算了,就做到這個狀態好了。本來是想在XP系統下面繼續開一個精簡版XP系統的虛擬機,不是我不想做下去,而是掛載第二層虛擬機裡面的文件目錄簡直是神煩。好像這個狀態已經有點影響到真機的性能了,不過還是能接受的。寫這個回答的時候,真機的輸入法開始卡了。不知道為什麼,開Windows 7虛擬機(裡面安裝的是Windows Thin PC)的時候會報錯。真機的虛擬化肯定是開著的。這個問題似乎無解啊。
是的,可以這樣子嵌套很多層。和盜夢空間的劇情很類似,越是裡層就會越慢,到某一層的時候,可能你會慢到受不了。
虛擬機虛擬出來的硬體沒有VT,是不能進一步虛擬機的,個人認為一層封頂。
不過我親眼見證過別人一台2GB內存的電腦:
[Windows 7]--VirtualBox--&>[Fedora]--wine--&>Win32的bochs--&>[某小型x86宏內核操作系統]
其中涉及到了:
- 虛擬機
- 兼容層
- 模擬器
那個最深層的x86 OS是操作系統課程設計內容。
我用 VMware 只能有一層虛擬機,虛擬機里裝都裝不上。。
在Win上跑VMare Workstation已經卡成屎了,你們居然還有心情玩嵌套....
虛擬化的正確用法其實是在物理伺服器上裝ESXI。每個虛擬機都需要分配一定數量的物理內存,總內存不能超過你的物理內存。比如8G內存, 每個虛擬機1G內存, 簡單算最多7個(物理機器佔1G)
ESX nested install
轉:Creating a Nested ESXi 5 Environment
理論上應該是無限個.
不能循環下去吧。 mac os---&>win10(DP)------&>red hat Linux(VM) 就會出現這種效果
想起來一個用JAVA做jvm的項目
只是試過win7→vmware→xenserver→openstack→centos....額,這是幾層呀?
這是個程序虛擬機嵌套的例子:GitHub - rswier/c4: C in four functions ,把編譯器源程序 c4.c 編譯成 c4 後,可用 c4 自舉嵌套多層:
./c4 c4.c c4.c hello.c
我疑惑的是,它的運行時間與遞歸層數呈什麼關係,通過實驗,貌似比指數階還高。
推薦閱讀:
※hash演算法的數學原理是什麼,如何保證儘可能少的碰撞?
※理論上,能否直接用彙編語言寫出今天所有的計算機程序?
※國外計算機最好的大學有哪些?
※原碼、反碼、補碼的產生、應用以及優缺點有哪些?