之所以使用虛擬機,其出發點是我們可以利用虛機將一臺大的伺服器隔離成多個小的虛機,每個虛機跑獨立的應用,這樣便於我們管理;舉個例子,假設沒有虛擬機,我們將多個應用跑在一臺伺服器上,多個應用間很有可能會出現埠衝突,或者多個應用使用同一個軟體的版本不一樣(例如使用不同版本的Python,JDK版本不一樣等等),即在一臺機器上運行多個應用可能產生衝突,所以可以考慮將一臺伺服器隔離成多個資源隔離的虛擬機,應用跑在每個獨立的虛機裡面,例如一個虛擬機只跑一個應用,而另一個虛機跑另一個應用。 這樣就避免了應用之間的衝突。此外某些應用可能存在不易察覺的BUG,例如在特定的場景下觸發後會瘋狂的喫內存。如果多個應用運行在一臺物理伺服器上的話,一個應用的BUG會影響其他的應用和服務的運行。而此時既然我們有虛機了,就沒有必要在一臺大的物理伺服器上跑多個應用,此時就可以將大的硬體伺服器隔成多個小的虛機,在每個小的虛機裏運行不同的單一的應用,避免相互之間的幹擾和衝突。如圖所示:

圖中底層是一臺大的物理伺服器,在伺服器之上使用虛擬化技術。

但是經過一段時間的使用,人們逐漸意識到這種應用場景存在有一個很嚴重的問題:虛擬機佔用的資源過多,導致伺服器資源利用率低。

虛機裏都要跑一個Gust OS,例如跑一個Windows的虛機或者Ubuntu的虛機就是在虛機裡面起一個操作系統且這個操作系統跟宿主機的操作系統通常不一樣(當然也可以一樣)。例如我一臺硬體伺服器上首先安裝redhat的操作系統,且使用KVM或XEN做了虛擬化,在其之上虛擬出多個虛機出來。之後要做的事情就是在每個虛擬機裡面運行我們的應用服務。但是後來人們逐漸發現一個問題,就是這個宿主機的Guest OS即宿主機的Gust操作系統 ,佔用資源太多。每個虛機裏跑的應用佔用的資源本身並不多,大量的資源被Guest OS即虛機裡面跑的操作系統佔用了。例如我只需要在虛擬機裏跑一個小的服務,服務本身也就需要幾十M,最多幾百兆的內存,但是需要為他啟一個Windows的虛機,而Windows一啟動就是一大坨,只要Windows一啟動那至少1、2個G的內存就沒了。原本想要的是把伺服器隔得越小,靈活性越好,可管理性越好,避免服務之間的幹擾。但事實是,我隔得越小導致我浪費的資源越多。 因為隔得越小我需要跑的Guest OS就越多,資源浪費也就越多。

然而,仔細想一想我們為什麼要使用操作系統呢?操作系統主要乾的事情是管理計算、存儲、網路等等這樣一些硬體設備 ,並且能在裡面調度進程。實現一些具體的應用。然而操作系統乾的事情,跟我們之前的需求:利用虛擬化將一個物理伺服器隔離成多個資源之間彼此隔離的虛擬機,將應用放在一個個小的虛擬機環境裡面去運行,應用之間相互之間不影響可以很靈活的調度資源。所以我們想要的理想的情況就是:我們可以隨時創建一個小格出來(前面就是指虛機),且隨時可以銷毀釋放資源,且各個小格子之間還有隔離型,互相之間不影響。虛機之所以被廣泛應用就是因為虛機可以滿足這樣的需求,而不是因為虛機可以模擬一個完整的機器。這裡就引出一個對虛擬機的反思,我們使用軟體完全實現一個物理世界的硬體環境,有沒有太大的必要 ? 之前曾提到過,為甚麼要模擬一個真實存在的IO設備呢,你的真正目的是為了實現IO,實現輸入輸出。如果我們純粹為虛擬化設計一個虛擬的IO設備行不行呢?當然是可以的,我們只需要將操作系統的驅動改成虛機化的IO的驅動就可以了。其實我們要的並不是實現一個完整的把所有物理的硬體都模擬一遍的虛擬伺服器,而是一個相對完整的操作系統環境

舉個例子,假如一個小格裡面只跑一個Hadoop的DataNode那我有沒有必要再給這個東西接個顯示器?你接個顯示器幹嘛呢??桌面虛擬化可能需要接顯示器,但是DataNode接個顯示器你能看什麼?完全沒有必要。這樣就少了一個外部設備。還有一些其他的諸如此類的考慮。最後你就會發現其實我們要的只是一個相對完整的操作系統的環境,而不是一個完完全全的跟物理伺服器一樣的包括所有物理硬體的模擬的環境 。既然我們只需要一個相對完整的操作系統的環境 ,那能不能直接利用在物理硬體上跑的那個操作系統(我們稱之為Host OS)來支持呢?即因為我們只需要一個相對完整的操作系統,那我們能否直接虛擬操作系統,不需要虛擬那些物理的硬體。最後,總結一下就是兩個問題:

  1. 資源的隔離,使得應用之間對資源的使用相互之間不幹擾。
  2. 提供一個相對完整的操作系統的環境,而不是一個完整的模擬的硬體環境。

此時人們就在想,能不能直接使用Host OS,來模擬一個相對完整的操作系統,而不需要再在Host OS上跑Guest OS,於是就發展出來了操作系統級的虛擬化技術,就是利用操作系統本身的功能來實現虛擬化,這就是Container技術 。Container技術其實也是一條完整的線,經過了很長時間的發展,到今天他跟虛擬機的HyperVisor之間的發展也是錯綜複雜的一個關係,並不是說Container技術出現了HyperVisor技術就利用起來了 ,Container很早就出現了,HyperVisor也一直在發展。目前提及Container大多指的就是 Docker,畢竟太火了沒辦法。下篇文章將介紹Container技術。


推薦閱讀:
相關文章