1. 程式人生 > >linux虛擬化簡介

linux虛擬化簡介

為跨平臺而生

  在計算機發展的早期,各類計算平臺、計算裝置所提供的介面、呼叫方式紛繁複雜,沒有像今天這樣相對統一的標準。由於需要適配不同的平臺,需要寫很多繁瑣的相容程式碼,這無形中給開發者帶來了很大的不便。甚至,這種混亂出現在 IBM 這一家公司下不同機型的機器上,所以 IBM 的工程師們創造了虛擬化技術,用來幫助程式快速適配不同平臺的物理機器。

  我們知道程式對計算機資源的呼叫主要依賴於作業系統所給出的介面。我們的程式通過作業系統提供的介面,向物理硬體傳送指令。

  所以,要實現程式跨平臺相容的方法其實很簡單,只要作業系統或者物理硬體所提供的介面呼叫方式一致,程式便不需要相容不同硬體平臺的介面,而只需要針對這一套統一的介面開發即可。虛擬化技術正是通過其本身適配不同平臺的硬體,而加以抽象成統一的介面,來實現程式跨平臺執行這一目的的。

  時至今日,我們之所以關注和使用虛擬化技術,實現跨平臺執行應用程式依然是很大一部分的原因。

 

虛擬化的定義

  虛擬化技術是一種將計算機物理資源進行抽象、轉換為虛擬的計算機資源提供給程式使用的技術。這裡所指的計算機資源,就包括了 CPU 提供的運算控制資源,硬碟提供的資料儲存資源,網絡卡提供的網路傳輸資源等。

 

將虛擬化用於資源管理

  在虛擬化技術的發展過程中,人們逐漸發現了虛擬化的另一大用途,也就是將之應用於計算機資源的管理。

  將虛擬化用於資源管理不難理解,因為虛擬化技術本身就是抽象計算機的物理資源進而加工成為提供統一呼叫介面的虛擬資源,很顯然在我們虛擬化硬體資源的時候很容易在其中做一些‘手腳’,來告訴應用程式一些虛假的資源資料。例如,我們只要告訴程式計算機只有 4GB 記憶體,那麼不管真實的物理機是 8GB、16GB 還是 32GB,應用程式都會按照 4GB 這個虛假的值來處理它的邏輯。

  通過虛擬化技術來管理計算機資源的方式,不但讓我們對計算機資源的控制變得更加靈活,也大幅提高了計算機資源的使用率。注意這裡提高的是資源的使用率而不是效率。

  其實將虛擬化用於資源管理還有很多優勢,例如我們想要在同一臺機器上執行nginx和tomcat,很顯然這兩個應用程式都需要監聽80埠,如果不使用虛擬化,很顯然一臺物理機無法同時提供兩個80埠。再比如同一臺機器上執行的多個應用程式需要使用同一個工具庫的不同版本,程式本身限制了同時開啟的程序數等,這些都是物理機無法同時提供的資源。然而,虛擬化技術通過資源隔離的方式,無形地把這些程式隔離在不同的虛擬環境中,既然虛擬環境不同,自然執行在不同環境中的程式就不會互相干擾或爭搶資源了。

 

虛擬化的分類

  從虛擬化實現的角度可以大致將虛擬化分為硬體虛擬化和軟體虛擬化,從架構角度又可以將虛擬化分為裸金屬架構和寄居架構,分類的方式多種多樣,在這篇文章中我們主要介紹硬體虛擬化、軟體虛擬化、裸金屬架構虛擬化和寄居架構的虛擬化。

  硬體虛擬化是指物理硬體本身提供虛擬化的支援,舉個例子來說,某個平臺的CPU可以將另外一個平臺的指令轉換成自己平臺的指令並執行,且給應用程式一種完全執行在那個平臺上的感覺;再如,CPU 能夠自身模擬裂變,讓程式或者作業系統認為存在多個 CPU,進而能夠同時執行多個程式或者作業系統。

  軟體虛擬化顧名思義是通過軟體的方式將硬體資源虛擬化成虛擬的資源,其本質是通過一層夾在應用程式和硬體平臺之間的軟體層來實現指令的轉換。依然用 CPU 的例子來說,在軟體虛擬化實現中,通過一層夾雜在應用程式和硬體平臺上的虛擬化實現軟體來進行指令的轉換。也就是說,雖然應用程式向作業系統或者物理硬體發出的指令不是當前硬體平臺所支援的指令,這個實現虛擬化的軟體也會將之轉換為當前硬體平臺所能識別的。

 

虛擬機器

  在虛擬化的實現中,我們不得不提的就是虛擬機器,所謂虛擬機器就是通過在應用程式和作業系統之間(寄居架構)或者作業系統與硬體資源之間(裸金屬架構)增加了一層用於指令轉換的虛擬機器監視器以此來實現虛擬化,我們通常稱虛擬機器監視器為Hypervisor。

  從我們習慣用來搭建虛擬作業系統環境的 VMware Workstation、Xen 等軟體,到 Java 虛擬機器 JVM,PHP 虛擬機器 HHVM 等等,虛擬機器都活躍在我們程式開發到程式執行的過程中。大家會很驚奇的發現原來 JVM、HHVM 等特定語言執行環境中的核心部分,也是虛擬化的一種實實在在的實現。沒錯,只要大家仔細分析和思考一下就會發現,它們正是基於虛擬化的思想來實現的。它們通過隔離程式和作業系統,將程式的指令轉換為當前所在作業系統平臺所能執行的指令,達到了不用對程式進行任何修改即可執行的目的。也正是這個原因,這些語言的程式都具有非常強的跨平臺性。

  虛擬機器看似實現了虛擬化,可以是的應用程式跨平臺執行,那麼虛擬機器有什麼缺點嗎?

  很顯然虛擬機器在執行應用程式的時候都需要經過虛擬機器監視器處理才能執行,這無疑會帶來效率問題,瞭解決這個問題,真實的虛擬機器程式常常不完全遵循 Hypervisor 的設計結構,而是引入一些其他技術來解決效率問題。

  例如,在 VMware Workstation、Xen 中我們能夠看到硬體輔助虛擬化的使用,通過讓指令直達支援虛擬化的硬體,以此避開了效率低下的 Hypervisor。而如 JRE、HPHP 中,除了基於 Hypervisor 實現的解釋執行機制外,還有即時編譯 ( Just In Time ) 執行機制,讓程式程式碼在執行前編譯成符合當前硬體平臺的機器碼,這種方式就已經不屬於虛擬化的範疇了。

 

關於容器

  容器是我們真正要學習的內容,虛擬化只是基礎,關於容器,我將在以後的文章中重點介