在傳統的 Server 主機在安裝完一種作業系統 (Windows , Linux …) ,就只能提供該作業系統所能提供的服務,我們無法在同一主機上同時提供 Windows 的服務又同時提供 Linux 的服務,或者其他作業系統的服務.
也因此只安裝單一作業系統的伺服器主機其使用率其實是很低的,可能只有在某一單一時間會有較高的使用率.大多的時間都是閒置的,如果我們可已將多台主機單移轉到單一主機上,並且還可以同時提供不同的作業系統服務,以提高伺服器的使用率,並且可以減少伺服器的使用數量.
也因此虛擬化由此誕生.而虛擬化的目的就是為了要讓多個平台的作業系統同時運作在同一台主機上.
依據虛擬化的演進可以區分成為下面這幾種.
-
Emulation 虛擬出來一個與現行完全不同的硬體環境.
-
Full Virtualization 使用的是 – Binary Translation.
-
另一種需要修改作業系統的核心才能支援 – Paravirtualization
-
Hardware-assisted virtualization 這也是最新的方式需要有硬體(CPU) 的支援 – Intel VT 或者 AMD-V.
-
Application-Level Virtualization 可直接用於原作業系統上 ,不需要 VT 或是額外的硬體來支援.
-
Continaer 提供類似於作業系統層級的虛擬化 OS-Level Virtualization.
了解上面的虛擬化種類,可以幫我們找出不同虛擬化產品的市場定位.
目前虛擬化的產品基本上可以區分為兩大類,第一類是企業用全虛擬化環境 如 Full Virtualization 或是 Paravirtualization 這一類,這一類的有 VMware ESX 或是 XenServer.至於另外一類為 Application-Level Virtualization ,適用於學生或是其他非以效能為優先考量的工作環境,轉言之就是可以在原先的 Windows 系統下使用 Linux 或是其他非 Windows 系統,這一類比較具代表性的像是 VMware Server 等的產品.
在還未解說虛擬化之前先簡單講解,與虛擬化相關的軟硬體名詞,解釋一個東西就是 環 (Ring) 與 VMM (Virtual Machine Monitor)
- Ring
在 Intel x86 系統架構下為了保護指令的運行,提供了 4 種不同 Privilege 特權級別的指令.也就是俗稱的 Ring,可以區分成為 Ring 0,Ring 1,Ring 2 和 Ring 3.Ring 0 擁有最高的權限,通常是由系統核心才會有 Ring0 的權限,Ring 0 可以直接和硬體溝通讀取 IO,CPU,Memory 與周邊裝置.其次是 Ring 1,以此類推.一般 Kernel,driver 會存在 Ring 0.一般 AP 存在 Ring 3,一般的作業系統也只運用到 Ring 0 和 Ring3.採取這種方式的優點是一般運行的程式沒有辦法直接與硬體溝通,所以不會有像 Window 3.1 時一樣的狀況發生,一個程式就能把整個系統摧毀(Crash)掉. - VMM(Virtual Machine Monitor)
一個機台要能同時執行很多作業系統時不能像是傳統的方式讓 OS 的核心存放在 Ring0.取而代之的就是 VMM((Virtual Machine Monitor) 也可以稱作 Hybervisor.也為了虛擬化的資源分配管理,所以必須有一個東西來管理所有虛擬化的作業系統(Guest OS).也就是所謂的 VMM(Virtual Machine Monitor). 此時的 VMM 主要工作為- 模擬出一個完整的硬體環境給每一個 Guest OS
- 分配硬體支援給每一個 Guest OS
- 每一個 Guest OS 都是獨立出來不會被彼此影響的
關於更多有關於 Ring 與 VMM 請自行參考 Virtualization CPU – https://benjr.tw/3407
-
Emulation
這一類的虛擬化,比較像是藉由應用程式虛擬出來一個與現行完全不同的硬體環境.像是一些可以在 PC 環境上模擬出來的遊戲機之類的,或是透過虛擬的硬體環境去模擬 smart phones 以及 PDAs .可以提供給程式開發者在 PC 的環境下開發出 smart phones 或是 PDAs 的應用程式.
-
Full Virtualization 使用的是 – Binary Translation
也正因為 Intel CPU 架構的關係,不少的 CPU 指令必須執行在 Ring 0 底下,而傳統的作業系統核心也必須放在 Ring 0 讓他們能直接存取硬體.所以一開始的虛擬化幾乎不能在 X86的系統上使用.但是 VMware 使用了一種方式讓虛擬化能夠執行在 X86 的系統上.他們使用一種稱為 Binary Translation 加上 direct execution 的方式,所謂的 Binary translation 就是將原本要執行不能虛擬化的指令(nonvirtualizable instructions)VMM 會轉換成另一種語法,然後再交由 VMM 去執行.就像是 Guest OS 要將資料寫入硬碟中,但是其實 Guest OS 的硬碟可能只是硬碟中的一塊磁碟區塊(partition)或是檔案(Loop file),所以 VMM 會把他的請求轉換成另一種方式再來向硬體提出要求.而不再是用原本的指令去執行了.至於 direct execution 是一般性的指令不需要在 Ring0 才能執行就直接可以向硬體提出請求.
這樣的缺點是會造成效率的低落,但好處是虛擬出來的作業系統(Guest OS)並不知道有 VMM 的存在,他會以為自己擁有整個機器,而且虛擬出來的作業系統(Guest OS)也不需要修改核心去配合 VMM.加上 VMM 會管控整個主機包括了虛擬化的 BIOS,devices 和 memory,而且每一個虛擬出來的作業系統(Guest OS)都是獨立而且安全性高不會受到其他虛擬出來的作業系統(Guest OS)影響.
目前採用這種方式的有 IBM System/370, VirtualBox, VMware Workstation (32-bit guests)以及 Microsoft Virtual PC.
-
另一種需要修改作業系統的核心才能支援 – Paravirtualization
剛才有說明為什麼在一般 x86 系統下沒有辦法做虛擬化,大部分的原因是不能虛擬化的指令(nonvirtualizable instructions)必須直接在 Ring 0 執行.但是 Paravirtualization 使用了另一種方式,修改虛擬化作業系統(Guest OS)的核心,讓虛擬的作業系統(Guest OS)可以直接將不能虛擬化的指令(nonvirtualizable instructions)自動轉換成 VMM 可以執行的指令(hypercall),再由 VMM 去向硬體提出請求.目前像是 Linux 或是 FreeBSD 都可以透過修改核心去支援這項技術但是像是 Windows 的系統不能去修改它的核心(Microsoft 也不願意讓別人來修改它的核心),所以無緣使用 Paravirtualization.而所謂的 hypercall 就像是 OS kernel 的 syscall 只不過 hypercall 是針對 hypvisor(VMM)的.
目前採用這種方式的有 XenSource 以及 GNU/Linux distributors(RHEL 5 和 SLES10 以上的版本).
-
Hardware-assisted virtualization 這也是最新的方式需要有硬體(CPU) 的支援 – Intel VT 或者 AMD-V
在沒有 VT 的時代 VMM 是直接載入在 Ring 0 裡面,Dom0 的 kernel 則是被放在 Ring1(Dom0 是第一個在 Xen 底下運行的虛擬機器).後來產生出的 DomU 也是存放在 Ring1(需為 Para-Virtualized,沒有 VT 的支援 Xen 不支援 full-Virtualized).不過一般的 AP 還是運行在 Ring 3.也正因為如此 Para-Mode 的 Guest OS 必須知道 VMM 的存在.此時是不支援 Full-Mode 的.
後來有了 VT 這一項技術.VMM 和 Guest OS(Para/Full-Mode)都可以直接執行在 Ring0 運行.不過 VMM 是存在比 Guest OS 還要低的一層.Root Mode Privilege Levels.不能虛擬化的指令 (nonvirtualizable instructions)會自動被 hypervisor 截取不需要再經過 binary translation 或 paravirtualization 的模式轉換.
目前 Intel 推出含有 VT 的技術包括了下面幾項.
VT-x 這是屬於 IA-32 和 Intel 64 架構的
VT-i 這是屬於 Itanium 架構的
VT-d refers to Intel VT for Directed I/O
目前 Intel 推出的 CPU 並未包過下面這項,這是未來 Intel 將計畫推出的.
VT-c refers to Intel VT for ConnectivityHardware-assisted virtualization 在不同的平台上有著不同的名稱,比如你在 Xen 這種技術被稱為 hardware virtual machine (HVM), Virtual Iron 稱他為 native virtualization.
目前採用這種方式的有 VMware Workstation (64-bit guests only), Xen 3.x , Virtual Iron, Linux KVM 以及 Microsoft Hyper-V. -
Application-Level Virtualization
還有一種是 Application-Level Virtualization 他是架構在其他作業系統上的,像是 VMware Server 它的架構很簡單,它只是一個作業系統下的一個應用程式,優點是它不需要 VT 或是額外的硬體來支援,但相對的缺點就是他的效能相對的不佳.它提供一個全虛擬化的架構虛擬出來的作業系統幾乎都可以包括,像是 Windows, Linux ,Netware 都有支援,如果你沒有特別的需求可以考慮這一類的虛擬化方式.它像是其他虛擬化的環境為每個虛擬出來的 Guest OS 提供了獨立不受其他的 Guest OS 影響的獨立環境,但整體是你的最原始的作業系統沒有被破壞.做出來的 Guest OS 還可以輕易的移到不同的機台下繼續使用.
-
Container
Container 採用與 KVM 一樣的做法 (Linux 核心加入 KVM 再讓這 Linux 核心當作 VMM ,在 KVM 下的 Guest OS 對於 Linux 核心而言都只是一個 Process 行程). LXC 採用類似的方式在原作業系統中透過資源共享的方式,建立出一個獨立空間 (虛擬環境,有自己的 file system, process 與 block I/O ,network 空間) 給另外一個作業系統來使用,這邊不再稱它為虛擬機器 Virtual Machine 而是叫做 Container.詳細請參考 https://benjr.tw/98256
在正式講 Virtualization 時我先介紹一下針對虛擬化我的的裝置硬體有什麼改變.
- CPU – https://benjr.tw/3407
- Memory
- Networking – https://benjr.tw/3420
- I/O Devices – https://benjr.tw/3610
- KVM – https://benjr.tw/3620
- QEMU – https://benjr.tw/3631
這邊介紹一下常用的幾種 virtualization 的應用
- VMware- https://benjr.tw/5706
- VMware vSphere 4 – https://benjr.tw/5823
- Citrix XenServer – https://benjr.tw/7493
- RHEL5 update4 KVM(Kernel Based Virtual Machine) – https://benjr.tw/8063
- Solaris – Virtual-Box
- Windows – Virtual Server
- RHEL5 XEN – https://benjr.tw/9019
2 thoughts on “Virtualization 虛擬化”