虛擬機器(virtual machine)
虛擬機器(virtual machine)是一台只以軟體形式存在的完整電腦。把它想成飛行模擬器:它有座艙、儀表與操縱桿,行為忠實到飛行員可以彷彿真的在開飛機般受訓——但這一切其實是在地面上跑的軟體。虛擬機器就是這個概念,只不過對象是電腦:它向一套客體作業系統呈現虛擬的 CPU、虛擬記憶體、虛擬磁碟與虛擬網卡,客體就在裡面安裝並開機,跟在實體機器上一模一樣,從不知道自己不是真正的金屬機器。
具體而言,虛擬機器由超管理器(hypervisor)建立並監督。超管理器分給虛擬機器一段真實的 CPU 時間、一塊呈現得彷彿從位址零開始的真實記憶體,以及磁碟上一個被客體當成整顆硬碟看待的檔案。當客體想做特權動作——例如重新設定中斷控制器——超管理器會攔截下來,要不替客體執行該動作,要不偽造一個合理的結果,讓客體乖乖待在沙盒裡。從客體看來這是一台正常的機器;從主機看來,一台虛擬機器不過是一個被管理的大型行程,加上一個磁碟映像檔。
虛擬機器之所以重要,是因為整台機器變成可移動、可複製的物件。你可以暫停一台虛擬機器、為它的確切狀態拍快照、複製它、運送到另一台伺服器,或在一次糟糕的更新後回滾——這些都是實體電腦做不到的。代價是實在的:虛擬機器在記憶體裡背負一整套客體作業系統,又多了一層間接,所以比容器更笨重、啟動更慢。好處是隔離性強,因為每台虛擬機器跑自己的核心,而不是共用主機的核心。
一位開發者的筆電跑 Windows,但需要在 Linux 上測試程式。他在一個視窗裡啟動一台 Linux 虛擬機器:它開機載入自己的 Linux 核心、有自己的桌面,開發者可以把它弄當機、重設回某個快照、再試一次,全程完全不動到主機的 Windows。
一整台 Linux 電腦,跑在 Windows 主機的一個視窗裡。
虛擬機器跑一整套帶有自己核心的客體作業系統,這正是它隔離卻也笨重的原因;這是它與容器的關鍵對比——容器共用主機核心,輕巧得多,但隔離較弱。