---
# System prepended metadata

title: Proxmox 建置
tags: [系統工程]

---

# Proxmox 建置

## iso 下載位置
https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso

## 硬體資訊

- Memory: 12 GiB
- CPU: 6 Core
- Disk: 2 顆 100 GB，第二顆規劃給 Ceph 使用
- CD: proxmox-ve_8.0-2.iso
- 網路模式: Bridge 或 NAT

## 建置步驟
:::spoiler 0. 選擇 Debin 12 64-bit 版
![image](https://hackmd.io/_uploads/S1i6zJd8p.png)
:::

:::spoiler 1. 選擇 Install Proxnox VE (Console)
![image](https://hackmd.io/_uploads/r1PMtRYVp.png)
:::

:::spoiler 2. 同意 License
![image](https://hackmd.io/_uploads/BkwDKCYNT.png)
:::

:::spoiler 3. 將系統安裝至指定硬碟
![image](https://hackmd.io/_uploads/S1IsFRYV6.png)


可以指定 `local` 與 `local-lvm` 分割區大小
- `maxroot` 就是 `local` 大小
- `maxvz` 就是 `local-lvm` 大小


![image](https://hackmd.io/_uploads/B1qvTuekZe.png)

:::

:::spoiler 4. 選擇國家，時區和鍵盤

- Country: `Taiwan`
- Timezone: `Asia/Taipei`
- Keyboard layout: `U.S`

![image](https://hackmd.io/_uploads/B1Xj6HuU6.png)

:::

:::spoiler 5. 輸入 Root 密碼和系統管理員信箱

- Root password: `admin`
- Confirm root password: `admin`
- Administator email: `mail@example.com`

![image](https://hackmd.io/_uploads/HJlv1jRYN6.png)
:::

:::spoiler 6. 輸入 Hostname 和網路資訊

- Hostname (FQDN): `pve.example.com`
- IP Address (CIDR): `192.168.61.12/24`
- Gateway address: `192.168.61.2`
- DNS server address: `192.168.61.2`

![image](https://hackmd.io/_uploads/H19to0FNT.png)
:::

:::spoiler 7. 確認以上設定資訊
![image](https://hackmd.io/_uploads/rJdJ20FEa.png)
:::

## Proxmox 安裝後修正 套件 下載網址
```
# nano /etc/apt/sources.list.d/pve-enterprise.list
#deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription

# nano /etc/apt/sources.list.d/ceph.list
deb http://download.proxmox.com/debian/ceph-reef bookworm test

# apt update
```

* 9.0 版本，將原有的設定註解並新增以下
```
# nano /etc/apt/sources.list.d/pve-enterprise.sources
#Types: deb
#URIs: https://enterprise.proxmox.com/debian/pve
#Suites: trixie
#Components: pve-enterprise
#Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg


Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: bookworm
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg


# nano /etc/apt/sources.list.d/ceph.sources
#Types: deb
#URIs: https://enterprise.proxmox.com/debian/ceph-squid
#Suites: trixie
#Components: enterprise
#Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg


Types: deb
URIs: http://download.proxmox.com/debian/ceph-reef
Suites: bookworm
Components: test
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg


# apt update
```




## 關閉 IPv6
```
$ sudo nano /etc/default/grub
......
GRUB_CMDLINE_LINUX_DEFAULT="quiet ipv6.disable=1"
GRUB_CMDLINE_LINUX="ipv6.disable=1"
.....

$ sudo update-grub
```

## 修改 machine-id
* 三台機器的 machine-id 不能相同
```
# cat /etc/machine-id
afc4a541f3cd76e3e5daf4b0651a46cf

# rm /etc/machine-id

# rm /var/lib/dbus/machine-id

# dbus-uuidgen --ensure

# systemd-machine-id-setup
Initializing machine ID from D-Bus machine ID.

# cat /etc/machine-id
2c6070e0a5ba2715ce8facfc655c1876
```

## 設定 debian 永久修改 `resolv.conf`
```
$ sudo systemctl stop systemd-resolved.service

$ sudo systemctl disable systemd-resolved.service

$ sudo nano /etc/resolv.conf
nameserver 8.8.8.8
nameserver 168.95.1.1

```
## 建立 Proxmox 叢集

* 三台機器都需要設定好 static ip
* 進入到第一台機器建立叢集
![image](https://hackmd.io/_uploads/SJ4_dKtNa.png)
* 在第一台複製訊息
![image](https://hackmd.io/_uploads/Bks2OttNa.png)
![image](https://hackmd.io/_uploads/HJtautYE6.png)
* 到第 2 台與第 3 台貼上加入叢集
![image](https://hackmd.io/_uploads/Hy9eFYK4p.png)
![image](https://hackmd.io/_uploads/S1XGKYKN6.png)

* 回到第一台檢查是否 3 台機器已加入到叢集
![image](https://hackmd.io/_uploads/B1kaKYtNa.png)


## 建立 Ceph Storage
* 每一台 VM 都有一顆 Disk，把這三顆 Disk 組成一個 Ceph Storage。
* 安裝 Ceph
![image](https://hackmd.io/_uploads/rkTniKFVT.png)
* 選擇 test
![image](https://hackmd.io/_uploads/B1UzptYVT.png)
* 第一台須設定 ip 位置
![image](https://hackmd.io/_uploads/B1ViCYKVa.png)

* 第 2 台安裝 Ceph
![image](https://hackmd.io/_uploads/rys7k5KN6.png)
![image](https://hackmd.io/_uploads/ByxBk9tNa.png)
* 第 2 台就不需要設定 ip，他會自己同步
![image](https://hackmd.io/_uploads/Hy7s1qFVT.png)

* 第 3 台安裝 Ceph
![image](https://hackmd.io/_uploads/rkvak5YN6.png)
![image](https://hackmd.io/_uploads/rJER1ctET.png)
![image](https://hackmd.io/_uploads/rkcWg5tNT.png)


### 安裝 Monitor & Manager
* 裝好 Ceph 後，第一台會自己裝好 Monitor & Manager，需要再第 2、3 台也都安裝。
* Manager 負責追蹤 Ceph 資源使用率。
* Monitor 它的主要功能是維護和管理資料儲存的位置、叢集資料的一致性以及管理客戶端身份驗證和授權。
![image](https://hackmd.io/_uploads/BJmSe9KN6.png)
* 三台都需安裝 Monitor & Manager
![image](https://hackmd.io/_uploads/Skd3ecYV6.png)

### 建立 OSD 
* OSD 是負責幫 Ceph 透過網路儲存、存取和複製資料(object)到 Disk 上。
![image](https://hackmd.io/_uploads/ByiPz5FV6.png)
* 這些 Disk 不能先做過 Raid 設定，他們與 OSD 不相容。
![image](https://hackmd.io/_uploads/BkTjMqYVT.png)
* 三台都須建立 OSD。
![image](https://hackmd.io/_uploads/SyAEQqtE6.png)

### 建立 Pool
* Pool 是邏輯上使用的群組，透過他來使用 Ceph 的空間。
![image](https://hackmd.io/_uploads/BkS1N5tE6.png)
* 命名 CPA
![image](https://hackmd.io/_uploads/rke-4ctEp.png)

* 檢查 Ceph 狀態
![image](https://hackmd.io/_uploads/Bkn4N9KET.png)

### CLI 建立 Ceph



```
## 1. 在 3 台 Node 上都執行安裝 Ceph 命令
$ pveceph install --repository test

$ ssh 192.168.61.12 'pveceph install --repository test'

$ ssh 192.168.61.13 'pveceph install --repository test'

## 2. 初始化 Ceph 設定檔
## 在任一台 Node 執行以下命令
$ pveceph init --network 192.168.61.0/24


## 3. 安裝 Ceph Monitor (每一台 Node 都要裝)
$ pveceph mon create

$ ssh 192.168.61.12 'pveceph mon create'

$ ssh 192.168.61.13 'pveceph mon create'

## 4. 安裝 Ceph Manager (每一台 Node 都要裝)
$ ssh 192.168.61.12 'pveceph mgr create'

$ ssh 192.168.61.13 'pveceph mgr create'

## 5. 建立 Ceph OSDs
$ pveceph osd create /dev/sdb
$ ssh 192.168.61.12 'pveceph osd create /dev/sdb'
$ ssh 192.168.61.13 'pveceph osd create /dev/sdb'

## 6. 建立 Ceph Pools
$ pveceph pool create CPA --add_storages

## 0. 成功設定 CephFS 的前提條件：
- [x] 已安裝 Ceph packages
- [x] 已設定 Ceph Monitors
- [x] 已建立和設定 Ceph OSDs
- [  ] 已至少建立一個 Metadata Server

## 1. 建立 Metadata Server (MDS)
$ pveceph mds create

> CephFS 至少需要設定並執行一個 Metadata Server 才能正常運作
> 在有 Ceph Storage 的每一台 Node 執行以上命令

## 2. 設定 standby MDS 自動切換為 Active
$ sudo nano /etc/pve/ceph.conf
...以上檔案內容省略
[mds]
         keyring = /var/lib/ceph/mds/ceph-$id/keyring
         mds standby replay = true   <------------------- 新增這行字串
...以下檔案內容省略


> 在預設設定下，MDS 一次只能有一個處於 Active 狀態，如果 MDS 或其節點變成無回應（或崩潰），另一個 standby 的 MDS 將提升為 Active 狀態。

## 3. 建立 CephFS
$ pveceph fs create --pg_num 128 --add-storage

> 以上命令會建立一個名為 "cephfs" 的 CephFS，使用一個名為 "cephfs_data" 的 Data Pool，有 128 個 placement groups，還有一個名為 "cephfs_metadata" 的 Data Pool，他的 placement groups 數量為資料池的四分之一（32 個）。
> `--add-storage`  ，將建立好的 CephFS 設定為 Proxmox 叢集的 Storage。

## 4. 檢查 Proxmox Storage 的設定檔
$ sudo cat /etc/pve/storage.cfg | grep -A5 "^cephfs"
cephfs: cephfs
        path /mnt/pve/cephfs
        content iso,backup,vztmpl
        fs-name cephfs
```






## 網路架構
![image](https://hackmd.io/_uploads/BkyIdOdNT.png)

![image](https://hackmd.io/_uploads/ByML3HJBp.png)

## SDN(軟體定義的網路) 功能介紹

* 軟體定義的網路 (SDN) 是一種網路方法，會使用網路架構的控制器或應用程式設計介面 (API) 來引導網路流量，並與底層硬體基礎架構進行通訊。
* 集中式控制：SDN 將網路控制功能集中在一個控制器中，以便於管理和操作。傳統網路中，每個網路設備都具有獨立的控制功能，這使得管理複雜且難以自動化。SDN 的集中式控制功能可以簡化網路管理，並提高網路操作的效率。

## 安裝與設定 Vxlan & SDN
* 安裝 SDN 套件
* 三台機器都要做
```
# apt update; apt upgrade -y

# apt install libpve-network-perl ifupdown2

# reboot
```
* 三台都需設定 source
```
# nano /etc/network/interfaces
……
auto vmbr0
iface vmbr0 inet static
        address 120.96.143.244/24
        gateway 120.96.143.254
        bridge-ports ens32
        bridge-stp off
        bridge-fd 0

source /etc/network/interfaces.d/*  # 新增此行
```

### 建立 vxlan
![image](https://hackmd.io/_uploads/B1IAqD_4T.png)
* Peer Address List: 填入三台主機的 ip
* TCP 封包在乙太網路上的最大大小為 1500 個位元組，但是 vxlan 會多用 50 bit，所以設成 1450，這樣 overlay 網路設定封包才不會亂掉。
![image](https://hackmd.io/_uploads/SJPY2pKN6.png)

* 建立 VNet
![image](https://hackmd.io/_uploads/H1xrnw_NT.png)
* 取名 MYnet
* Tag 設定為 100001
![image](https://hackmd.io/_uploads/HyJXi5FNT.png)
* 建立 Subnet
![image](https://hackmd.io/_uploads/HyqIaP_Np.png)
* 設定 Subnet mask 與 Default Gateway
![image](https://hackmd.io/_uploads/BksUjqtNp.png)
* 設定好後點選 Apply
![image](https://hackmd.io/_uploads/ByOn6w_VT.png)
* 三台都有長出 MYlan 這個網路裝置
![image](https://hackmd.io/_uploads/B1d3icKEp.png)

# VxLAN

* VxLAN 是一種 Layer 2 隧道協定，它允許在 Layer 3 網路上創建跨越多個實體網段的虛擬網段（VXLAN 網段）。VXLAN 網段可以使用相同的 Layer 2 協定，例如乙太網、光纖通道等。

* VXLAN 的主要功能如下：
  - 跨物理網段擴展 Layer 2 網路：VXLAN 可以將 Layer 2 網路擴展到跨越多個物理網段的環境中。這對於需要在多個數據中心或分支機構部署 Layer 2 網路的企業非常有用。
  - 提高網路效率：VxLAN 可以提高網路效率，因為它可以減少網路拓撲中的路由器數量。
![image](https://hackmd.io/_uploads/SktX5SuET.png)

## VxLAN與 VLAN 的比較

* VxLAN 與 VLAN 的主要區別在於，VxLAN 可以跨物理網路擴展 VLAN，而 VLAN 只能在一個物理網路上使用。
* VLAN ID 的限制是由於 IEEE802.1Q 協議的定義。IEEE802.1Q 協議使用 12 位來表示 VLAN ID。因此，VLAN ID 的最大值為 4095，也就是 2^12。
* VxLAN 上限是 16777216。這是因為 VxLAN ID 使用 24 位來表示，因此可以表示 2^24，VxLAN 比 VLAN 的上限大得多，因此可以用於支持更大的網路。

### 設定 MYnet 網卡 ip
* 在 p246 機器設定 MYnet ip
```
$ nano /etc/network/interfaces.d/sdn
#version:1

auto MYnet
iface MYnet
        bridge_ports vxlan_MYnet
        address 10.244.0.2/16           # 設定 MYnet 網卡 ip
        bridge_stp off
        bridge_fd 0
        mtu 1450
        alias MYnet

auto vxlan_MYnet
iface vxlan_MYnet
        vxlan-id 100001
        vxlan_remoteip 120.96.143.247
        vxlan_remoteip 120.96.143.248
        mtu 1450
        
$ sudo reboot
```

* 在 p247 機器設定 MYnet ip
```
$ nano /etc/network/interfaces.d/sdn
#version:1

auto MYnet
iface MYnet
        bridge_ports vxlan_MYnet
        address 10.244.0.3/16           # 設定 MYnet 網卡 ip
        bridge_stp off
        bridge_fd 0
        mtu 1450
        alias MYnet

auto vxlan_MYnet
iface vxlan_MYnet
        vxlan-id 100001
        vxlan_remoteip 120.96.143.247
        vxlan_remoteip 120.96.143.248
        mtu 1450
        
$ sudo reboot
```

* 在 p248 機器設定 MYnet ip
```
$ nano /etc/network/interfaces.d/sdn
#version:1

auto MYnet
iface MYnet
        bridge_ports vxlan_MYnet
        address 10.244.0.4/16           # 設定 MYnet 網卡 ip
        bridge_stp off
        bridge_fd 0
        mtu 1450
        alias MYnet

auto vxlan_MYnet
iface vxlan_MYnet
        vxlan-id 100001
        vxlan_remoteip 120.96.143.247
        vxlan_remoteip 120.96.143.248
        mtu 1450
        
$ sudo reboot
```
## 建立 Ubuntu Router

* 下載 Ubuntu Server 22.04 image
```
$ wget https://cloud-images.ubuntu.com/jammy/20231215/jammy-server-cloudimg-amd64.img
```
* Ubuntu Router 需要兩張網卡
  - eth0 屬於外網，負責上網用
  - eth1 屬於內網，負責跟內網 vm 溝通用
```
$ qm create 9000 --name us-router --memory 1024 --net0 virtio,bridge=vmbr0 --net1 virtio,bridge=MYnet
```

```
# 匯入虛擬主機硬碟檔, 設定使用 SCSI 介面連接 虛擬硬碟檔
$ qm importdisk 9000 jammy-server-cloudimg-amd64.img CPA
$ qm set 9000 --scsihw virtio-scsi-pci --scsi0 CPA:vm-9000-disk-0

# 加入 Cloud Init 功能
$ qm set 9000 --ide2 local-lvm:cloudinit

$ qm resize 9000 scsi0 100G

$ qm set 9000 --boot c --bootdisk scsi0
```

* 使用 Cloud Init 功能設定 us-router VM 使用者資訊與網卡 ip
![image](https://hackmd.io/_uploads/S1jCLQ1ra.png)

* ssh 連進 us-router 確認兩張網卡 ip 設定是否正確
```
C:\Users\bigred>ssh bigred@120.96.143.249
bigred@120.96.143.249's password:

$ ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:b8:38:0e brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    altname ens18
    inet 120.96.143.249/24 brd 120.96.143.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2001:288:1007:431:be24:11ff:feb8:380e/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591964sec preferred_lft 604764sec
    inet6 fe80::be24:11ff:feb8:380e/64 scope link
       valid_lft forever preferred_lft forever
```

```
$ ip a s eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:54:41:2d brd ff:ff:ff:ff:ff:ff
    altname enp0s19
    altname ens19
    inet 10.244.0.1/16 brd 10.244.255.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::be24:11ff:fe54:412d/64 scope link
       valid_lft forever preferred_lft forever
```

### 設定 NAT 上網
```
$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 10.244.0.0/16 -j MASQUERADE

# 檢查 iptables 設定
$ sudo iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.244.0.0/16        0.0.0.0/0
```
* 設定 ip_forward
```
$ echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf

$ sudo sysctl -p
```

* 保存和恢復防火牆規則，使IPtables重新開機不會失效
```
$ sudo apt-get install iptables-persistent
```

* 後續更新設定請使用以下命令儲存
```
$ sudo dpkg-reconfigure iptables-persistent
```

### 設定 DHCP Server
```
$ sudo apt update;sudo apt upgrade

$ sudo apt-get install isc-dhcp-server

$ sudo reboot
```
* 刪除DHCP設定檔
```
$ sudo rm /etc/dhcp/dhcpd.conf
```
* 創建DHCP設定檔
```
$ sudo nano /etc/dhcp/dhcpd.conf
option domain-name-servers 8.8.8.8;       #定義 nameserver
subnet 10.244.0.0 netmask 255.255.0.0 {   #定義子網域
range 10.244.128.0 10.244.255.249;        #設定DHCP分配範圍
option routers 10.244.0.1;                #設定gateway IP
}
```

* 檢查 dhcp 服務
```
$ sudo systemctl restart isc-dhcp-server

$ sudo systemctl status isc-dhcp-server
● isc-dhcp-server.service - ISC DHCP IPv4 server
     Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor >     Active: active (running) since Sat 2023-11-25 08:01:33 UTC; 6min ago
       Docs: man:dhcpd(8)
   Main PID: 579 (dhcpd)
      Tasks: 4 (limit: 1102)
     Memory: 16.3M
        CPU: 77ms
     CGroup: /system.slice/isc-dhcp-server.service
             └─579 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd>
```

## 建置 Mikrotik Router
* 透過 Router 建立 dhcp server 
* 讓內網的機器能透過 Router 上網
```
$ wget https://download.mikrotik.com/routeros/7.11.2/chr-7.11.2.img.zip

$ unzip chr-7.11.2.img.zip
Archive:  chr-7.11.2.img.zip
  inflating: chr-7.11.2.img
```

```
$ qemu-img resize -f raw chr-7.11.2.img 512m

$ qm create 9002 --name Router --memory 1024 --net0 virtio,bridge=vmbr0 --net1 virtio,bridge=MYnet

$ qm disk import 9002 chr-7.11.2.img CPA

$ qm set 9002 --scsihw virtio-scsi-pci --scsi0 CPA:vm-9002-disk-0

$ qm set 9002 --boot c --bootdisk scsi0
```

* VM 開機後，The default username is admin with no password, 輸入完使用者帳號 admin 後按 enter 系統啟動後, 密碼設為 admin

* 在 Mikrotik 虛擬主機視窗登入, 登入帳號 admin/admin
```
[admin@MikroTik] > /interface print
Flags: R - RUNNING
Columns: NAME, TYPE, ACTUAL-MTU, MAC-ADDRESS
#   NAME    TYPE   ACTUAL-MTU  MAC-ADDRESS
0 R ether1  ether        1500  12:E8:1B:30:64:E6
1 R ether2  ether        1500  76:A5:2A:AD:2D:21

[admin@MikroTik] > /ip address

# 設定 ip
[admin@MikroTik] /ip/address> add address=120.96.143.249/24 interface=ether1
```
```
[admin@MikroTik] > /ip address

[admin@MikroTik] /ip/address> print
Flags: D - DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
#   ADDRESS            NETWORK         INTERFACE
0 D 120.96.143.229/25  120.96.143.128  ether1
1   120.96.143.249/24  120.96.143.0    ether1

[admin@MikroTik] /ip/address> remove 0

[admin@MikroTik] /ip/address> print
Columns: ADDRESS, NETWORK, INTERFACE
# ADDRESS            NETWORK       INTERFACE
0 120.96.143.249/24  120.96.143.0  ether1
```
* 設定內網的 ip
```
[admin@MikroTik] /ip/address> add address=10.244.0.1/16  interface=ether2
```
* 啟動 NAT 功能
```
[admin@MikroTik] /ip firewall nat add chain=srcnat src-address=10.244.0.0/16 action=masquerade out-interface=ether1
```
* 設定 DHCP Server
```
[admin@MikroTik] /ip/dhcp-server

[admin@MikroTik] /ip/dhcp-server> setup
Select interface to run DHCP server on

dhcp server interface: ether2
Select network for DHCP addresses

dhcp address space: 10.244.0.0/16
Select gateway for given network

gateway for dhcp network: 10.244.0.1
Select pool of ip addresses given out by DHCP server

addresses to give out: 10.244.128.0-10.244.255.249
Select DNS servers

dns servers: 8.8.8.8
Select lease time

lease time: 3d
```
* 檢視 DHCP Server 設定

```
[admin@MikroTik] /ip/dhcp-server> print
Columns: NAME, INTERFACE, ADDRESS-POOL, LEASE-TIME
# NAME   INTERFACE  ADDRESS-POOL  LEASE-TIME
0 dhcp1  ether2     dhcp_pool0    3d

[admin@MikroTik] /ip/dhcp-server> network print
Columns: ADDRESS, GATEWAY, DNS-SERVER
# ADDRESS        GATEWAY     DNS-SERVER
0 10.244.0.0/16  10.244.0.1  8.8.8.8
                             120.96.81.1
                             168.95.1.1
                             101.101.101.101
                             
[admin@MikroTik] /ip/dhcp-server> /ip pool print
Columns: NAME, RANGES
#  NAME        RANGES
0  dhcp_pool0  10.244.128.0-10.244.255.250

[admin@MikroTik] /ip/dhcp-server> /quit
```

## 建立 VM
* 使用 suse 做好的 image 直接做開機，不用再安裝作業系統
```
$ wget https://download.opensuse.org/repositories/Cloud:/Images:/Leap_15.5/images/openSUSE-Leap-15.5.x86_64-NoCloud.qcow2
```
* 安裝 qm 套件
```
$ apt install -y libguestfs-tools
```
* 建立虛擬主機, 並設定 SDN Overlay 網路
* 虛擬機 id 設為 101
```
$ qm create 101 --name suse15 --memory 1024 --net0 virtio,bridge=MYnet
```
* 匯入虛擬主機硬碟檔, 設定使用 SCSI 介面連接 虛擬硬碟檔
```
$ qm importdisk 101 openSUSE-Leap-15.5.x86_64-NoCloud.qcow2 CPA

$ qm set 101 --scsihw virtio-scsi-pci --scsi0 CPA:vm-101-disk-0
```
* 加入 Cloud Init 功能
```
$ qm set 101 --ide2 local-lvm:cloudinit
```
* 改變硬碟大小
```
$ qm resize 101 scsi0 100G
```
* 設定開機硬碟
```
$ qm set 101 --boot c --bootdisk scsi0
```
* 設定 IP 取得方式
```
$ qm set 101 --ipconfig0 ip=dhcp
```
* 設定成 Template
```
$ qm template 101
```
* 建立好 suse15 Template
![image](https://hackmd.io/_uploads/ryS5EotVT.png)
* 使用 Cloud Init 設定使用者與 ip
![image](https://hackmd.io/_uploads/rJoVHiYNT.png)

## vxlan disable encap/decap

```
$ sudo ethtool -K enp1s0f0 tx-udp_tnl-segmentation off
$ sudo ethtool -K enp1s0f0 tx-udp_tnl-csum-segmentation off
$ sudo ethtool -K enp1s0f0 tx-udp-segmentation off

$ sudo ethtool -k enp1s0f0 | grep tx-udp
tx-udp_tnl-segmentation: off
tx-udp_tnl-csum-segmentation: off
tx-udp-segmentation: off
```

## 設定主機 mtu 9000


```
$ nano /etc/network/interfaces
auto lo
iface lo inet loopback

iface ens18 inet manual
        mtu 9000                          # 新增此行

auto vmbr0
iface vmbr0 inet static
        address 172.20.7.202/16
        gateway 172.20.0.254
        bridge-ports ens18
        bridge-stp off
        bridge-fd 0
        mtu 9000                          # 新增此行

iface ens19 inet manual


source /etc/network/interfaces.d/*
```
```
root@pve3:~# ip a s ens18
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc fq_codel master vmbr0 state UP group default qlen 1000
    link/ether bc:24:11:c1:0f:61 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    altname enxbc2411c10f61

root@pve3:~# ip a s vmbr0
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP group default qlen 1000
    link/ether bc:24:11:c1:0f:61 brd ff:ff:ff:ff:ff:ff
    inet 172.20.7.202/16 scope global vmbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::be24:11ff:fec1:f61/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
```
* 兩台主機都要檢查是否可以使用 8972 mtu 溝通
```
root@pve3:~# ping -M do -s 8972 172.20.7.200
```


## 建立 ZFS


![image](https://hackmd.io/_uploads/H1hNbKlJZg.png)


1. 指定 `RAIDZ` 這個功能類似於 RAID 5，允許損壞一顆硬碟，因此只少要三顆硬碟組成，但實際能使用的硬碟大小就只會有兩顆
2. 指定 zstd 壓縮方式

![image](https://hackmd.io/_uploads/Hkccrte1bl.png)


### 擴增 ZFS 硬碟
* 此時 `/vm-data` 目前只有 39g
```
root@pve:~# df -hT /vm-data
Filesystem           Type      Size  Used Avail Use% Mounted on
vm-data              zfs        39G  128K   39G   1% /vm-data
```

* 如果 zpool 本身是 `raidz1`，那麼再加硬碟時就必須一次給 zpool 至少 3 顆硬碟，並且這三顆硬碟大小要相等。
* 新增三顆硬碟各 50g 名叫 `/dev/sde`、`/dev/sdf`、`/dev/sdg`
```
root@pve:~# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0  100G  0 disk
├─sda1               8:1    0 1007K  0 part
├─sda2               8:2    0  512M  0 part
└─sda3               8:3    0 99.5G  0 part
  ├─pve-swap       252:0    0    8G  0 lvm  [SWAP]
  ├─pve-root       252:1    0 34.9G  0 lvm  /
  ├─pve-data_tmeta 252:2    0    1G  0 lvm
  │ └─pve-data     252:4    0   28G  0 lvm
  └─pve-data_tdata 252:3    0   28G  0 lvm
    └─pve-data     252:4    0   28G  0 lvm
sdb                  8:16   0   20G  0 disk
├─sdb1               8:17   0   20G  0 part
└─sdb9               8:25   0    8M  0 part
sdc                  8:32   0   20G  0 disk
├─sdc1               8:33   0   20G  0 part
└─sdc9               8:41   0    8M  0 part
sdd                  8:48   0   20G  0 disk
├─sdd1               8:49   0   20G  0 part
└─sdd9               8:57   0    8M  0 part
sde                  8:64   0   50G  0 disk
sdf                  8:80   0   50G  0 disk
sdg                  8:96   0   50G  0 disk
```

* 檢查 zfs `vm-data` zpool 狀態
```
root@pve:~# zpool status -v vm-data
  pool: vm-data
 state: ONLINE
config:

        NAME                                      STATE     READ WRITE CKSUM
        vm-data                                   ONLINE       0     0     0
          raidz1-0                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi2  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi3  ONLINE       0     0     0

errors: No known data errors
```

* 檢查 sde 這顆硬碟的完整名稱是 `/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4` 以此類推
```
root@pve:~# ls -l /dev/disk/by-id/ | grep -E 'sde|sdf|sdg'
lrwxrwxrwx 1 root root  9 Oct 30 15:28 scsi-0QEMU_QEMU_HARDDISK_drive-scsi4 -> ../../sde
lrwxrwxrwx 1 root root  9 Oct 30 15:58 scsi-0QEMU_QEMU_HARDDISK_drive-scsi5 -> ../../sdf
lrwxrwxrwx 1 root root  9 Oct 30 15:58 scsi-0QEMU_QEMU_HARDDISK_drive-scsi6 -> ../../sdg
```

* 將三顆新增的硬碟加入到 `vm-data` zpool 
```
root@pve:~# zpool add vm-data raidz1 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi5 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi6
```
* 檢視 `vm-data` zpool
```
root@pve:~# zpool status -v vm-data
  pool: vm-data
 state: ONLINE
config:

        NAME                                      STATE     READ WRITE CKSUM
        vm-data                                   ONLINE       0     0     0
          raidz1-0                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi2  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi3  ONLINE       0     0     0
          raidz1-1                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi4  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi5  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi6  ONLINE       0     0     0

errors: No known data errors
```

* 檢視 `/vm-data` 已經擴大到 135g，因為 `vm-data` zpool 是採用 `RAIDZ`，因此看到的空間只有擴大 100g ，而不是 150g
```
root@pve:~# df -h /vm-data
Filesystem      Size  Used Avail Use% Mounted on
vm-data         135G  128K  135G   1% /vm-data
```

### 逐步替換 ZFS 硬碟

* 目前 `vm-data` zpool 總共由 6 顆硬碟組成，假設 `scsi-0QEMU_QEMU_HARDDISK_drive-scsi1` 這顆硬碟損毀，我們要替換這顆硬碟
```
root@pve:~# df -h /vm-data/
Filesystem      Size  Used Avail Use% Mounted on
vm-data         135G  128K  135G   1% /vm-data

root@pve:~# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0  100G  0 disk
├─sda1               8:1    0 1007K  0 part
├─sda2               8:2    0  512M  0 part
└─sda3               8:3    0 99.5G  0 part
  ├─pve-swap       252:0    0    8G  0 lvm  [SWAP]
  ├─pve-root       252:1    0 34.9G  0 lvm  /
  ├─pve-data_tmeta 252:2    0    1G  0 lvm
  │ └─pve-data     252:4    0   28G  0 lvm
  └─pve-data_tdata 252:3    0   28G  0 lvm
    └─pve-data     252:4    0   28G  0 lvm
sdb                  8:16   0   20G  0 disk
├─sdb1               8:17   0   20G  0 part
└─sdb9               8:25   0    8M  0 part
sdc                  8:32   0   20G  0 disk
├─sdc1               8:33   0   20G  0 part
└─sdc9               8:41   0    8M  0 part
sdd                  8:48   0   20G  0 disk
├─sdd1               8:49   0   20G  0 part
└─sdd9               8:57   0    8M  0 part
sde                  8:64   0   50G  0 disk
├─sde1               8:65   0   50G  0 part
└─sde9               8:73   0    8M  0 part
sdf                  8:80   0   50G  0 disk
├─sdf1               8:81   0   50G  0 part
└─sdf9               8:89   0    8M  0 part
sdg                  8:96   0   50G  0 disk
├─sdg1               8:97   0   50G  0 part
└─sdg9               8:105  0    8M  0 part


root@pve:~# zpool status -v vm-data
  pool: vm-data
 state: ONLINE
config:

        NAME                                      STATE     READ WRITE CKSUM
        vm-data                                   ONLINE       0     0     0
          raidz1-0                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi2  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi3  ONLINE       0     0     0
          raidz1-1                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi4  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi5  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi6  ONLINE       0     0     0

errors: No known data errors
```

* 新增一顆 32g 硬碟，因為要 replace 的硬碟是 20g，新增的硬碟至少要大於或等於原有的硬碟。
```
root@pve:~# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0  100G  0 disk
├─sda1               8:1    0 1007K  0 part
├─sda2               8:2    0  512M  0 part
└─sda3               8:3    0 99.5G  0 part
  ├─pve-swap       252:0    0    8G  0 lvm  [SWAP]
  ├─pve-root       252:1    0 34.9G  0 lvm  /
  ├─pve-data_tmeta 252:2    0    1G  0 lvm
  │ └─pve-data     252:4    0   28G  0 lvm
  └─pve-data_tdata 252:3    0   28G  0 lvm
    └─pve-data     252:4    0   28G  0 lvm
sdb                  8:16   0   20G  0 disk
├─sdb1               8:17   0   20G  0 part
└─sdb9               8:25   0    8M  0 part
sdc                  8:32   0   20G  0 disk
├─sdc1               8:33   0   20G  0 part
└─sdc9               8:41   0    8M  0 part
sdd                  8:48   0   20G  0 disk
├─sdd1               8:49   0   20G  0 part
└─sdd9               8:57   0    8M  0 part
sde                  8:64   0   50G  0 disk
├─sde1               8:65   0   50G  0 part
└─sde9               8:73   0    8M  0 part
sdf                  8:80   0   50G  0 disk
├─sdf1               8:81   0   50G  0 part
└─sdf9               8:89   0    8M  0 part
sdg                  8:96   0   50G  0 disk
├─sdg1               8:97   0   50G  0 part
└─sdg9               8:105  0    8M  0 part
sdh                  8:112  0   32G  0 disk
```

* 檢視 `/dev/sdh` 硬碟完整名稱

```
root@pve:~# ls -l /dev/disk/by-id/ | grep -E 'sdh'
lrwxrwxrwx 1 root root  9 Oct 30 16:16 scsi-0QEMU_QEMU_HARDDISK_drive-scsi7 -> ../../sdh
```
* 將 `/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi7` 硬碟取代 `/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1`
```
root@pve:~# zpool replace vm-data /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi7
```

* 可以看到 `raidz1-0` 已經換成 `csi-0QEMU_QEMU_HARDDISK_drive-scsi7`
```
root@pve:~# zpool status -v vm-data
  pool: vm-data
 state: ONLINE
  scan: resilvered 424K in 00:00:00 with 0 errors on Thu Oct 30 16:19:12 2025
config:

        NAME                                      STATE     READ WRITE CKSUM
        vm-data                                   ONLINE       0     0     0
          raidz1-0                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi7  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi2  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi3  ONLINE       0     0     0
          raidz1-1                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi4  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi5  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi6  ONLINE       0     0     0

errors: No known data errors
```
* 因為我們只換了一顆硬碟，但要替換 `raidz1-0` 裡的所有成員後，pool 才會真正採用更大的硬碟空間。
* 如果只是為了解決硬碟損毀的問題，使用跟原本大小相同的硬碟取代後在這裡就結束了。
```
root@pve:~# df -h /vm-data/
Filesystem      Size  Used Avail Use% Mounted on
vm-data         135G  128K  135G   1% /vm-data
```

* 在新增兩顆硬碟 `/dev/sdb`(這顆硬碟是後續新增的硬碟)、`/dev/sdi` 大小都是 32g
```
root@pve:~# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0  100G  0 disk
├─sda1               8:1    0 1007K  0 part
├─sda2               8:2    0  512M  0 part
└─sda3               8:3    0 99.5G  0 part
  ├─pve-swap       252:0    0    8G  0 lvm  [SWAP]
  ├─pve-root       252:1    0 34.9G  0 lvm  /
  ├─pve-data_tmeta 252:2    0    1G  0 lvm
  │ └─pve-data     252:4    0   28G  0 lvm
  └─pve-data_tdata 252:3    0   28G  0 lvm
    └─pve-data     252:4    0   28G  0 lvm
sdb                  8:16   0   32G  0 disk
sdc                  8:32   0   20G  0 disk
├─sdc1               8:33   0   20G  0 part
└─sdc9               8:41   0    8M  0 part
sdd                  8:48   0   20G  0 disk
├─sdd1               8:49   0   20G  0 part
└─sdd9               8:57   0    8M  0 part
sde                  8:64   0   50G  0 disk
├─sde1               8:65   0   50G  0 part
└─sde9               8:73   0    8M  0 part
sdf                  8:80   0   50G  0 disk
├─sdf1               8:81   0   50G  0 part
└─sdf9               8:89   0    8M  0 part
sdg                  8:96   0   50G  0 disk
├─sdg1               8:97   0   50G  0 part
└─sdg9               8:105  0    8M  0 part
sdh                  8:112  0   32G  0 disk
├─sdh1               8:113  0   32G  0 part
└─sdh9               8:121  0    8M  0 part
sdi                  8:128  0   32G  0 disk
```


* 檢視 `/dev/sdb`、`/dev/sdi` 硬碟完整名稱
```
root@pve:~# ls -l /dev/disk/by-id/ | grep -E 'sdb|sdi'
lrwxrwxrwx 1 root root  9 Oct 30 16:36 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
lrwxrwxrwx 1 root root  9 Oct 30 16:36 scsi-0QEMU_QEMU_HARDDISK_drive-scsi8 -> ../../sdi
```

* 將 `/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2` 換成 `/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1`
* 將 `/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3` 換成 `dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi8` 
```
root@pve:~# zpool replace vm-data /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1

root@pve:~# zpool replace vm-data /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi8
```
* 把 `vm-data` zpool 設為自動擴展
```
root@pve:~# zpool set autoexpand=on vm-data
```



* 可以看到 zfs 空間擴大了 23g。
```
root@pve:~# zpool status -v vm-data
  pool: vm-data
 state: ONLINE
  scan: resilvered 388K in 00:00:00 with 0 errors on Thu Oct 30 16:41:57 2025
config:

        NAME                                      STATE     READ WRITE CKSUM
        vm-data                                   ONLINE       0     0     0
          raidz1-0                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi7  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi1  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi8  ONLINE       0     0     0
          raidz1-1                                ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi4  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi5  ONLINE       0     0     0
            scsi-0QEMU_QEMU_HARDDISK_drive-scsi6  ONLINE       0     0     0

errors: No known data errors
```



```
root@pve:~# df -h /vm-data/
Filesystem      Size  Used Avail Use% Mounted on
vm-data         158G  128K  158G   1% /vm-data
```



## 參考資料 

https://www.vmware.com/tw/topics/glossary/content/software-defined-networking.html

### VxLAN 參考文章
1. VxLAN Overview
https://networkdirection.net/articles/routingandswitching/vxlanoverview/

2. Configure Software Defined Networking in Proxmox
https://mattglass-it.com/software-defined-network-proxmox/

3. VxLAN setup
https://forum.proxmox.com/threads/vxlan-setup.46274/

4. VxLAN 設定檔範例
https://git.proxmox.com/?p=pve-docs.git;a=blob_plain;f=vxlan-and-evpn.adoc;hb=HEAD
