---
# System prepended metadata

title: Week 08 (2023/04/13)
tags: [ncnu, lsa]

---

###### tags: `lsa` `ncnu`
# Week 08 (2023/04/13)
- Book mode: https://hackmd.io/@ncnu-opensource/book
[TOC]
---

## 虛擬化
### 虛擬化熱潮
- Docker 發布 Container 的概念









:::info
## x86
- x86 就像是一個指令集家族，使用 CISC 指令集
- 最早只有 16 bits(x86-16)~32bits(x86-32)

## 86-64
- 發現 32 bits 已經不足以負荷現在的記憶體需求
- x86 的下一代
	- 使用64bit
	- 提升可處理的記憶體大小且不影響性能
	- 具有向後 ( 向下 ) 兼容特性，因此 32bits、64bits 皆可處理


|                  |       x86-32        |       x86-64        |
|:----------------:|:-------------------:|:-------------------:|
|       bits       |       32 bits       |       64 bits       |
| 可支援最大記憶體 | 4 GB (實際約3.2 GB) | 16 EB   (1EB=100GB) |
|     運算速度     |        較慢         |    較快(快一倍)     |

:::


:::info
## 指令集 (ISA)
- cpu 的語言
- 控制 cpu 如何運作

### CISC and RISC
1. 複雜指令集
    - 執行一項工作只需要一行指令
        - ex: x86 如今大多數電腦仍使用複雜指令集
    - 優點：單一指令就可完成工作，使用方便
    - 缺點：指令長度不一，電腦判讀需耗較多效能

2. 精簡指令集 RISC
- 由多個簡單的指令組合來完成工作，就像工廠中的流水線一樣
- EX: 像是一群個別會不同技術的廚房助手一起共同完成一道佳餚
- ex: ARM MIPS RISC-V 指令集，多用於手機、平板等行動裝置
- 優點
    - 指令長度固定，方便讀取，因此速度快效率高且省電
- 缺點
    - 工程是在開發以及編譯比較費工
:::


