虛擬化與容器

虛擬化(virtualization)

想像你有一台強大的實體電腦,卻希望它能表現得像好幾台獨立的電腦——一台跑 Windows、一台跑 Linux、一台保持乾淨拿來測試——而每一台都以為整台機器歸自己獨享。虛擬化(virtualization)就是讓這件事成真的把戲:一層薄薄的軟體在真實機器之上,畫出一整台電腦(或一個隔離環境)的逼真假象,讓多個客體(guest)能安全地共用同一台主機(host),又互不干擾。它是雲端運算的基礎——資料中心裡一台大伺服器被切成許多台出租的虛擬電腦。

核心概念是「呈現一個硬體(或作業系統環境)的軟體假象」,並讓每個假象彼此隔離。每個客體看到的彷彿是自己的 CPU、自己的記憶體、自己的磁碟與網卡;在底下,一個控制程式默默地把這些虛擬資源對應到真正共用的資源上,並攔截客體想做的任何危險動作。因為假象夠忠實,為真實機器寫的軟體通常不必修改就能在假象裡執行。它大致分兩種:完整的機器虛擬化,每個客體在虛擬硬體上跑一整套作業系統;以及較輕量的作業系統層級虛擬化,客體(稱為容器,container)共用一個核心,但各自取得隔離、互不相見的視角。

虛擬化之所以重要,是因為它把硬體變成有彈性、可替換的東西。你可以在一台機器上跑許多工作負載(提高使用率、降低成本)、在數秒內為整台機器拍快照或複製、把執行中的系統從一台伺服器搬到另一台,並把不可信的程式關進它自己的沙盒。誠實的取捨是額外負擔(overhead):每一層假象都要付出一些效能與記憶體成本,而隔離的強度只取決於負責執行隔離的那一層——那一層若有瑕疵,就可能讓某個客體伸進另一個客體。

一家雲端供應商買進一台 64 核、512 GB 記憶體的伺服器。透過虛擬化,它把這一台機器以四十台小型虛擬電腦的形式租給四十個不同的客戶,每一台都彼此隔離,每一台都以為自己獨佔一台屬於自己的機器。

一台實體機器,許多台隔離的虛擬機器——這就是雲端最基本的樣貌。

虛擬化不等同於一般的模擬(emulation):模擬可以(緩慢地)仿真完全不同類型的硬體,而機器虛擬化通常讓客體跑在與主機相同類型的 CPU 上,並讓大多數指令直接執行,以求速度。

又称
machine virtualization