- Book mode https://hackmd.io/@ncnu-opensource/book
LSA報告 - 虛擬化技術
===
[TOC]
## 虛擬化發展起因
### 早期伺服器, 機房
早期的伺服器主要為一個實體機,很肥很重很大 :cry:
我們對機房的認知為 有很多櫃子的 房間,超酷!就是一片機器海,但在老闆眼裡就都是錢啊!!還要控制溫度!多燒錢 :no_good:
所以以前的科技業常被視為是科技新貴,光是買那些機房就不知道要花多少錢了
### 虛擬化的效益
- 減少成本
- 管理彈性高
- 可用性高
- 隨需急用
- 維護時間短
- 很潮(x
### BUT :face_with_hand_over_mouth:
- 管理數量多
- 複雜性更高
- 與實體設備相容性
- 可能降低運行速度
### 興起歷史
`最早提出虛擬化一詞的為 IBM `
- `Virtualization` 這個詞最早是由 `IBM` 實驗性的 `M44/44X system` 提出
```txt=
About M44/44X
Thomas J. Watson Research Center (the headquarters for IBM Research)
基於 IBM 7044(the 'M44')模擬出多台 7044 virtual machines (the '44X')
used to explore paging, the virtual machine concept, and computer performance measurement.
```
## `實現虛擬化的方式` Hypervisor
- 又稱 Virtual machine monitor(VMM)
- 用來建立虛擬機器 (Virtual Machine, VM) 的軟體(software)、韌體(firmware)或硬體(hardware)
- **host machine** : Hypervisor 用來執行一個或多個 VM 的電腦
- VM 此時則可稱為 **guest machine**
- 用以對位在其上層的 VM,進行監控管理的底層程式
- 同時也作為實體資源與虛擬機器間的控制介面
- 提供 **動態的硬體資源配置及彈性設定** 和 **管理虛擬資源**
- :star2: 取代本來由 OS 所掌管的 Ring 0 特權模式,而原來的作業系統則降一級成為 Ring 1
- 種類
![](https://i.imgur.com/jEbyebs.png)
- Type1 - Bare-metal 裸機型
![](https://i.imgur.com/pvd9jM8.png)
- VM 的管理程式直接運行在實體主機硬體之上
- 硬體不需要先有os就能直接安裝
- EX:
- VMware ESX Server (5.5及以後的版本)
- Microsoft Hyper-V
- Citrix
- XenServer (Xen 3.0 之後的版本)
- 特點
- 需要硬體支援
- 虛擬機器監視器作為主作業系統
- 執行效率高
- Type2 - hosted 主機型
![](https://i.imgur.com/s59U8ZD.png)
- VM 管理程式執行在傳統的作業系統上,就像其他電腦程式那樣執行
- EX:
- VMware Server / Workstation
- Microsoft Virtual PC / Virtual Server
- 特點
- 虛擬機器監視器作為應用程式執行在主作業系統環境內
- 執行效率一般較類型 1 低
- ELSE: 嵌入平台韌體中 / 可直接以USB隨身碟或光碟片啟動的
- EX:
- VMware ESXi
- Linux KVM(Kernel-based Virtual Machine)
|種類 |運行方式 | 特點 |
| ------ | -------- | -------- |
|Bare-metal| VM 的管理程式直接運行在實體主機硬體之上 |需要硬體支援 |
| ------- |--------|執行效率高 |
| ------- |--------|直接掌握硬體,效能、穩定度、安全性較好 |
| Hosted |VM 管理程式執行在傳統的作業系統上 |虛擬機器監視器作為應用程式執行在主作業系統環境 |
|-------|--------|執行效率一般較類型 1 低 |
| Else |嵌入平台韌體中 / 可直接以USB隨身碟或光碟片啟動 |-------- |
### `補充:` CPU運作架構之四個特權等級
![](https://i.imgur.com/E2OJdsF.png)
- Ring 0 權力最大,Ring 3 權力最小
- 在一般的情形下,權力較低的程式不能存取權力較高的程式或資料
- 事實上,即使是權力較高的程式,也不能直接執行權力較低的程式,而必須經由 call gate 來呼叫
- 大部分的作業系統只用到兩個等級,即 Ring 0 和 Ring 3
- 只用到兩個等級的作業系統,應該要使用 Ring 0 和 Ring 3
- Ring 0
- 系統核心
- 通常為作業系統,它可以與核心(Kernel)溝通,直接控制實體主機硬體資源的使用
- EX:
- CPU
- Memory
- Device I/O
- Ring 3
- 應用程式
- **BUT** : Micro kernel 系統
- Micro kernel 在 Ring 0 中執行,而系統服務則可以在 Ring 1(或 ring 2)中執行
- ![](https://i.imgur.com/6C24y34.png)
## `虛擬化的分類` 簡單分類
### System virtual machines
### Process virtual machines
## `虛擬化的分類` 抽象等級分類
[![](https://i.imgur.com/Ue3FMmv.jpg)
](https://zh.wikipedia.org/wiki/%E8%99%9B%E6%93%AC%E5%8C%96)
- 程式語言等級的虛擬化
- 不是要讓程式真的給CPU執行,所以隔出一個虛擬環境,然後分runtime處理程式
- ex. Oracle Java
> FIXME : JVM
虛擬出能編譯執行java的環境
過程:將原始碼編譯成位元組碼(編譯器),在轉譯成可直接執行的指令(虛擬器)
[![](https://i.imgur.com/eAcQPPx.png)](https://www.wikiwand.com/zh-tw/Java%E5%AD%97%E8%8A%82%E7%A0%81)
- 函式庫等級的虛擬化(Wine以及WSL)
- 因為每種不同系統的函式庫不一樣,編譯後的東西不同通用
- 讓不同系統編出來的文件能相容並使用
- Wine :
- 將windows的API函式庫包裝起來
- 在Linux, macOS, BSD系統上 -> run windows系統編譯的程式
- WSL :(Windows Subsystem for Linux)
- 在Windows 10和Windows Server 2019上 -> run Linux 二進制可執行文件(ELF格式)
- 作業系統等級的虛擬化(Docker)
- 不想要虛擬一個很肥的架構
- 不必要是完整的OS,一個 application 也能裝進虛擬容器 run
- 這樣比較輕量且可攜帶
- Docker 與傳統硬體層虛擬化的差別
[![](https://i.imgur.com/jGCS0bG.png)](https://note-on-clouds.blogspot.com/2015/11/docker-2.html)
- 指令及架構等級的虛擬化(Bochs, QEMU)
- QEMU
- 把自己模擬成 CPU ,讓 guest os 把本來對硬體的需求先給QEMU代理轉譯,在給硬體
- 優點 : 這樣的模式可以讓 guest os 和 IO設備(主機上的硬盤、網卡、CPU、CD-ROM、音頻設備和USB設備)溝通
- 缺點 : 指令都需經 QEMU 轉譯,性能較差
- 硬體抽象層等級的虛擬化(VMware_ESXi, Hyper-V, VirtualBox, Citrix, KVM, XEN)
- KVM
- linux kernel 提供的虛擬化架構
- 將 kernel 直接當 hypervisor 用
- 優點 : guest os 的CPU指令不用經 QEMU 轉譯即可直接運行,效率較高
- 缺點 : KVM 的 kvm.ko 只提供了 CPU 和記憶體的虛擬化,所以須結合 QEMU 才能構成一個完整的虛擬化技術
- (補充) QEMU-KVM
- KVM 負責 cpu 虛擬化+記憶體虛擬化
- QEMU模擬其他 IO 設備
[![](https://i.imgur.com/UAnhPdU.png)](https://www.twblogs.net/a/5b9717af2b717750bda92054)
## `虛擬化的分類` 硬體虛擬化程度分類
### Full Virtualization 全虛擬化
![](https://i.imgur.com/nEvR8E8.png)
- 完全虛擬出一個主機所需的所有環境
- 優點
- 作業系統沒有經過任何修改,完全模擬
- 可模擬出完整的底層虛擬硬體層
- 缺點
- Hypervisor 接受 Guest OS kernel 指令必須做動態
- 須將將一些 `敏感性指令` 虛擬化,轉譯為 **2進制譯碼(Binary Translation)**
:::info
* Privileged Instruction – 需要權限才能執行,若在 user mode 會發生 trap
* I/O 指令
* 與記憶體管理有關的暫存器之修改指令
* 與 Timer 設定有關的指令
* Enable/Disable 指令
* 系統停止指令
* Sensitive Instruction – 會控制到硬體狀態的指令,ex: 更換硬體 mode
* Critical Instruction – Sensitive but non-privileged instruction
![](https://i.imgur.com/DRwwC4H.png)
:::
- EX:
- Parallels Workstation
- Parallels Desktop for Mac
- VirtualBox
- Virtual Iron
- Oracle VM
- Microsoft Virtual PC
- VMware Workstation
- **VMware** Server(原GSX Server)
- **QEMU**
- Adeos
- Mac-on-Linux
- Win4BSD、Win4Lin Pro
- Egenera vBlade technology
- QEMU
- 由 Fabrice Bellard 等人編寫
- 免費
- 可執行硬體虛擬化(hardware virtualization)的開源代管虛擬機器(VMM)
- 動態的二進位轉換,類比 CPU
- 提供一組裝置模型,使它能夠執行多種 guest OS
- 架構由 ==純軟體實現==,並在 Guest 與 Host 中間,來處理 Guest 的硬體請求,並由其轉譯給真正的硬體
- 所有的指令都要經過QEMU
- 使得效能很差
- 解決方法:
- 結合 KVM 硬體加速能力
- 允許用戶空間程式存取各種處理器的虛擬化硬體特性,這個特點使得QEMU可以為x86,PowerPC和S/390客戶提供虛擬化。
- ![](https://i.imgur.com/M1DjyH3.png)
- libvirt :
- 一套用於管理平台虛擬化的開源馬程式介面
- 管理功能:虛擬機器管理、遠端機器管理、儲存與網路管理
- 現代 Linux 經常是結合了 QEMU、KVM 核心模組和 libvirt
#### `全虛擬化` 虛擬化技術
現代電腦上都在處理類似截獲硬體存取,類比除了處理器以外的任何主機板上的硬體的事情,必須動態地重新編譯特權模式代碼
- 軟體套件
- VMware
- TwoOStwo
- SVISTA
- 處理器中添加虛擬化技術
##### 硬體輔助虛擬化
避免掉重新編譯特權模式指令,而造成的效能消耗
相對 Full virtualiztion 直接一點的去跟硬體溝通
- Intel
- Intel VT-x(CPU虛擬化)
- Intel VT-d(IO虛擬化)
- AMD
- AMD SVM(CPU虛擬化)
- IOMMU(IO虛擬化)
- 可簡化虛擬化程式碼,對全虛擬化來說,可**大幅改善因採用2進制譯碼技術所導致的效能不彰問題**
### Paravirtualization 平行 / 半虛擬化
![](https://i.imgur.com/4Q32pT3.png)
改進傳統 x86 架構下,硬體對虛擬化無法支持而產生的技術
實現硬體層級的虛擬化層
- 提高虛擬化的效率
- 讓虛擬機的 **操作指令直接給 hypervisor 執行**,以減少中間轉換造成的性能損失和時間延遲
- 優點:
- 透過處理器虛擬化技術,在提供平行虛擬化的同時,也可運行全虛擬化環境
- 與硬體層相溝通,相對而言,其效能表現最佳
- CPU、I/O 的損耗降低
- 缺點
- 必須修改作業系統核心
- 因此支援作業系統種類相對減少許多
- EX: Xen
- 該技術必須對客端作業系統進行修改,以對Hypervisor發出系統呼叫
### OS-level Virtualization
- 將作業系統核心虛擬化,可以允許使用者空間軟體實體(instances)被分割成幾個獨立的單元,在核心中運行,而不是只有一個單一實體運行
- 也被稱為是一個容器(containers),虛擬引擎(Virtualization engine),虛擬專用伺服器(virtual private servers)或是 jails
- 對每個行程的擁有者與使用者來說,他們使用的伺服器程式,看起來就像是自己專用的
- 在原作業系統上模擬出一個行程,所有的CPU/RAM/IO 等資源,全部都共用原生的Host OS
- 優點:
- 沒有模擬Hardware 的負擔
- 跟在原機上執行的效能,幾乎一樣
- 缺點:
- 限制: Host OS 與Guest OS 必須使用同一個核心
- Guest OS 的檔案資料在 Host OS 下可以完全看到,他只是Host OS 下的一個子目錄
- Chroot
- EX:
- 基於 cgroups
- control groups
- Linux 核心的一個功能
- 用來限制、控制與分離一個 Process group 的資源(如CPU、記憶體、磁碟輸入輸出等)
- EX:
- LXC
- OpenVZ
- Docker
- FreeBSD jail
* What is Container?
* ![](https://i.imgur.com/f3IhIZY.png)
* 包含了所有讓應用程式在各種不同環境 (如不同電腦硬體、基礎架構或雲端環境) 都能順利執行的必要元素,包括:程式碼、執行時期環境、系統工具、系統程式庫、軟體相依性等等
:::success
效能排序
OS-level Virtualization > Paravirtualization > Full virtualization
:::
{"metaMigratedAt":"2023-06-15T06:20:22.614Z","metaMigratedFrom":"YAML","title":"LSA報告 - 虛擬化技術","breaks":true,"contributors":"[{\"id\":\"1476e791-52cd-409d-bb6e-1e60c88a23d4\",\"add\":11234,\"del\":5305},{\"id\":\"d756a3a3-b14c-406f-8570-44438ebb7420\",\"add\":52,\"del\":0},{\"id\":\"5432f778-7f2d-4f27-a44f-0a921fd8e9dc\",\"add\":12,\"del\":0},{\"id\":\"9e928f0d-681a-4fae-a11a-e27f4c1f3dd3\",\"add\":25,\"del\":0},{\"id\":\"480d2f40-46b0-4bed-b3de-552cf6c19f19\",\"add\":1,\"del\":0},{\"id\":\"d07d1aa0-fa5e-4b20-a10d-731addfcc858\",\"add\":1554,\"del\":12}]"}