客體與主機(guest and host)
這兩個詞指的是一套虛擬化架構的兩邊,一旦把它們弄清楚,其餘幾乎一切都會各就各位。主機(host)是那台真實的、實體的電腦,以及真正擁有它的軟體——實際的晶片,加上超管理器(在托管式架構中還包括主機作業系統)。客體(guest)是跑在裡頭的虛擬機:那台假電腦、它的作業系統,以及那個泡泡裡的一切。主機是房東;客體是房客。
要體會的關鍵是這份不對稱。主機能看見客體的記憶體、暫停客體、為它快照、限制它的速度、或殺掉它——主機掌握控制權。客體照設計是看不出去的:它相信自己的虛擬硬體就是整個世界,最理想的情況是它根本不知道自己被虛擬化了。我們甚至用方向來命名事物:客體實體記憶體(guest-physical)是客體以為的自己的實體 RAM,主機實體記憶體(host-physical)是真正的 RAM;客體增益工具(guest additions / guest tools)是你裝在客體「裡面」、讓它更好地與主機配合的輔助軟體。任何「主機端」的東西都活在控制層裡;任何「客體端」的東西都活在泡泡裡。
容易讓人絆倒的地方:「主機」與「客體」是角色,不是固定的機器。你可以巢狀虛擬化——在一個客體裡跑一個超管理器,再在那之中托管更多客體——所以同一個作業系統,對上一層而言是客體,對下一層而言是主機。此外,在作業系統層級虛擬化(容器)中這兩個詞略有偏移:「主機」是那唯一共用的核心,容器是被隔離的工作負載,而根本沒有獨立的客體核心。在推理「誰是主機」之前,永遠先問清楚你談的是哪一種虛擬化。
在一台跑 macOS 的筆電上,你打開 VirtualBox 並啟動一台 Ubuntu 虛擬機。這裡主機是 macOS 加上筆電硬體;客體是視窗裡的 Ubuntu。Ubuntu 的「實體記憶體」其實是 macOS 撥給它的一塊記憶體。
macOS 是主機;那台 Ubuntu 虛擬機是住在它裡面的客體。
主機與客體是相對於某一層的角色,不是永久的標籤。在巢狀虛擬化下,同一個作業系統可以同時是上層的客體與下層的主機。