# 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