我已經(jīng)想不起來是從什么時候開始的,突然就對計算機歷史產(chǎn)生了濃厚的興趣。于是我想著,要不以后所有系列文章的開篇都先和大家聊聊歷史吧。其實說來挺有意思,看過去到底是為了看未來,因為歷史總是驚人的相似,幾乎所有的問題都能夠在歷史長河中尋得答案??上У氖?,但凡歷史,最是難寫,筆者礙于能力有限,還望大家多指點一二。在計算機科學中,虛擬化技術(Virtualization)是一種資源管理(優(yōu)化)技術,將計算機的各種物理資源(e.g. CPU、內存以及磁盤空間、網(wǎng)絡適配器等 I/O 設備)予以抽象、轉換,然后呈現(xiàn)出來的一個可供分割并任意組合為一個或多個(虛擬)計算機的配置環(huán)境。虛擬化技術打破了計算機內部實體結構間不可切割的障礙,使用戶能夠以比原本更好的配置方式來應用這些計算機硬件資源。而這些資源的虛擬形式將不受現(xiàn)有架設方式,地域或物理配置所限制。虛擬化技術是一個廣義的術語,根據(jù)不同的對象類型可以細分為:平臺虛擬化(Platform Virtualization):針對計算機和操作系統(tǒng)的虛擬化。
資源虛擬化(Resource Virtualization):針對特定的系統(tǒng)資源的虛擬化,如內存、存儲、網(wǎng)絡資源等。
應用程序虛擬化(Application Virtualization):包括仿真、模擬、解釋技術等,如 Java 虛擬機(JVM)。
這里我們主要討論的是平臺虛擬化。首先提出第一個問題:當我們討論平臺虛擬化技術,實際在討論什么?我認為討論的是 Hypervisor 或稱為 VMM(Virtual Machine Monitor),本篇我們主要回顧 VMM 的發(fā)展歷程,并思考之中的原因。1959 年 6 月,牛津大學的計算機教授,克里斯·托弗(Christopher Strachey)在國際信息處理大會(International Conference on Information Processing)上發(fā)表了一篇名為《大型高速計算機中的時間共享》(Time Sharing in Large Fast Computer)的學術報告,他在文中首次提出了 “虛擬化” 的基本概念,還論述了什么是虛擬化技術。這篇文章被認為是最早的虛擬化技術論述,從此拉開了虛擬化發(fā)展的帷幕。克里斯·托弗還同時提出了 Multi-Processing(多道程序)這一超前的概念。Multi-Processing 解決了應用程序因等待外部設備而導致處理器空轉問題,同時也解決了用戶如何調試(Debug)代碼的問題。即便在現(xiàn)在看來,多道程序的理念仍是操作系統(tǒng)在 “并發(fā)” 領域中的隗寶。When I wrote the paper in 1959 I, in common with everyone else, had no idea of the difficulties which would arise in writing the software to control either the time-sharing or multi-programming. If I had I should not have been so enthusiastic about them.
1960 年,為了應對物理學領域的計算需求,美國啟動 Atlas 超級計算機(Super Computer)項目。同期的英國全國只有 16 臺計算機,日不落帝國的詛咒在計算機領域也無法幸免。1961 年,由麻省理工學院的 Fernando Corbato 教授帶領團隊開始研發(fā) CTSS(Compatible Time Sharing System,兼容性分時系統(tǒng))項目,并由 IBM 提供硬件設備和工程師進行支持。分時系統(tǒng)可以說是硬件虛擬化的根本,CTSS 為后來 IBM 的 TSS 打下了基礎。1962 年,第一臺 Atlas 超級計算機 Atlas 1 誕生,Atlas 1 是第一臺實現(xiàn)了虛擬內存(Virtual Memory)概念的計算機,并將其稱為一級存儲(one-level store)。Atlas 1 還是第一個實現(xiàn)了名為 Supervisor 的底層資源管理組件的計算機,Supervisor 可以通過特殊的指令或代碼來管理物理主機的硬件資源。例如:中央處理器的時間分配。沒錯,操作系統(tǒng)最早的稱謂其實是 Supervisor,往后還被叫過一段時間的 Master Control Program(主控程序),但最終 Operating System 勝出了。此時你或許能夠理解為什么虛擬機管理程序會被統(tǒng)稱為 Hypervisor(Super、Hyper 是同意詞,意為超級,但詞義上 Hyper 比 Super 還要高級一些)。1963 年使用打孔機的第一代 Atlas 超級計算機1960 中期,IBM 在 Thomas J. Watson Research Center (NY) 進行 M44/44X 計算機研究項目。M44/44X 項目基于 IBM 7044(M44)實現(xiàn)了多個具有突破性的虛擬化概念,包括部分硬件共享(partial hardware sharing)、時間共享(time sharing)、內存分頁(memory paging)以及實現(xiàn)了虛擬內存管理的 VMM。通過這些虛擬化技術,應用程序可以運行在這些虛擬的內存之中,實現(xiàn)了在同一臺主機上模擬出多個 7044 系統(tǒng)(44X)。M44/44X 項目首次使用了 VM(Virtual Machine) 和 VMM(Virtual Machine Monitor)一詞,被認為是世界上第一個支持虛擬機的系統(tǒng)。1964 年:IBM 推出了著名的 System/360。你或許有所耳聞,System/360 的開發(fā)過程被視為了計算機發(fā)展史上最大的一次豪賭,為了研發(fā) System/360,IBM 決定征召六萬多名新員工,創(chuàng)建了五座新工廠。即便如此,當時的出貨時間仍被不斷順延。吉恩·阿姆達爾是系統(tǒng)主架構師,當時的項目經(jīng)理佛瑞德·布魯克斯(Frederick P. Brooks, Jr.)事后根據(jù)這項計劃的開發(fā)經(jīng)驗,寫出了同樣著名的《人月神話:軟件項目管理之道》(The Mythical Man-Month: Essays on Software Engineering)記述人類工程史上一項里程碑式的大型復雜軟件系統(tǒng)開發(fā)經(jīng)驗。最終,IBM System/360 取得了巨大的商業(yè)成功。System/360 不僅提供了新型的操作系統(tǒng)(讓單一操作系統(tǒng)適用于整個系列的產(chǎn)品,這是 System/360 系列大型機成功的關鍵),還實現(xiàn)了基于全硬件虛擬化(Full Hardware Virtualization)的虛擬機解決方案,包括:頁式虛擬內存(4k 分頁虛擬存儲系統(tǒng)),虛擬磁盤以及 TSS 分時系統(tǒng)。System/360 最多可提供 14 個虛擬機,每個虛擬機具有 256k 固定虛擬內存。這里有必要著重介紹一下 TSS (Time Sharing System,分時共享系統(tǒng)),它能夠讓一臺主機上連接多個帶有顯示器和鍵盤的終端,同時允許多個用戶通過主機的終端,以交互方式使用計算機,共享主機中的資源。分時操作系統(tǒng)本質是一個多用戶交互式操作系統(tǒng)。其中,“分時” 的含義是將 CPU 占用切分為多個極短(e.g. 1/100sec)的時間片,每個時間片都執(zhí)行著不同的任務。通過對這些時間片的輪詢,就可以將一個 CPU “偽裝”(虛擬化)成多個 vCPU,并且讓每顆 vCPU 看起來都是并行運行的。最終達到多個用戶分享使用同一臺計算機,多個程序分時共享硬件和軟件資源的效果。TSS 被認為是最原始的虛擬化技術。可見,最初虛擬化技術的應用和發(fā)展源于大型機對分時系統(tǒng)的需求。這種通過硬件的方式來生成多個可以運行獨立操作系統(tǒng)軟件的虛擬機實例,解決了早期大型計算機只能單任務處理而不能分時多任務處理的問題。由于這種虛擬化技術是基于硬件設備來實現(xiàn)的,故被稱為硬件虛擬化(Hardware virtualization)。但需要注意的是,這一說法在后來被進一步細分為了狹義的硬件虛擬化技術,現(xiàn)今更加為人多熟知的硬件虛擬化是指:一種對計算機或操作系統(tǒng)的虛擬化,能夠對用戶隱藏真實的計算機硬件,表現(xiàn)出另一個抽象的計算平臺。The Mythical Man-Month: Essays on Software Engineering1974 年,Gerald J. Popek(杰拉爾德·J·波佩克)和 Robert P. Goldberg(羅伯特·P·戈德堡)在合作論文《可虛擬第三代架構的規(guī)范化條件》(Formal Requirements for Virtualizable Third Generation Architectures)中提出了一組稱為虛擬化準則的充分條件,又稱波佩克與戈德堡虛擬化需求(Popek and Goldberg virtualization requirements)即:虛擬化系統(tǒng)結構的三個基本條件。滿足這些條件的控制程序才可以被稱為虛擬機監(jiān)控器(Virtual Machine Monitor,簡稱 VMM):資源控制(Resource Control)??刂瞥绦虮仨毮軌蚬芾硭械南到y(tǒng)資源。
等價性(Equivalence)。在控制程序管理下運行的程序(包括操作系統(tǒng)),除時序和資源可用性之外的行為應該與沒有控制程序時的完全一致,且預先編寫的特權指令可以自由地執(zhí)行。
效率性(Efficiency)。絕大多數(shù)的客戶機指令應該由主機硬件直接執(zhí)行而無需控制程序的參與。
該論文盡管基于簡化的假設,但上述條件仍為評判一個計算機體系結構是否能夠有效支持虛擬化提供了一個便利方法,也為設計可虛擬化計算機架構給出了指導原則。同時,Gerald J. Popek 和 Robert P. Goldberg 還在論文中介紹了兩種 Hypervisor 類型,分別是類型 I 和 類型 II。類型 II(寄居或托管 Hypervisor):VMM 運行在傳統(tǒng)的操作系統(tǒng)上,就像其他計算機程序那樣運行。VMware 5.5 以前版本
Xen 3.0 以前版本
Virtual PC 2004
類型 I(原生或裸機 Hypervisor):這些虛擬機管理程序直接運行在宿主機的硬件上來控制硬件和管理客戶機操作系統(tǒng)。需要硬件支持
VMM 作為主操作系統(tǒng)
運行效率高
VMware 5.5 及以后版本
Xen 3.0 及以后版本
Virtual PC 2005
KVM
ps:這里我特意將類型 I 和 II 的順序調轉,至于為什么,從實現(xiàn)案例可以看出類型 I 已然是時代的選擇。再一個,老實說我確實為這個事實感到震驚,平臺虛擬化的雛形竟然在 1974 年就已經(jīng)確立了的這個事實。1979 年,Unix 的第 7 個版本引入了 chroot 機制,意味著第一個 操作系統(tǒng)虛擬化(OS-level virtualization) 誕生了。chroot 是直到現(xiàn)在我們依然在使用的一個系統(tǒng)調用,這個系統(tǒng)調用會讓一個進程把指定的目錄作為根目錄,它的所有文件系統(tǒng)操作都只能在這個指定目錄中進行,本質是一種文件系統(tǒng)層的隔離。ps:操作系統(tǒng)虛擬化這個說法你或許會感到陌生,但容器(Container)你應該非常熟悉了。在上世紀 60~80 年代,因為虛擬化技術使得大型機和小型機獲得了空前的成功。并且在相當長的一段時間里,虛擬化技術只在大型機和小型機上得到了應用,而在 x86 平臺上的應用仍然進展緩慢。不過也可以理解,以當時 x86 平臺的處理能力,應付一兩個應用程序已然捉襟見肘,還怎么能夠將資源分給更多的虛擬應用呢?而后隨著 x86 的流行,大型機和小型機在新興的服務器市場中也逐漸失去了競爭力。直到上世紀 80~90 年代,Intel 公司(戈登·摩爾)提出了摩爾定律,Windows、Mac 等 PC(Personal Computer)電腦被廣泛使用,Wintel 聯(lián)盟勢如破竹,還出現(xiàn)了神一般的 Linux 服務器操作系統(tǒng)。種種原因,到底是 x86 贏得了時代的青睞,成為了服務器的行業(yè)標準?;蛟S在那時 Intel 就已經(jīng)開始思考為何 “生態(tài)” 這件事情了。隨著 x86 服務器和桌面部署的增長也為企業(yè) IT 基礎架構帶來了新的難題:基礎架構利用率低
基礎架構成本高
IT 運維成本高
故障切換和災難保護不足
最終用戶桌面的維護成本高昂
而解決這些難題就是新時代賦予虛擬化技術的歷史任務,整個 80~90 年代,虛擬化技術及公司如同雨后春筍般涌現(xiàn)。1987 年:Insignia Solutions 公司演示了一個稱為 SoftPC 的軟件模擬器,這個模擬器允許用戶在 Unix Workstations 上運行 DOS 應用。當時一個可以運行 Microsoft DOS 的 PC 需要 1,500 美金,而使用 SoftPC 模擬,就可以直接在大型工作站上運行 Microsoft DOS 了。1989 年,Insignia Solutions 發(fā)布了 Mac 版的 SoftPC,使蘋果用戶不僅能運行 DOS,還能運行 Windows 操作系統(tǒng)。1990 年,Keir Fraser 和 Ian Pratt 創(chuàng)建了 XenServer 的初始代碼工程(項目)。1997 年,蘋果開發(fā)了 Virtual PC,后來又賣給了 Connectix 公司。1998 年,著名的 x86 仿真模擬器 Bochs 發(fā)布。1999 年,VMware 公司率先推出針對 x86 平臺推出了可以流暢運行的商業(yè)虛擬化軟件 VMaware Workstation。2000 年,F(xiàn)reeBSD jail,真正意義上的第一個功能完整的操作系統(tǒng)虛擬化技術。利用這個技術,F(xiàn)reeBSD 的系統(tǒng)管理者,可以創(chuàng)造出幾個小型的軟件系統(tǒng),這些軟件系統(tǒng)被稱為 jails(監(jiān)獄,即容器。ps:不禁感慨,取名真的很重要)。2001 年,VMWare 發(fā)布 ESX 和 GSX,是 ESXi 的前身。同年,F(xiàn)abrice Bellard 也發(fā)布了目前最流行的,采用了動態(tài)二進制翻譯(Binary Translation)技術的開源虛擬化軟件 QEMU(Quick EMUlator)的第一個版本。此時,虛擬化技術的共同目標就是將 x86 架構轉變?yōu)橥ㄓ玫墓蚕碛布A架構,使應用程序運行環(huán)境在隔離性、移動性和操作系統(tǒng)類型方面都有選擇的空間。首先了解一下 x86 架構的特點。CPU 為了保證程序代碼執(zhí)行的安全性,多用戶的獨立性以及保證操作系統(tǒng)的穩(wěn)定性,提出了 CPU 執(zhí)行狀態(tài)的概念。它有效的限制了不同程序之間的數(shù)據(jù)訪問能力,避免了非法的內存數(shù)據(jù)操作,同時也避免了應用程序錯誤操作計算機的物理設備。一般的,CPU 都會劃分為用戶態(tài)和內核態(tài),而 x86 CPU 更是細分為了 Ring 0~3 四種執(zhí)行狀態(tài)。顯然,只有操作系統(tǒng)能夠無限制的訪問內存、磁盤、鼠鍵等外圍硬件設備的數(shù)據(jù),因為操作系統(tǒng)就是作為計算機硬件資源管理器而存在的,操作系統(tǒng)就是為了讓多個普通應用程序可以更簡單、安全的運行在同一臺計算機上而存在的 “特殊的應用程序”。也很顯然,所有的應用程序都應該運行在用戶態(tài)中。當應用程序需要訪問外圍硬件設備時,CPU 會通過特別的接口去調用核心態(tài)的代碼,以這種旁路的方式來應用程序對硬件設備的調用。如果用戶態(tài)的應用程序直接調用硬件設備的話,就會被操作系統(tǒng)捕捉到并觸發(fā)異常,彈出警告窗口。可見,x86 架構與大型機不同,當時的 x86 體系結構缺乏必要的針對虛擬化的硬件支持,難以直接滿足波佩克與戈德堡的虛擬化需求,所以 x86 架構天然不是一個可虛擬化的架構。x86 架構的 CPU 中有 17 條指令成為了虛擬化最大的障礙,錯誤執(zhí)行這些指令會導致操作系統(tǒng)顯示警告、終止應用程序甚至完全崩潰。當時 VMware 提出了解決這個問題的思路:在虛擬機生成這些特殊的指令時將它們 “困住”,然后將它們轉換成可虛擬化的安全指令,同時保證其他所有的指令不受到干擾地執(zhí)行。這樣就產(chǎn)生了一種與主機硬件匹配并保持軟件完全兼容性的高性能虛擬機。這就是 全虛擬化(Full virtualization) 技術誕生的背景 —— 必須使用純軟件實現(xiàn)的方式構造 VMM。VMware 首創(chuàng)了這項技術,一舉穩(wěn)坐虛擬化龍頭老大。全虛擬化是指虛擬機模擬了完整的底層硬件,包括處理器、物理內存、時鐘、外設等,使得為原始硬件設計的操作系統(tǒng)或其它系統(tǒng)軟件完全不做任何修改就可以在虛擬機中運行。客戶機操作系統(tǒng)(Guest OS)與真實硬件之間的交互可以看成是通過一個預先規(guī)定的硬件接口進行的。全虛擬化 VMM 以完整模擬硬件的方式提供全部接口(同時還必須模擬特權指令的執(zhí)行過程)。全虛擬化的工作原理:虛擬機是對真實計算環(huán)境的抽象和模擬,VMM 需要為每個虛擬機分配一套數(shù)據(jù)結構來管理它們狀態(tài),包括 vCPU 的全套寄存器,物理內存的使用情況,虛擬設備的狀態(tài)等等。VMM 調度虛擬機時,會將其部分狀態(tài)恢復到 Host OS 中。但并非所有的狀態(tài)都需要恢復,例如主機 CR3 寄存器中存放的是 VMM 設置的頁表物理地址,而不是 Guest OS 設置的值。pCPU 直接運行 Guest OS 的機器指令時,由于 Guest OS 運行在低特權級別(Ring 1),如果 Guest OS 直接訪問 Host OS 的特權狀態(tài)(如寫 GDT 寄存器),就會因為權限不足導致 pCPU 產(chǎn)生異常,然后將運行權主動交還給 VMM。此外,外部中斷的到來也會影響 VMM 的運行。VMM 可能需要先將該虛擬機的當前狀態(tài)寫回到狀態(tài)數(shù)據(jù)結構中,分析虛擬機被掛起的原因,然后代表 Guest OS 執(zhí)行相應的特權操作。最簡單的情況,如 Guest OS 對 CR3 寄存器的修改,只需要更新虛擬機的狀態(tài)數(shù)據(jù)結構即可。一般而言,大部分情況下,VMM 需要經(jīng)過復雜的流程才能完成原本簡單的操作。最后 VMM 將運行權還給 Guest OS,Guest OS 從上次被中斷的地方繼續(xù)執(zhí)行,或處理 VMM “塞”入的虛擬中斷和異常。這種經(jīng)典的虛擬機運行方式被稱為 Trap-And-Emulate(捕獲-模擬),虛擬機對于 Guest OS 完全透明,Guest OS 不需要任何修改,但是 VMM 的設計會比較復雜,系統(tǒng)整體性能受到明顯的損害。舉例來說:x86 平臺中,操作系統(tǒng)執(zhí)行切換進程頁表的操作,真實硬件會通過提供一個特權 CR3 寄存器來實現(xiàn)該接口,操作系統(tǒng)只需執(zhí)行 mov pgtable, %%cr3 匯編指令即可。而全虛擬化 VMM 就必須要完整地模擬該接口執(zhí)行的全過程。如果硬件(主要是 CPU)不提供虛擬化的特殊支持的話,那么這個模擬過程將會十分復雜:一般而言,VMM 必須運行在最高優(yōu)先級來完全控制宿主機操作系統(tǒng)(Host OS),而 Guest OS 需要降級運行,從而不能執(zhí)行特權操作。當 Guest OS 執(zhí)行前面的特權匯編指令時,Host OS 產(chǎn)生異常(General Protection Exception),執(zhí)行控制權重新從 Guest OS 轉到 VMM 手中。VMM 事先分配一個變量作為影子 CR3 寄存器給 Guest OS,將 pgtable(頁表)代表的 Guest OS 物理地址(Guest Physical Address)填入影子 CR3 寄存器,然后 VMM 還需要 pgtable 翻譯成主機物理地址(Host Physical Address)并填入物理 CR3 寄存器,最后返回到 Guest OS中。隨后 VMM 還將處理復雜的 Guest OS 缺頁異常(Page Fault)。簡單來說就是全虛擬化需要在 VMM 中模擬出一顆包含了控制單元、運算單元、存儲單元、IS(指令集)的 CPU;此外,還需要模擬一張進行虛擬存儲地址和物理存儲地址轉換的頁表;此外,還需要在 VMM 模擬磁盤設備控制器、網(wǎng)絡適配器等等各種 I/O 外設接口。如此依賴,Guest OS 就不知道自己其實是個虛擬機了呀,它收到了欺騙。可以想象得到,全虛擬化這種處理器密集型的虛擬化技術實現(xiàn)是異常困難且低效的。比較著名的全虛擬化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac 和 QEMU。QEMU 在今年(2019)對外宣稱可以模擬所有設備,天啊,這簡直是個奇跡般的偉大軟件。但基于這樣的前提,全虛擬化 VMM 必須要克服許多難以解決的問題。例如:確保 VMM 控制所有的系統(tǒng)資源:x86 處理器有 4 個特權級別,Ring 0 ~ Ring 3,只有運行在 Ring 0 ~ 2 時,處理器才可以訪問特權資源或執(zhí)行特權指令;運行在 Ring 0 級時,處理器可以訪問所有的特權狀態(tài)。x86 平臺上的操作系統(tǒng)一般只使用 Ring 0 和 Ring 3 這兩個級別,操作系統(tǒng)運行在 Ring 0 級,用戶進程運行在 Ring 3 級。為了滿足 資源控制(Resource Control) 虛擬化需求條件,VMM 就必須運行在 Ring 0 級,同時為了避免 Guest OS 控制系統(tǒng)資源,Guest OS 不得不降低自身的運行級別,運行在 Ring 1 或 Ring 3 級(Ring 2 不使用)。
特權級壓縮(Ring Compression):VMM 使用分頁或段限制的方式來保護物理內存的訪問,但是 64 位模式下段限制不起作用,而分頁又不區(qū)分 Ring 0, 1, 2。為了統(tǒng)一和簡化 VMM的設計,Guest OS 只能和 Guest 進程一樣運行在 Ring 3 級。VMM 必須監(jiān)視 Guest OS 對 GDT、IDT 等特權資源的設置,防止 Guest OS 運行在 Ring 0級,同時又要保護降級后的 Guest OS 不受 Guest 進程的主動攻擊或無意破壞。
特權級別名(Ring Alias):特權級別名是指 Guest OS 在虛擬機中運行的級別并不是它所期望的。VMM 必須保證 Guest OS 不能獲知正在虛擬機中運行這一事實,否則可能打破 等價性(Equivalence) 虛擬化需求條件。例如,x86 處理器的特權級別存放在 CS 代碼段寄存器內,Guest OS 可以使用非特權 push 指令將 CS 寄存器壓棧,然后 pop 出來檢查該值。又如,Guest OS 在低特權級別時讀取特權寄存器 GDT、LDT、IDT 和 TR,并不發(fā)生異常,從而可能發(fā)現(xiàn)這些值與自己期望的不一樣。為了解決這個挑戰(zhàn),VMM 可以使用動態(tài)二進制翻譯(Binary Translation)的技術,例如預先把 push %%cs 指令替換,在棧上存放一個影子 CS 寄存器值;又如,可以把讀取 GDT 寄存器的操作 sgdt dest 改為 movl fake_gdt, dest。
地址空間壓縮(Address Space Compression):地址空間壓縮是指 VMM 必須在 Guest OS 的地址空間中保留一部分供其使用。例如,中斷描述表寄存器(IDT Register)中存放的是中斷描述表的線性地址,如果 Guest OS 運行過程中來了外部中斷或觸發(fā)處理器異常,必須保證運行權馬上轉移到 VMM 中,因此 VMM 需要將 Guest OS 的一部分線性地址空間映射成自己的中斷描述表的主機物理地址。VMM 可以完全運行在 Guest OS 的地址空間中,也可以擁有獨立的地址空間,后者的話,VMM 只占用 Guest OS 很少的地址空間,用于存放中斷描述表和全局描述符表(GDT)等重要的特權狀態(tài)。無論如何哪種情況,VMM 應該防止 Guest OS 直接讀取和修改這部分地址空間。
處理 Guest OS 的缺頁異常:內存是一種非常重要的系統(tǒng)資源,VMM 必須全權管理,Guest OS 理解的物理地址只是客戶機物理地址(Guest Physical Address),并不是最終的主機物理地址(Host Physical Address)。當 Guest OS 發(fā)生缺頁異常時,VMM 需要知道缺頁異常的原因,是 Guest 進程試圖訪問沒有權限的地址,或是客戶機線性地址(Guest Linear Address)尚未翻譯成客戶機物理地址,還是客戶機物理地址尚未翻譯成主機物理地址。一種可行的解決方法是 VMM 為 Guest OS 的每個進程的頁表構造一個影子頁表(Shadow Page Table),維護 Guest Linear Address 到 Host Physical Address 的映射,主機 CR3 寄存器存放這個影子頁表的物理內存地址。VMM 同時維護一個 Guest OS 全局的 Guest Physical Address 到 Host Physical Address 的映射表。發(fā)生缺頁異常的地址總是 Guest Linear Address,VMM 先去 Guest OS 中的頁表檢查原因,如果頁表項已經(jīng)建立,即對應的 Guest Physical Address 存在,說明尚未建立到 Host Physical Address 的映射,那么 VMM 分配一頁物理內存,將影子頁表和映射表更新;否則,VMM 返回到 Guest OS,由 Guest OS 自己處理該異常。
處理 Guest OS 中的系統(tǒng)調用(System Call):系統(tǒng)調用是操作系統(tǒng)提供給用戶的服務例程,使用非常頻繁。最新的操作系統(tǒng)一般使用 SYSENTER/SYSEXIT 指令對來實現(xiàn)快速系統(tǒng)調用。SYSENTER 指令通過 IA32_SYSENTER_CS,IA32_SYSENTER_EIP 和 IA32_SYSENTER_ESP 這 3 個 MSR(Model Specific Register)寄存器直接轉到 Ring 0 級;而 SYSEXIT 指令不在 Ring 0 級執(zhí)行的話將觸發(fā)異常。因此,如果 VMM 只能采取 Trap-And-Emulate 的方式處理這 2 條指令的話,整體性能將會受到極大損害。
轉發(fā)虛擬的中斷和異常:所有的外部中斷和 pCPU 的異常直接由 VMM 接管,VMM 構造必需的虛擬中斷和異常,然后轉發(fā)給 Guest OS。VMM 需要模擬硬件和操作系統(tǒng)對中斷和異常的完整處理流程,例如 VMM 先要在 Guest OS 當前的內核棧上壓入一些信息,然后找到 Guest OS 相應處理例程的地址,并跳轉過去。VMM 必須對不同的 Guest OS 的內部工作流程比較清楚,這增加了 VMM 的實現(xiàn)難度。同時,Guest OS 可能頻繁地屏蔽中斷和啟用中斷,這兩個操作訪問特權寄存器 EFLAGS,必須由 VMM 模擬完成,性能因此會受到損害。Guest OS 重新啟用中斷時,VMM 需要及時地獲知這一情況,并將積累的虛擬中斷轉發(fā)。
Guest OS 頻繁訪問特權資源:Guest OS 對特權資源的每次訪問都會觸發(fā) CPU 異常,然后由 VMM 模擬執(zhí)行,如果訪問過于頻繁,則系統(tǒng)整體性能將會受到極大損害。比如對中斷的屏蔽和啟用,cli(Clear Interrupts)指令在 Pentium 4 處理器上需要花費 60 個時鐘周期(cycle)。又比如,處理器本地高級可編程中斷處理器(Local APIC)上有一個操作系統(tǒng)可修改的任務優(yōu)先級寄存器(Task-Priority Register),IO-APIC 將外部中斷轉發(fā)到 TPR 值最低的處理器上(期望該處理器正在執(zhí)行低優(yōu)先級的線程),從而優(yōu)化中斷的處理。TPR 是一個特權寄存器,某些操作系統(tǒng)會頻繁設置(Linux Kernel 只在初始化階段為每個處理器的 TPR 設置相同的值)。
顯然,基于 Trap-And-Emulate 處理方式的全虛擬化雖能夠以純軟件的方式完成虛擬化并解決了許多問題,但同時也帶來了極大的設計復雜性和性能下降。而對于這兩個問題,半虛擬化(Partial virtualization) 想到了一個好辦法:改造 Guest OS,將 Guest OS 原來所有需要被 VMM 截獲、模擬的指令和操作全部改造成與 VMM 協(xié)同工作的指令(hypercall)和操作。VMM 不再隱瞞了,因為你(Guest OS)已經(jīng)知道自己就是個虛擬機了。其核心思想是:動態(tài)或靜態(tài)地改變 Guest OS 對特權狀態(tài)訪問的操作,盡量減少產(chǎn)生不必要的硬件異常,同時簡化 VMM 的設計。半虛擬化是一種通過修改 Guest OS 部分訪問特權狀態(tài)的代碼以便直接與 VMM 交互的技術。在半虛擬化虛擬機中,部分硬件接口以軟件的形式提供給 Guest OS,這可以通過 Hypercall(VMM 提供給 Guest OS 的直接調用,與系統(tǒng)調用類似)的方式來提供。例如,Guest OS 把切換頁表的代碼修改為調用 Hypercall 來直接完成修改影子 CR3 寄存器和翻譯地址的工作。由于不需要產(chǎn)生額外的異常和模擬部分硬件執(zhí)行流程,半虛擬化可以大幅度提高性能,比較著名的 VMM 有 Denali、Xen。2003 年,英國劍橋大學的一位講師發(fā)布了開源虛擬化項目 Xen,并成立 XenSource 公司,通過半虛擬化技術為 x86-64 提供虛擬化支持。同年,Intel 正式公布將在 x86 平臺的 CPU 上支持虛擬化技術 VT。同年 VMWare 也被 EMC 收購,成為 EMC 迄今最成功的一筆收購。同年,微軟收購 Connectix 公司獲得 Virtual PC 虛擬化技術。相較于全虛擬化,半虛擬化 VMM 只需要模擬部分底層硬件,因此 Guest OS 不做修改是無法在虛擬機中運行的,甚至運行在虛擬機中的其它程序也需要進行修改,如此代價,換來的就是接近于物理機的虛擬機性能。有意思的是,半虛擬化其實也很尷尬,對于 Linux 而言自然是改了就改了,但 Windows 你要怎么改?人家可是閉源的。寫到這里,不禁會想起自己寫過的代碼,拆東墻補西墻可不值得提倡,要從根源上解決問題。而這個根源自然就是 —— CPU。既然全虛擬化性能低的主要原因是花費了太多的精力去捕獲 CPU 異常并模擬 CPU 行為,那么如果 CPU 本身就為 VMM 提供了便利,那豈不是從根本上解決了這個問題?這就是 硬件輔助虛擬化(Hardware-assisted virtualization) 。Intel-VT(Intel Virtualization Technology)和 AMD-V 是目前 x86 平臺上可用的兩種硬件輔助虛擬化技術。VT-x 為 IA 32 處理器增加了兩種操作模式:VMX root operation 和 VMX non-root operation。VMM 自己運行在 VMX root operation 模式,VMX non-root operation 模式則由 Guest OS 使用。兩種操作模式都支持 Ring 0~3 這 4 個特權級,因此 VMM 和 Guest OS 都可以自由選擇它們所期望的運行級別。這兩種操作模式可以互相轉換。運行在 VMX root operation 模式下的 VMM 通過顯式調用 VMLAUNCH 或 VMRESUME 指令切換到 VMX non-root operation 模式,硬件自動加載 Guest OS 的上下文,于是 Guest OS 獲得運行,這種轉換稱為 VM entry。Guest OS 運行過程中遇到需要 VMM 處理的事件,例如外部中斷或缺頁異常,或者主動調用 VMCALL 指令調用 VMM 的服務的時候(與系統(tǒng)調用類似),硬件自動掛起 Guest OS,切換到 VMX root operation 模式,恢復 VMM 的運行,這種轉換稱為 VM exit。VMX root operation 模式下軟件的行為與在沒有 VT-x 技術的處理器上的行為基本一致;而 VMX non-root operation 模式則有很大不同,最主要的區(qū)別是此時運行某些指令或遇到某些事件時,發(fā)生 VM exit。例如:在上面的例子中,Guest OS 能夠執(zhí)行修改頁表的匯編指令,再無需 VMM 進行捕獲、模擬。從而減少了相關的性能開銷,也極大簡化了 VMM 設計,進而使 VMM 能夠按通用標準進行編寫,性能更加強大。又因為 VMM 和 Guest OS 共享底層的處理器資源,所以硬件需要一個物理內存區(qū)域來自動保存或恢復彼此執(zhí)行的上下文。這個區(qū)域稱為虛擬機控制塊(VMCS),包括客戶機狀態(tài)區(qū)(Guest State Area),主機狀態(tài)區(qū)(Host State Area)和執(zhí)行控制區(qū)。VM entry 時,硬件自動從客戶機狀態(tài)區(qū)加載 Guest OS 的上下文。并不需要保存 VMM 的上下文,原因與中斷處理程序類似,因為 VMM 如果開始運行,就不會受到 Guest OS的干擾,只有 VMM 將工作徹底處理完畢才可能自行切換到 Guest OS。而 VMM 的下次運行必然是處理一個新的事件,因此每次 VMM entry 時, VMM 都從一個通用事件處理函數(shù)開始執(zhí)行;VM exit 時,硬件自動將 Guest OS 的上下文保存在客戶機狀態(tài)區(qū),從主機狀態(tài)區(qū)中加載 VMM 的通用事件處理函數(shù)的地址,VMM 開始執(zhí)行。而執(zhí)行控制區(qū)存放的則是可以操控 VM entry 和 exit 的標志位,例如標記哪些事件可以導致 VM exit,VM entry 時準備自動給 Guest OS “塞” 入哪種中斷等等。客戶機狀態(tài)區(qū)和主機狀態(tài)區(qū)都應該包含部分物理寄存器的信息,例如控制寄存器 CR0,CR3,CR4;ESP 和 EIP(如果處理器支持 64 位擴展,則為 RSP,RIP);CS,SS,DS,ES,F(xiàn)S,GS 等段寄存器及其描述項;TR,GDTR,IDTR 寄存器;IA32_SYSENTER_CS,IA32_SYSENTER_ESP,IA32_SYSENTER_EIP 和 IA32_PERF_GLOBAL_CTRL 等 MSR 寄存器??蛻魴C狀態(tài)區(qū)并不包括通用寄存器的內容,VMM 自行決定是否在 VM exit 的時候保存它們,從而提高了系統(tǒng)性能??蛻魴C狀態(tài)區(qū)還包括非物理寄存器的內容,比如一個 32 位的 Active State 值表明 Guest OS 執(zhí)行時處理器所處的活躍狀態(tài),如果正常執(zhí)行指令就是處于 Active 狀態(tài),如果觸發(fā)了三重故障(Triple Fault)或其它嚴重錯誤就處于 Shutdown 狀態(tài),等等。執(zhí)行控制區(qū)用于存放可以操控 VM entry 和 VM exit 的標志位,包括:External-interrupt exiting:用于設置是否外部中斷可以觸發(fā) VM exit,而不論 Guest OS 是否屏蔽了中斷。
Interrupt-window exiting:如果設置,當 Guest OS 解除中斷屏蔽時,觸發(fā) VM exit。
Use TPR shadow:通過 CR8 訪問 Task Priority Register(TPR)的時候,使用 VMCS 中的影子 TPR,可以避免觸發(fā) VM exit。同時執(zhí)行控制區(qū)還有一個 TPR 閾值的設置,只有當 Guest OS 設置的 TR 值小于該閾值時,才觸發(fā) VM exit。
CR masks and shadows:每個控制寄存器的每一位都有對應的掩碼,控制 Guest OS 是否可以直接寫相應的位,或是觸發(fā) VM exit。同時 VMCS 中包括影子控制寄存器,Guest OS 讀取控制寄存器時,硬件將影子控制寄存器的值返回給 Guest OS。
Exception bitmap:選擇哪些異常可以觸發(fā) VM exit,
I/O bitmap:對哪些 16 位的 I/O 端口的訪問觸發(fā) VM exit。
MSR bitmaps:與控制寄存器掩碼相似,每個 MSR 寄存器都有一組“讀”的位圖掩碼和一組“寫”的位圖掩碼。
每次發(fā)生 VM exi t時,硬件自動在 VMCS 中存入豐富的信息,方便 VMM 甄別事件的種類和原因。VM entry 時,VMM 可以方便地為 Guest OS 注入事件(中斷和異常),因為 VMCS 中存有 Guest OS 的中斷描述表(IDT)的地址,因此硬件能夠自動地調用 Guest OS 的處理程序。傳統(tǒng)的全虛擬化實現(xiàn)在有了硬件的輔助之后,由于 CPU 引入了新的操作模式,VMM 和 Guest OS 的執(zhí)行由硬件自動隔離開來,任何關鍵的事件都可以將系統(tǒng)控制權自動轉移到 VMM,因此 VMM 能夠完全控制系統(tǒng)的全部資源。Guest OS 也可以運行在它所期望的最高特權級別,因此特權級壓縮和特權級別名的問題迎刃而解,而且 Guest OS 中的系統(tǒng)調用也不會觸發(fā) VM exit。硬件使用物理地址訪問虛擬機控制塊(VMCS),而 VMCS 保存了 VMM 和 Guest OS 各自的 IDTR 和 CR3 寄存器,因此 VMM 可以擁有獨立的地址空間,Guest OS 能夠完全控制自己的地址空間,地址空間壓縮的問題也不存在了。中斷和異常虛擬化的問題也得到了很好的解決。VMM 只用簡單地設置需要轉發(fā)的虛擬中斷或異常,在 VM entry 時,硬件自動調用 Guest OS 的中斷和異常處理程序,大大簡化 VMM 的設計。同時,Guest OS 對中斷的屏蔽及解除可以不觸發(fā) VM exit,從而提高了性能。而且 VMM 還可以設置當 Guest OS 解除中斷屏蔽時觸發(fā) VM exit,因此能夠及時地轉發(fā)積累的虛擬中斷和異常。另外,純軟件實現(xiàn)的 VMM 目前缺少對 64 位客戶操作系統(tǒng)的支持,而 CPU 的虛擬化技術除支持廣泛的傳統(tǒng)操作系統(tǒng)類型之外,還支持 64 位客戶操作系統(tǒng)。硬件輔助虛擬技術提高了虛擬機的性能以及兼容性。需要注意的是,上文中我們提到了全虛擬化、半虛擬化和硬件輔助的全虛擬化,但這種分類實際上并不絕對,一個優(yōu)秀的 VMM 往往融合了多項技術。例如 VMware Workstation 是一個著名的全虛擬化的 VMM,但是它使用了一種被稱為動態(tài)二進制翻譯(Binary Translation)的技術把對特權狀態(tài)的訪問轉換成對影子狀態(tài)的操作,從而避免了低效的 Trap-And-Emulate 的處理方式,這與半虛擬化相似,只不過半虛擬化是靜態(tài)地修改程序代碼。看得出硬件輔助虛擬化技術必然是未來的方向,Intel-VT 的處理器級虛擬化技術還需要進行以下優(yōu)化:提高操作模式間的轉換速度:兩種操作模式間的轉換發(fā)生之如此頻繁,如果不能有效減少其轉換速度,即使充分利用硬件特性,虛擬機的整體性能也會大打折扣。早期的支持硬件輔助虛擬化技術的 Pentium 4 處理器需要花費 2409 個時鐘周期處理 VM entry,花費 508 個時鐘周期處理由缺頁異常觸發(fā)的 VM exit,代價相當高。隨著 Intel 技術的不斷完善,在新的 Core 架構上,相應時間已經(jīng)減少到 937 和 446 個時鐘周期。未來硬件廠商還需要進一步提高模式的轉換速度,并提供更多的硬件特性來減少不必要的轉換。
優(yōu)化翻譯后援緩沖器(TLB)的性能:每次 VM entry 和 VM exit 發(fā)生時,由于需要重新加載 CR3 寄存器,因此 TLB(Translation Lookaside Buffer)被完全清空。虛擬化系統(tǒng)中操作模式的轉換發(fā)生頻率相當高,因此系統(tǒng)的整體性能受到明顯損害。一種可行的方案是為 VMM 和每個虛擬機分配一個全局唯一 ID,TLB 的每一項附加該 ID 信息來索引線性地址的翻譯。
提供內存管理單元(MMU)虛擬化的硬件支持:即使使用 Intel-VT 技術,VMM 還是得用老辦法來處理 Guest OS 中發(fā)生的缺頁異常以及Guest OS 的客戶機物理地址到主機物理地址的翻譯,本質原因是 VMM 完全控制主機物理內存,因此 Guest OS 中的線性地址的翻譯同時牽涉到 VMM 和 Guest OS 的地址空間,而硬件只能看到其中的一個。Intel 和 AMD 提出了各自的解決方案,分別叫做 EPT(Extended Page Table)和 Nested Paging。這兩種技術的基本思想是,無論何時遇到客戶機物理地址,硬件自動搜索 VMM 提供的關于該 Guest OS 的一個頁表,翻譯成主機物理地址,或產(chǎn)生缺頁異常來觸發(fā) VM exit。
支持高效的 I/O 虛擬化:I/O 虛擬化需要考慮性能、可用性、可擴展性、可靠性和成本等多種因素。最簡單的方式是 VMM 為虛擬機模擬一個常見的 I/O 設備,該設備的功能由 VMM 用軟件或復用主機 I/O 設備的方法實現(xiàn)。例如 Virtual PC 虛擬機提供的是一種比較古老的 S3 Trio64顯卡。這種方式提高了兼容性,并充分利用 Guest OS 自帶的設備驅動程序,但是虛擬的 I/O 設備功能有限且性能低下。為了提高性能,VMM 可以直接將主機 I/O 設備分配給虛擬機,這會帶來兩個主要挑戰(zhàn):1. 如果多個虛擬機可以復用同一個設備,VMM 必須保證它們對設備的訪問不會互相干擾。2. 如果 Guest OS 使用 DMA 的方式訪問 I/O 設備,由于 Guest OS 給出的地址并不是主機物理地址,VMM 必須保證在啟動 DMA 操作前將該地址正確轉換。Intel 和 AMD 分別提出了各自的解決方案,分別稱為 Direct I/O(VT-d)和 IOMMU,希望用硬件的手段解決這些問題,降低 VMM 實現(xiàn)的難度。
2004 年,微軟發(fā)布 Virtual Server 2005 計劃,象征著虛擬化技術正式進入主流市場。2005 年,OpenVZ 發(fā)布,這是 Linux 操作系統(tǒng)的容器化技術實現(xiàn),同時也是 LXC 的核心實現(xiàn)。2006 年,Intel 和 AMD 等廠商相繼將對虛擬化技術的支持加入到 x86 體系結構的中央處理器中(AMD-V,Intel VT-x),使原來純軟件實現(xiàn)的各項功能可以用借助硬件的力量實現(xiàn)提速。同年,紅帽將 Xen 作為 RHEL 的默認特性。同年,Amazon Web Services(AWS)開始以 Web 服務的形式向企業(yè)提供 IT 基礎設施服務,現(xiàn)在通常稱為云計算。2007 年 1 月,Sun 公司發(fā)布了開源虛擬化軟件 VirtualBox。同年 Xen 被 Citrix(思杰)收購。2007 年 2 月,Linux Kernel 2.6.20 合入了由以色列公司 Qumranet 開發(fā)的虛擬化內核模塊 KVM(Kernel-based Virtual Machine,基于內核的虛擬機),支持 KVM 的前提是 CPU 必須要支持虛擬化技術。2008 年第一季度,微軟同時發(fā)布了 Windows Server 2008 R2 及虛擬化產(chǎn)品 Hyper-V。2008 年 6 月,Linux Container(LXC) 發(fā)布 0.1.0 版本,其可以提供輕量級的虛擬化,用來隔離進程和資源。是 Docker 最初使用的容器技術支撐。2008 年 9 月 4 日,Red Hat 收購以色列公司 Qumranet,并著手使用 KVM 替換在 Red Hat 中的使用的 Xen。2009 年 9 月,紅帽發(fā)布 RHEL 5.4,在原先的 Xen 虛擬化機制之上,將 KVM 添加了進來。同年,阿里云寫下第一行代碼。2010年11月,紅帽發(fā)布 RHEL 6.0,這個版本將默認安裝的 Xen 虛擬化機制徹底去除,僅提供 KVM 虛擬化機制。當年,Xen 雖然作為一項廣泛應用于 Linux 發(fā)行版中的虛擬化技術,但卻遲遲沒有集成到 Linux 內核中,紅帽也許是出于對這種脫離內核的維護方式感到不爽,加之當時思杰和微軟表現(xiàn)的很非常親密,導致紅帽萌生了放棄 Xen 的想法,并在正式采用 KVM 的一年后,就宣布徹底放棄 Xen。硬件輔助虛擬化的到來,Xen 引以為傲的半虛擬化技術也隨之在主流 Linux 發(fā)行廠商中衰落了。2010 年 10 月 21 日,NASA 發(fā)布了可以 IaaS(基礎設施即服務)云操作系統(tǒng) OpenStack,第一個版本便是眾所周知 Austin(奧斯?。?。OpenStack 挽手自主可控的口號,推動了云計算在國內的全面爆發(fā)。2011 年初,IBM 找上老搭檔紅帽,表示 KVM 這個東西值得加大力度去做。于是到了 5 月,IBM 和紅帽,聯(lián)合惠普和英特爾一起,成立了開放虛擬化聯(lián)盟(Open Virtualization Alliance),加速 KVM 投入市場的速度,由此避免 VMware 一家獨大的情況出現(xiàn)。聯(lián)盟成立之時,紅帽的發(fā)言人表示:“大家都希望除 VMware 之外還有一種開源選擇。未來的云基礎設施一定會基于開源。我們想要營造一個小廠商們可以輕松加入的生態(tài)環(huán)境。”ps:現(xiàn)在回頭再看,企業(yè)之所以能夠長盛不衰,長遠的洞察力至關重要。
2013 年 3 月 15 日,在加利福尼亞州圣克拉拉召開的 Python 開發(fā)者大會上,DotCloud 的創(chuàng)始人兼首席執(zhí)行官 Solomon Hvkes 在一場僅五分鐘的微型演講中,首次提出了 Docker 這一概念,并于會后將其源碼開源并托管到 Github。最初的 Docker 就是使用了 LXC 再封裝了其他的一些功能??梢钥闯?,Docker 的成功,與其說是技術的創(chuàng)新,還不如說是一次組合式的創(chuàng)新。2014 年 6 月,Docker 發(fā)布了第一個正式版本 v1.0。同年,Redhat 和 AWS 就宣布了為 Docker 提供官方支持。在傳統(tǒng)操作系統(tǒng)中,所有用戶的進程本質上是在同一個操作系統(tǒng)的實例中運行,因此內核或應用程序的缺陷可能影響到其它進程。操作系統(tǒng)虛擬化(OS-level virtualization) 是一種在服務器操作系統(tǒng)中使用的、沒有 VMM 層的輕量級虛擬化技術,內核通過創(chuàng)建多個虛擬的操作系統(tǒng)實例(內核和庫)來隔離不同的進程(容器),不同實例中的進程完全不了解對方的存在。操作系統(tǒng)虛擬化看似與上述提到過的幾種硬件虛擬化方式一樣,都是產(chǎn)生多個操作系統(tǒng),但操作系統(tǒng)虛擬化與硬件虛擬化之間還是有很多不同之處,其中最核心的區(qū)別就是:操作系統(tǒng)虛擬化是操作系統(tǒng)的虛擬化,而硬件虛擬化是計算機的虛擬化。前者隔離操作系統(tǒng)資源,而后者隔離計算機硬件資源。ps:容器技術之所以火熱,是因為容器隔離性封裝的特性,為運維能力引入了 “可編程性”,開發(fā)人員借助容器得以 Software Define Operation。2015 年 7 月 21 日:Kubernetes v1.0 發(fā)布!進入云原生時代。2018 年,IBM 正式收購 Redhat 以彌補在云計算市場的戰(zhàn)略失敗。同年,微軟收購 Github。開源的歷史會銘記這一天。2019 年,全球最大的開源盛會 KubeCon + CloudNativeCon + Open Source Summit、Open Infrastructure Summit 相繼在上海舉辦。中國的開源會銘記這一天。對于篇幅較長的文章,我都習慣使用三句話來進行總結:虛擬化的發(fā)展:縱觀虛擬化技術的發(fā)展歷史,可以看到它始終如一的目標就是實現(xiàn)對 IT 資源的充分利用。
虛擬化與云計算:虛擬化是 IT 資源的抽象,云計算則是基于虛擬化實現(xiàn)的更上層的對企業(yè)業(yè)務能力的抽象。
云計算與開源:開源是引誘開發(fā)者的蘋果,而開發(fā)者則是企業(yè)的核心資產(chǎn)。云的世界,得開發(fā)者,得天下。
https://www.ibm.com/developerworks/cn/linux/l-cn-vt/index.html作者:范桂颶,九州云(99Cloud)OpenStack 研發(fā)工程師,曾先后服務于 Windows Azure、Redhat OpenStack 與 Prophetech HyperMotion。云物互聯(lián)公號主,現(xiàn)專注于探索云計算、邊緣計算、SDN 與物聯(lián)網(wǎng)的深度結合應用場景。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。