機器虛擬化(machine virtualization)
想像你只有一台實體電腦,卻想在上面同時跑好幾台完全獨立的電腦——一台跑 Linux,一台跑 Windows,還有一台你可以隨意弄當機、重開機而不會干擾到其他台。機器虛擬化就是讓「一台真機器假裝成很多台」的把戲。每一台假機器都相信自己擁有獨立的 CPU、獨立的記憶體、獨立的磁碟與網路卡,並且從頭跑起自己的作業系統——然而它們底下其實共用同一套實體硬體。
它的運作方式是:一層薄薄的軟體坐在真實硬體與這些假電腦之間。這一層分給每台假機器一片真 CPU 的時間、一塊被打扮成「整台小電腦的全部記憶體」的真實記憶體區域,以及磁碟與網路的軟體替身。當某台假機器試圖做只有真硬體才能做的事(例如跟磁碟控制器對話),底下那一層就攔截它,悄悄地代它去做真正的工作。假機器永遠不會察覺自己是在共用。
這件事之所以重要,是因為它把一台昂貴的伺服器變成一個有彈性、可供多位租戶切分的資源池,這正是雲端運算的基礎——當你在雲端租一台伺服器時,你幾乎總是租到的是共用硬體上的一台虛擬機。它也提供了強隔離(一台虛擬機當機或被入侵,不會直接拖垮它的鄰居),以及把整台執行中的電腦像檔案一樣快照、複製或搬移的自由。誠實的代價是額外負擔:每一次被攔截的硬體操作都要多花 CPU 時間,所以虛擬機永遠至少比直接跑在裸機上慢那麼一點點。
一台擁有 64 GiB 記憶體與 16 個 CPU 核心的實體伺服器,托管八台虛擬機,每台都被告知自己有 8 GiB 與 2 個核心。每台啟動自己的 Linux 核心;主機把記憶體加總到 64 GiB,但對核心採取超額配置,賭的是這八台不會同時衝到尖峰。
一台真機器被切成八台虛擬機,每台跑自己的作業系統。
機器虛擬化給每個客體自己的核心與一整套假硬體——這是重量級的那一種。容器(作業系統層級虛擬化)是另一個不同、更輕量的概念,它共用同一個核心;別把兩者混為一談。