### 為什麼需要虛擬化
#### 傳統
![](https://i.imgur.com/rW0SJAD.png)
- 一台硬體價格昂貴，所以一家公司，通常只會支援一種系統支援軟體
- 由作業系統管理整台主機的運算資源
- 應用是需要計算資源
    - 應用程式 :arrow_right: 作業系統 :arrow_right: 主機


- type1(右圖)
    - 將 hypevisor 與 host OS 進行融合
- type2(左圖)
    - 使用 hypevisor 向 host OS 要求運算資源 
![](https://i.imgur.com/E4opsCV.png)

### 什麼事虛擬化
- 將實體的硬體資源進行抽象化處理


- 在原先電腦中可以
- 對於開發者而言
    - 模擬獨立的操作系統、硬體和網路環境，在不同的平台上進行應用程式開發和測試，而且不需要實際擁有這些平台
	- 虛擬化可以提供一個安全的環境幫助開發者測試應用程式和桶配置，而不會影響到本身電腦的作業系統
![](https://i.imgur.com/n9qJcVB.png)


- 對使用者而言: 
	- 可以在單一實體電腦中建立多個虛擬環境，每個虛擬環境都可以運行不同的作業系統
	    - 可將單一系統拆成數個各自獨立、獨特且安全的環境
    - 能更有效利用硬體
        - 可以幫助將機器資源從硬體分出來，並分配管理、加以利用

### 虛擬化優缺點
#### 優點
- 成本降低
	- 減少購買新 server 或儲存設備
    - 作業系統管理需求降低
    - 維護成本降低
    - 伺服器作業成本降低

- 提高資源利用率
    - 在實體電腦建立多個虛擬環境，操作多種作業系統，最大限度的利用硬體資源
    - 可以從單一的實體電腦中，再劃分多個虛擬伺服器
    - 資源更好的做利用
- 配置部屬較輕鬆
	- 可快速架設虛擬環境，並依照需求進行不同設定
	- 使用虛擬化技術可較方便的時時備份數據資料，如果搭配好的備份，可以快速恢復回需要的狀態。
- 安全性比較高
    - 因為每一個虛擬伺服器是獨立的環境，所以其中一個虛擬機發生問題，不會影響到實體的電腦或是影響到其他的虛擬伺服器
    - 具可測試性，利用虛擬環境測試檔案、軟體
- 集中管理
    - 實體伺服器數量降低，管理員負擔降低
    - 簡化架構管理流程
- 環保
	- 減少能源消耗
		- ex: 微軟將 1995 台實驗室伺服器透過虛擬化技術整合成149台，節約了將近九成的電源，也因此節省了佔地面積
    - 省面積
        - 不需要這麼多台實體主機

#### 缺點
- 前期實施成本較高
	- 開發、製造或購買硬體、軟體設備
- 架構複雜
	- 當有問題需要排查時，需一個個確認，比物理server難解決
    - 確認工作增加
        > 比起傳統的方式，增加了一台伺服器要確認實體伺服器裡面的虛擬機是不是全部都關機了
- 性能影響
	- 虛擬環境中，需要透過Hypervisor 才能完成請求
	- 步驟增加

### 虛擬機如何運作
1. 確認CPU 是否可以支援虛擬化指令
	- 可以，速度會比較快
	- 不可以，還是可以虛擬化，但速度會較慢
2. 進入BIOS 開啟 VT(Virtualization t)
    - 將電腦重新開機，開機的過程按 `F2`(每一台電腦按下的鍵都不一樣)


- 
:::info
### BIOS (Basic Input / ouput System)
- 簡單的操作系統，控制電腦的基礎操作

- BIOS 主要的任務 : 
	- 在啟動前測試電腦、初始化和識別系統硬體

![](https://i.imgur.com/3EqAHdx.png)
[圖片來源](https://tw.easeus.com/partition-manager-tips/uefi-vs-bios.html)
:::

- 創建的虛擬機器，不一定要和主機的系統一樣

### 虛擬化應用

#### 伺服器虛擬化
![](https://i.imgur.com/1pVfC6a.png)
- 優點
    - 更好分配資源：降低成本
    - 更快的部屬時間：系統管理員可以創建多個虛擬機執行，減少購買實體伺服器的成本
    - 方便遷移：一台實體伺服器裡面有多個虛擬機，如果要搬動，只需要將實體伺服器搬運
- 缺點
    - 性能損耗：處理能力減弱
#### 網路虛擬化
![](https://i.imgur.com/ChTibXb.png)
- 不需要物理的路由器連接網路
- 網路硬體只需要轉發數據封包（data packet），虛擬網路負責管理網路服務
- 由 SDN 控制器管理，可以隨時據使用者需求更改虛擬網路的配置、分配和釋放網路資源
#### 儲存虛擬化（Storage Virtualization）
- 儲存虛擬化種類
    - 內部
        - 只能在供應商的軟體中使用，限制了數據的範圍
    - 外部
        - 對儲存數據的限制少
#### 桌面虛擬化(Desktop Virtualization)
![](https://i.imgur.com/HdwDvcB.png)
- 透過遠端的方式，在不同的地方操作遠端的電腦
- 在任何有網路的地方，可以連線進入到遠端的電腦
- 優點
	- 較好的資源利用
    - 遠程勞動力支援 (遠端工作)
	- 更好的安全性 : 因工作環境被隔離在虛擬機中，因此可以更好地保護敏感的資料與應用程式
- 缺點
    - 性能耗損：
    - 因為遠端進行操控，所以伺服器要保持正常以及網路狀態良好，如果其中一個不符合條件就無法進行連線

### 虛擬化安全


#### 虛擬化安全重要性
- 虛擬化安全：虛擬化架構的安全措施，防止惡意攻擊或是未經過允許的存取
- Hypervisor 負責管理上層虛擬機與分配資源，安全性很重要
    - 被入侵的話，上層虛擬機的任何使用者活動駭客都可以看到；所有 VM 和作業系統的控制權很有可能被駭客獲取，且很難發現到可疑活動
- 主機安全性
    - 擁有有許多虛擬機
    - 如果主機被駭入，Host、及 Guest 的資料皆有可能被拿走
- 客機安全性
    - 有許多重要的資料
        > 企業資料或是客戶的敏感資訊
#### 建議
- 加密敏感性資料：經過加密後，讓駭客即使入侵，也不容易解密，輕易取得敏感性資料


### 虛擬化這麼容易被攻擊，為什麼還要虛擬化
- 虛擬化很方便



### CPU 特權指令
![](https://i.imgur.com/6dgLFBC.png)
- 保護資料以及避免惡意行為的機制
    - 發生故障可以保護數據
    - 提昇容錯率
    - 避免惡意操作
    - 提昇電腦的安全
- Ring1 Ring2(兩個功能相似)
    - 輸入和輸出的管理權限
    - 沒辦法訪問 kernel
    - Ring2 比 Ring1 的權限更低一點
    - Ring2
        - 使用防火牆
- Ring3:權限最低
    - 使用者模式，不能直接存取硬體的相關資源
    - 操作 Application 相關
- 每一台電腦的區分不太一樣，但一定會有 kernel mode(Ring0) and user mode(Ring3)
* 當 ring 3 試圖做跟 kernal 相關的動作時或有發生錯誤時， cpu 會發出 trap

:::info
* trap(中斷)
    * trap 可以用來改變 CPU 執行程式的流程，當 CPU 在  user mode 執行一個程式時，能夠及時將棋暫停，切換到 kerenl mode 中
* syscall
    * 當 User 向 OS 發出執行特權指令的時候，由 system call 主動發出中斷訊號，將 user mode 轉為  kernel mode
    - 與 trap 不同的是由 program 自己主動請求
:::




### HAL

- Intel VT and AMD-V
Intel VT
- 支援 Intel 的虛擬化技術
- 為了解決 intel 虛擬化的安全性及性能不足
- 讓一個 CPU 運作時向多個 CPU 同時運作
    * 使一部電腦可同時運作多個作業系統

AMD-V (AMD)
-  是一種針對 x-86


#### 優點
- 可以查看訪問的對象
- 加強硬體的使用率

#### 缺點

#### 代表軟體有
* Xen
    * 使用半虛擬化技術提升效能
    * 可以再不停止的情況下，再多個物理主機之間即時遷移
* KVM
    * 現在屬於 Linux 核心的一部分
    * 具備虛擬化功能
    * 將 Linux kernel 簡化程一個 Virtual Machine Monitor
* KVM 內的虛擬電腦，主要分為兩大部分
    * 第一種：
        * CPU與記憶體的運作，提高運算效能與速度
    * 第二種
        * 周邊裝置的連結
        * 透過 QEMU 虛擬套件控制
#### 指令集架構等級的虛擬化( instruction Set Architecture Level)
- 處理器的一部分
- 只有程式設計師或 compiler writer 可以看見
- 模擬各種 CPU 的硬體指令集
    > 完全可以虛擬化出所有虛擬化的特性

#### 優點

可以完全的模擬軟體指令

#### 代表軟體

* QEMU
    * quick emulator


### 作業系統等級的虛擬化( Operation System Level )
* 作業系統的核心允許多個獨立的錢用者空間(創建一些容器)，將 os kernel 虛擬化，使 Container 可以共用同一個 host os
* 可以安全且有效的分配大量不互相信任的使用者資源
* 資源和性能損耗比較小，因為不需要有多層轉譯
#### 代表
- LXC (Linux 容器)
- Docker


(
### 函式庫等級虛擬化 (Library)
* 大部分應用程式使用許多函式庫組成的 API 來設計
* 函式庫虛擬化後，可以使用不同系統編譯的檔案


- 代表
    - Wine
        - 在類 Unix 系統執行的 Windows 程式
        - 全名： Wine is Not an Emulator
        - 可以在 Linux, BSD(UNIX LIKE), MacOS  中行 windows 的執行檔
        - 利用黑箱測試並參照開發文件

:::info
### 白箱測試法
- 模擬使用者的動作
- 測試系統是否出現無回應狀態、以及不可出現例外錯誤，當出現錯誤時須停止測試，將相關問題回報給開發人員
- 測試人員知道測試目標為何，模擬使用者的操作情境，嘗試發現使用者操作時會遇到的問題
### 黑箱測試法
- 駭客的角度進行測試
- 看系統是不是穩定或是有沒有 bug
- 測試系統的安全性是如何
:::



# 應用程式等級的虛擬化
* 將高階語言轉譯成一種名為 bytecode 的語言，透過虛擬機器 compile 成為可以直接執行的命令

:::info
### Bytecode（字節碼）
- 一種介於機器語言和高階語言的中間語言
- 以二進位表示
- 可以在不同平台上運行

:::
*  允許使用者從安裝應用程式的電腦外的另一台電腦訪問和使用應用程式


* 一個欺騙應用程式的過程
    * 讓沒有安裝此應用程式的系統，誤以為有安裝
- 好處
    - 不會因為 OS 不同而無法運作

#### 代表

* Oracle Java


### 虛擬化類型

#### 全虛擬化
* 完全虛擬出一個主機所需要的所有環境
* 透過軟體來模擬
* 對於運行於其上的虛擬機來說，感覺不到 Hypervisor，因此對 Guest OS 的支援類型最廣泛的一種
* 實際上由 Hypervisor 做控制
* Guest 會在 Ring1
* Guest 要傳訊息給 CPU，必須要透過轉譯，讓CPU 可以看懂指令


#### 半虛擬化
* 為改善 FV 缺點：效能損耗
* Hypervisor 只虛擬化 CPU & Memory
* 虛擬機操作直接
* Guest 會在 Ring0

### 硬體輔助虛擬化 (Hardware-Assisted Virtualization)
![](https://i.imgur.com/5niFX9J.png)
- 提高軟體虛擬化的效率
- 使用硬體執行 CPU 指令





### FV vs PV vs HVM


| Column 1 |FV|PV|HVM|
| -------- | -------- | -------- | -------- |
|    怎麼處理特權指令  |  Binary    |  修改 kernel 及使用 hypercall    | 新增一個 root mode|
|   怎麼處理 CPU 指令 |  軟體    |  軟體    | 硬體|
|    效能  | :-1:   |  :+1:   | :+1:|
|    OS 相容性  |   :+1:   |  :-1:    | :+1: |


### QEMU


:::info

### QEMU_KVM
- KVM 負責 CPU 虛擬化，但是不會虛擬化其他的設備
:::



:::info
#### libvirt
- 會跟 KVM 的 run time 進行溝通
:::

### Demo
:::success
### 前置作業
- 看 CPU 是否有支援虛擬化
    ```cmd=
    sudo grep -E -c '(vmx|svm)' /proc/cpuinfo
    ```
    - 回傳 0 表不支援
    ![](https://i.imgur.com/fpWDlG8.png)
        > 如果不支援要報 BIOS 做設定
- 更新套件
    ```cmd=
    sudo apt update
    ```
- 安裝 quem-kvm
	 ```cmd=
    sudo apt install qemu-kvm
    ```
- 安裝 libvirt
     ```cmd=
    sudo apt install libvirt-daemon-system libvirt-clients
    ```
- 檢查狀態
    ```cmd=
    sudo systemctl status libvirtd.service
    ```
	![](https://i.imgur.com/i3z1Tvp.png)
    ![](https://i.imgur.com/EVdelnM.png)
- adduser
    ```cmd=
    sudo adduser $USER kvm
    ```
	![](https://i.imgur.com/E32vDYR.png)
- 加完後要 reboot
- 開機後下groups 可以看到 kvm and libvirt 顯示在上面
    ```cmd=
    groups
    ```
- 確認 kvm 是否已經安裝而且可以執行
    ```cmd=
    virsh list --all
    ```
    ![](https://i.imgur.com/QD3WdxH.png)
    
:::
:::info
#### virsh 
- 用來啟動、暫停、顯示虛擬機的指令
- `virsh list --all` 顯示所有虛擬機狀態
- `virsh start <VM name>` 開啟虛擬機
- `virsh suspend <VM name>` 暫停虛擬機
:::




## VM 虛擬機
- 每一個 VM 都會有自己的 OS
- host: 實際的作業系統和硬體資源
- `bin` 函式庫，通常用二進位表示
- Hypervisor: 負責管理與分配硬體資源


### 為何要使用虛擬機
![](https://i.imgur.com/oEvyNJI.png)

- 提供一個可供測試的隔離環境
    - 如感染病毒的資料、瀏覽容易中毒的網展
- 可在單一實體電腦上執行多個作業系統環境
    * 太多虛擬機可能造成效能不穩定
- 將系統資源最佳化

### 虛擬機管理程式 Hypervisor)
- 又稱虛擬機監視器( Virtual machine monitorVVM)
- 主要功能為讓一台實體機上可以執行多個 VM

- 類型:
	- type 1 : 直接建立在硬體上面
	- type 2 : Hosted Hypervisor (主機型)
* hypervisor 用來執行一個或多個虛擬機的電腦稱為 host machine

#### type1 

* 直接把 hypervisor 建立在硬體上，直接控制實體機器
* 呼叫流程：Guest OS/Kernel -> hypervisor -> 硬體
- 優點
    - 執行效率高
        - 因為不用跟硬體一起共用
    - 較安全
        - 降低了對 OS 的安全漏洞
    - 可移植性高
        - 可以直接移動到其他的硬體上
#### type2
- 呼叫流程： Guest OS/kernel -> hypervisor -> Host OS/kernel -> 硬體
- Hypervisor 作為應用程式執行在 Host OS 環境內
- 優點
    - 更易於安裝、設定和使用
- 缺點
    - 效率比 type1 低
- 代表
    - VirtualBox
    - VMware Workstaion Pro, VMware Fusion
    - QEMU

|  | Bare-Metal Hypervisor(type1) | Hosted Hypervisor(type2) |
| -------- | -------- | -------- |
| 呼叫方式    | 在實體主機的硬體上執行    | 在 Host OS 上執行  |
|呼叫流程|Guest OS/Kernel -> Hypervisor -> 硬體| Guest OS/Kernel -> Hypervisor 接收 -> Host OS/Kernel  -> 硬體|
|效能|:+1:|:-1:|
|穩定度|:+1:|:-1:|
|安全性|:+1:|:-1:|
|可移植性|:+1:|:-1:|
|容易使用性|:-1:|:+1:|


#### Container
* Container：應用程式與其相依性資
* Container Engine：類比 Hyperviosor，在硬體的上層建置一個可以運行虛擬機的環境
    * 例如： Docker 也同樣需要在 Host OS 建置一個可以運行容器的環境


#### 特點
* 不需裝 OS
    * 共用 Host OS Kernel
    * 更加輕量
    * 啟動速度相對快
        * 當高流量活動出現，容器的水平擴展也相對快
- Container 彼此隔離，互不影響運作
- 啟動快速


#### Linux Container LXC
![](https://i.imgur.com/oWMTKRz.png)

* 可以在單一 Linux 主機運行多個 Linux 虛擬環境，可以像使用 VM ㄧ樣，在 LXC 安裝任何東西
    * 例如：Ubuntu、Red Hat、CentOS ...

- 例如: Ubuntu、Red Hat 、 CentOS

* Isolated operation

#### Docker Container
* 由很多層 image 所組成的
* Docker 在 `1.0` 版之前使用 LXC 來創建與主機的隔離。後來 Docker 開發自己的 LXC 替代品，稱之為 `libcontainer`

- libcontainer
- 一個 Docker Container 執行一個process
	- Docker 的 best practice 
    - libcontainer 是一個開源項目
- AFUFS
- 一種 UnionFS（聯合檔案系統）
- 將不同的目錄合併成一個虛擬目錄

- 將不同的目錄合併成一個虛擬目錄
- 預設情況QAQ???

#### LXC vs Docker Container
![](https://i.imgur.com/qM3KUOl.png)

|                |           LXC            |              Docker              |
|:--------------:|:------------------------:|:--------------------------------:|
| Virtualization |            OS            |           application            |
|   FileSystem   |   有自己的 FileSystem    |     共同 host 的 FileSystem      |
|      環境      |       只能在 Linux       |            可以跨平台            |
|      功能      | 提供一個完整的虛擬化環境 | 只包含應用程式和他們所需要的環境 |
|      情境      |        需要 Linux        |              跨平台              |


#### VM vs Container

| Column 1 | VM | Container |
| -------- | -------- | -------- |
| 技術  | 需要安裝 OS (Guest) | 不需要安裝 OS   |
| 啟動速度  | 較慢（分鐘）  | 較快（秒）   |
| 效能  | 慢   | 快   |
| 硬體容量  | GB  | MB  |
| 單一主機運行速度  | 一般十幾個     |上千個容器  |
| 隔離性  | 完全隔離     | 不完全隔離     |
| 安全性  | 較好     | 較差     |

- Container 不會取代 VM
    - ?
### Namespaces (命名空間)
- 提供一個獨立環境將系統資源隔離，保證 Cotainter 彼此不影響
    - 每個 Cotainter 看起來會有自己的檔案系統、網路介面、PID和主機名稱
- 把一個 Cotainter 放在某一種類的 Namespace 中，該 Cotainter 就只會看到這個 Namespace 看的到的資源

### UTS



### 實作
- 建立一個 namespace?
	![](https://i.imgur.com/41ZnYIw.png)


### PID namespace
![](https://i.imgur.com/eFC59sq.png)
* 每一個 PID namespace，裡面的 process 
* 使用 PID namespace 時，每一個 Container 都會有 PID =1 的  process，這個 process 在本季上也會有另一個 PID
* parent PID namepsace 知道 child PID namespace 的存在


### mount namespace
* 可以掛載主機上不同的文件系統
* 一個 mount namespace 中的 process 無法訪問掛載在另一個 mount namespace 中的 Filesystem


#### FileSystem 檔案系統
* 是一種儲存和組織電腦資料的方法
* 使用檔案和樹形目錄代替了應貼和光碟等物理裝置使用資料庫快的概念
* 


- 查看系統裡有哪些檔案
    ```cmd=
    cat /proc/filesystems
    ````
- 建立新的 PID namespace
    ```cmd=
    sudo unshare -m 
    ```  
### network namespace

* 網路資源的隔離：這樣每個 Container 就有獨立的網路資源可以用
    * 例如：網路設備、Ipv4、Ipv6、路由表

### user namespace
* 主要隔離了 user 權限相關的 Linux 資源
* 包括 user ID、group ID、根目錄、以及特殊權限等

:::success
- 創造 user namespace 的空間 `unshare -Ur`
- 查看目前的使用者 `whoami`
- 變成 root 後，編寫檔案 `date /tmp/test`
- 查看 /tmp/test 資料夾 `ls -l /tmp/test`
    > 可以得知在 Container 創造不同的身份都會被紀錄（顯示是誰創建檔案）
:::

### cgroups (控制組)
- 管理使用資源的權限，防止 Cotainter 使用過多資源
    - e.g. 記憶體、檔案快取、CPU 使用量、磁碟 I/O

#### 主要有四個功能
* 限制資源上限
    * 限制了 task 可以使用多少資源，像是可以設定 Memory 的使用上限
* 優先級分配
    * 不同 Container 可以擁有不同的 CPU 跟 Disk I/O 使用優先順序
* 計算資源使用情況
    * 計算 Container 資源使用量，如 CPU、Memory
* 控制
    * 暫停 Container 中的 process

#### 四個元素組成
* task
    * 運行於作業系統內的 Process，在 cgroups 內被稱為 Task

- Subsystem 子系統
    - 每個子系統負責管理一種資源
        - e.g. CPU、Memory
    - 查看現在有哪些子系統 `cat /proc/<Container 在 Host 的 pid>/cgroup`


* hierarchy
    * cgroup 使用樹狀結構來管理資源
    * 預設會有一個根結點，每個節點都是一個 cgroup，可以有多個子節點，子節點會套用服節點
    * 一個 hierarchy 可以對應到一個或多個 subsystem，在跟節點限制每個 subsystem 
    ![](https://i.imgur.com/mm5jy86.png)

:::success
### Demo
- 新增資料夾
    ```cmd=
    sudo mkdir /sys/fs/cgroup/memory/test
    ```
- 查看
    ```cmd=
    sudo ls /sys/fs/cgroup/memory/test
    ```
- 撰寫檔案，限制 memory 使用量
    ```cmd=
    sudo vim /sys/fs/cgroup/memory/test/memory.limit_in_bytes
    ```

:::

















