PVE开源虚拟化管理平台

5907 字
30 分钟
PVE开源虚拟化管理平台

PVE-开源虚拟化管理平台#

[TOC]


环境准备#

  1. 使用官方的iso镜像部署三个PVE节点
    1. 部署1个Backup server
  2. 尽量使用==相同类型的cpu==

部署PVE节点#

Note
  • 默认下一步
    • CPU:共4个核心 运行内存 8G

image-20260602151330225
image-20260602151330225

image-20260602151704378
image-20260602151704378

image-20260602151946318
image-20260602151946318

Warning
  • 别忘记勾选虚拟化

image-20260603130952737
image-20260603130952737

Tip
  1. 每个虚拟机六张网卡,一张nat,五张桥接
  2. 每个节点5块硬盘
    1. 一块硬盘装系统
    2. 三块硬盘作为osd —> ceph集群
    3. 一块硬盘备用

  • 三块网卡给不同的MAC地址!

image-20260602153810394
image-20260602153810394

Note
  • 拍一次快照

image-20260602153133182
image-20260602153133182

图形化安装#

image-20260602153505943
image-20260602153505943

image-20260602154240404
image-20260602154240404

image-20260602154313251
image-20260602154313251

image-20260602154508534
image-20260602154508534

image-20260608145657212
image-20260608145657212

📌 安装页面到底在配什么?

Terminal window
Proxmox 安装程序 「管理网络」页面
你填的 IP、掩码、网关、DNS
自动写入 /etc/network/interfaces vmbr0 的配置
安装完成后,这个 IP 就是 Web UI 的访问地址
===============================================
💡 这个页面本质上就是一个'图形化的网络配置向导'
✅️ PVE Web UI (pveproxy) → 监听 0.0.0.0:8006(所有网卡)

⭐节点规划#

g2-host1.pve.com — PVE 节点 + Ceph 节点

项目配置
网络nic0(NAT):10.0.0.211(DHCP),网关 10.0.0.2
nic1(桥接):10.2.1.101 — PVE 管理网络
nic2(桥接):10.2.2.101 — PVE 集群网络
nic3(桥接):10.2.3.101 — OSD Public
nic4(桥接):10.2.4.101 — OSD Cluster
nic5(桥接):10.2.5.101 — OVS 网桥 vmbr1
磁盘sda:系统盘
sdb–sdd:Ceph OSD(共 3 块)
sde:本地目录存储

g2-host2.pve.com — PVE 节点 + Ceph 节点

项目配置
网络nic0(NAT):10.0.0.222(DHCP),网关 10.0.0.2
nic1(桥接):10.2.1.102 — PVE 管理网络
nic2(桥接):10.2.2.102 — PVE 集群网络
nic3(桥接):10.2.3.102 — OSD Public
nic4(桥接):10.2.4.102 — OSD Cluster
nic5(桥接):10.2.5.102 — 额外网桥 vmbr1
磁盘sda:系统盘
sdb–sdd:Ceph OSD(共 3 块)
sde:本地 ZFS 存储

g2-host3.pve.com — PVE 节点 + Ceph 节点

项目配置
网络nic0(NAT):10.0.0.233(DHCP),网关 10.0.0.2
nic1(桥接):10.2.1.103 — PVE 管理网络
nic2(桥接):10.2.2.103 — PVE 集群网络
nic3(桥接):10.2.3.103 — OSD Public
nic4(桥接):10.2.4.103 — OSD Cluster
nic5(桥接):10.2.5.103 — OVS 网桥 vmbr1
磁盘sda:系统盘
sdb–sdd:Ceph OSD(共 3 块)
sde:本地 LVM_Thin 存储
⚠️ sdf:本地 ZFS 存储

g2-pbs.pve.com — Proxmox Backup Server 节点

项目配置
网络nic0(NAT):10.0.0.244(DHCP),网关 10.0.0.2
nic1(桥接):10.2.1.104 — PVE 管理网络
磁盘sda:系统盘
sdb:备份存储磁盘

gX-node.pve.com — 管理操作节点

项目配置
网络nic0(NAT):10.0.0.210(DHCP),网关 10.0.0.2
nic1(桥接):10.2.1.105 — PVE 管理网络
磁盘nvme0n1:系统盘 + 数据盘
用途浏览器访问 WebUI、配置 NFS/Samba 共享、上传镜像
Terminal window
Vir-02 --> '另一台Rocky虚拟机'
# 添加一张桥接网卡,和它处于同一网段
root@Vir-02:~# vim /etc/NetworkManager/system-connections/eth1.nmconnection
'10.2.1.105'
root@Vir-02:~# nmcli connection reload
root@Vir-02:~# nmcli con up eth1
Connection successfully activated
[root@Vir-02 ~]# ip a s eth1 | grep inet | head -1
inet 10.2.1.105/24 brd 10.11.0.255 scope global noprefixroute eth1
root@Vir-02:~# ping 10.2.1.101
PING 10.2.1.101 (10.2.1.101) 56(84) bytes of data.
64 bytes from 10.2.1.101: icmp_seq=1 ttl=64 time=0.502 ms
64 bytes from 10.2.1.101: icmp_seq=2 ttl=64 time=0.303 ms
🌰 '远程登录管理'
root@Vir-02:~# ssh root@10.2.1.101
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@pve:~#

实操#

Terminal window
1)备份软件源
root@pve:~# mkdir /sourcebak
root@pve:~# cp -p /etc/apt/sources.list.d/* /sourcebak
2)更改默认的软件源
=========================
# 修改文件默认没有vim命令
Debian 预装的 vim-tiny 为了兼容老式 vi,默认开启了一个“兼容模式”(compatible)
所以一些现代编辑器的习惯就不起作用了
📝执行:set nocompatible,关闭兼容模式
=========================
'我们改用cat进行修改'
root@pve:~# cat > /etc/apt/sources.list.d/debian.sources <<'EOF'
Types: deb
URIs: http://mirrors.aliyun.com/debian/
Suites: trixie trixie-updates
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://mirrors.aliyun.com/debian-security/
Suites: trixie-security
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
3)更换pve企业源
root@pve:~# rm -rf /etc/apt/sources.list.d/pve-enterprise.sources
root@pve:~# cat > /etc/apt/sources.list.d/proxmox.sources <<'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
4)更换ceph源
root@pve:~# cat > /etc/apt/sources.list.d/ceph.sources <<'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/ceph-tentacle
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
5)配置网络配置
root@pve:~# cat > /etc/network/interfaces <<'EOF'
auto lo
iface lo inet loopback
iface nic1 inet manual
# pve管理网络
auto nic0
# 物理网卡(NAT)-->用来上网
iface nic0 inet static
address 10.0.0.101/24
gateway 10.0.0.2
auto nic2
# pve集群网络
iface nic2 inet static
address 10.2.2.101/24
auto nic3
# ceph集群公网
iface nic3 inet static
address 10.2.3.101/24
auto nic4
# ceph集群内网
iface nic4 inet static
address 10.2.4.101/24
auto nic5
# 备用桥接网卡
iface nic5 inet static
address 10.2.5.101/24
auto vmbr0
# pve管理网络
# 物理网卡 nic1(作为 vmbr0 的桥接端口)
# 这里物理网卡是桥接的那张网卡
iface vmbr0 inet static
address 10.2.1.101/24
bridge-ports nic1
bridge-stp off
bridge-fd 0
source /etc/network/interfaces.d/*
EOF
Terminal window
💡 '语法要点:'
auto vmbr0
# pve管理网络
# 物理网卡 nic1(作为 vmbr0 的桥接端口)
# 这里物理网卡是桥接的那张网卡
iface vmbr0 inet static
address 10.2.1.101/24
bridge-ports nic1
bridge-stp off
bridge-fd 0
配置行含义
auto vmbr0开机自动启动这个 bridge
iface vmbr0 inet static静态 IP(不是 DHCP)
address 10.2.1.101/24IP 地址 + 子网掩码(/24)
bridge-ports nic1把 nic1 插到这个 bridge 上
bridge-stp off关闭生成树协议(单链路上不需要,省资源)
bridge-fd 0转发延迟设为 0(立即转发,不等待)
没有 gateway不上网,不需要网关!

📌 问题:vmbr0 到底是什么?它和物理网卡关系?

🧱 物理网卡 (eth0) vs Linux Bridge (vmbr)

🧱 vmbr0 到底是什么?

通俗类比:把物理网卡 eth0 想象成一根”网线”,vmbr0 就是这根网线另一头插的那个 ==虚拟交换机==

  • eth0 只负责收发数据帧,自己不拿 IP(你看 ip a 里 eth0 只有 MAC 地址,没有 inet
  • vmbr0 是 Linux 内核创建的虚拟交换机,它拿 IP 地址,它才是通信的”身份”
  • bridge-ports eth0 的意思是:把 eth0 这根网线插到 vmbr0 这个交换机上

inet manual 的意思是:“这张网卡本身不拿 IP,它只是给上面的 bridge 当物理出口”

就像交换机的端口不需要 IP 一样,eth 作为物理口也不需要 IP,IP 配在 vmbr 上

📌 一句话总结:

eth 是物理网线,vmbr 是插网线的交换机,IP 配在交换机上,不配在网线上

⚠️ 注意:vmbr0 的 MAC 地址 = eth0 的 MAC 地址,因为它们是一对”交换机-上联口”

Terminal window
6)重启网络让配置生效
root@pve:~# systemctl restart networking
root@pve:~# cat /etc/resolv.conf
search localhost
nameserver 223.6.6.6
root@pve:~# ping -W2 -c2 www.baidu.com
PING www.a.shifen.com (180.101.49.44) 56(84) bytes of data.
64 bytes from 180.101.49.44: icmp_seq=1 ttl=128 time=24.8 ms
64 bytes from 180.101.49.44: icmp_seq=2 ttl=128 time=24.4 ms
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 24.384/24.603/24.823/0.219 ms
7)升级软件源 & 安装必要软件
root@pve:~# apt-get update
root@pve:~# apt-get install -y vim tree wget bash-completion lrzsz net-tools sysstat iotop iftop htop unzip netcat-openbsd nmap telnet bc psmisc apache2-utils dnsutils nethogs sshpass expect cowsay sl
8)PS1 变量
root@pve:~# cat >> ~/.bashrc <<EOF
# 我的PS1变量
PS1='\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \W\[\e[0m\]\\$ '
EOF
root@pve:~# source ~/.bashrc
9)娱乐时间⌚️
===============
Debian/Ubuntu 系统中,sl、cowsay、fortune 等娱乐性质的程序传统上被归类为 "games",安装路径是 /usr/games/ 而不是常规的 /usr/bin/
root 用户的默认 $PATH 有时并不包含 /usr/games
永久解决方法
/usr/games 添加到 root 用户的 PATH 中:
===============
root@pve ~# echo 'export PATH=$PATH:/usr/games' >> ~/.bashrc
root@pve ~# source ~/.bashrc
root@pve ~# cowsay "Hello"
_______
< Hello >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
root@pve ~# rm -f /etc/update-motd.d/10-uname
root@pve ~# cat > /etc/update-motd.d/99-local << 'SCRIPT'
#!/bin/bash
cat << 'EOF'
(@) * (@) * (@)
: * (@) * (@) * .;
(@) * (@) * (@) * (@)
* ; * ; (@) * ; * :
;\ \ \ \| / / /;
\\ \ Y/ / /
`_\ |/ _' '
/ \\Y// \
( ,-}={-, )
\_//((\_/
//))(\
(/ ))
(/
EOF
SCRIPT
root@pve ~# chmod +x /etc/update-motd.d/99-local
root@pve ~# > /etc/issue && > /etc/issue.net
10)其他优化
root@pve ~# cat >>/etc/ssh/sshd_config<<EOF
UseDNS no
# 相当于网络命令的-n选项,这个就是说不解析为主机名,直接成IP地址.
GSSAPIAuthentication no
# 关闭GSS认证.
EOF
root@pve ~# systemctl restart ssh.service
11)系统盘挂载
'UUID挂载'
root@host01 ~# blkid
/dev/mapper/pve-root: UUID="b2666a2a-a057-4de1-9aa6-cdb1211809a5"
/dev/mapper/pve-swap: UUID="aba324d1-3307-4d83-88e2-5e9698138e20"
root@host01 ~# vim /etc/fstab
UUID="b2666a2a-a057-4de1-9aa6-cdb1211809a5" / ext4 errors=remount-ro 0 1
UUID="aba324d1-3307-4d83-88e2-5e9698138e20" none swap sw 0 0

Terminal window
浏览器测试访问
https://10.11.0.111:8006
'👆是我们桥接这张网卡' <-- Rocky中的火狐浏览器可以正常访问
=============================
https://10.0.0.211:8006
'👆是我们NAT这张网卡' <-- Windows中的edge浏览器可以正常访问

image-20260603144424139
image-20260603144424139

image-20260603144206838
image-20260603144206838

backup#

Terminal window
'两块硬盘' --> 系统盘 & 备份存储磁盘
'两张网卡' --> 额外添加一张桥接
# 10.2.1.104
'主机名' --> g2-pbs.pve.com
'访问web UI'
删除网关,添加IP配置(NAT)
'替换源'
cat > /etc/apt/sources.list.d/debian.sources <<'EOF'
Types: deb
URIs: http://mirrors.aliyun.com/debian/
Suites: trixie trixie-updates
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://mirrors.aliyun.com/debian-security/
Suites: trixie-security
Components: main contrib non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
==========================
cat > /etc/apt/sources.list.d/pbs-enterprise.sources <<'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/pbs
Suites: trixie
Components: pbs-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
==========================
apt-get update
apt-get install -y vim tree wget bash-completion lrzsz net-tools sysstat iotop iftop htop unzip netcat-openbsd nmap telnet bc psmisc apache2-utils dnsutils nethogs sshpass expect cowsay sl
cat >> ~/.bashrc <<EOF
# 我的PS1变量
PS1='\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \W\[\e[0m\]\\$ '
EOF
echo 'export PATH=$PATH:/usr/games' >> ~/.bashrc
source ~/.bashrc
cat > /etc/update-motd.d/99-local << 'SCRIPT'
#!/bin/bash
cat << 'EOF'
(@) * (@) * (@)
: * (@) * (@) * .;
(@) * (@) * (@) * (@)
* ; * ; (@) * ; * :
;\ \ \ \| / / /;
\\ \ Y/ / /
`_\ |/ _' '
/ \\Y// \
( ,-}={-, )
\_//((\_/
//))(\
(/ ))
(/
EOF
SCRIPT
chmod +x /etc/update-motd.d/99-local
> /etc/issue && > /etc/issue.net
cat >>/etc/ssh/sshd_config<<EOF
UseDNS no
# 相当于网络命令的-n选项,这个就是说不解析为主机名,直接成IP地址.
GSSAPIAuthentication no
# 关闭GSS认证.
EOF
systemctl restart ssh.service
Note
  • 关机拍快照

加入集群#

image-20260605100633414
image-20260605100633414

image-20260605100653917
image-20260605100653917

  • 加入集群

image-20260605100805832
image-20260605100805832

Note

集群状态 —> 断开连接 —> 另外两台重新登录

任务二#

在 PVE 集群上部署 Ceph Tentacle,创建 OSD 并配置 CephFS 和 RBD 共享存储

  • 在 WebUI 中点击 Datacenter → g2-host1 → Ceph,进行安装
  • 在 WebUI 中点击 Datacenter → g2-host2 → Ceph,进行安装
  • 在 WebUI 中点击 Datacenter → g2-host3 → Ceph,进行安装
  • 等待安装完成

image-20260605102924282
image-20260605102924282

  • 无订阅

image-20260605103127310
image-20260605103127310

Terminal window
'另外两台'同样也是需要添加Ceph集群
# 只需要安装即可! 配置已经在Host1中配置选择过了 公网 & 私网

image-20260605110507662
image-20260605110507662

  • 现在的状态是”不健康”❌️ —> 先不管它
Note

添加mon & mgr

创建mon

  • 点击 g2-host1 → Ceph → Monitor
  • 点击 Monitor → Create
  • 重复操作,分别在 host2、host3 上创建 Monitor
  • 等待所有 Monitor 启动完成

创建mgr

  • 点击 g2-host1 → Ceph → Monitor
  • 点击 Manager → Create
  • 在 host2、host3 也创建一个(用于高可用)

image-20260605110743058
image-20260605110743058

把另外两台都添加上去!

image-20260605110917767
image-20260605110917767

Note

添加 OSD 硬盘

在每个节点上创建 3 个 OSD(sdb、sdc、sdd),共 9 个

image-20260605111210805
image-20260605111210805

image-20260605111416284
image-20260605111416284

image-20260605111435175
image-20260605111435175

Tip

这次再添加完 mon & mgr & OSD磁盘就行健康了💚✅️

Note

创建RBD池 & CephFS

image-20260605112130448
image-20260605112130448

创建完之后, 就可以在==左上角==创建cephFS了

image-20260605112645402
image-20260605112645402

image-20260605113017460
image-20260605113017460

image-20260605113103289
image-20260605113103289

查看器群状态健康✅️

任务三#

image-20260605114530624
image-20260605114530624

image-20260605114719821
image-20260605114719821

image-20260605145307167
image-20260605145307167

image-20260605145944061
image-20260605145944061

image-20260605150015266
image-20260605150015266

image-20260605152154469
image-20260605152154469

任务四#

在三台 PVE 节点上分别使用 sde 磁盘创建不同类型的本地存储

image-20260605152741084
image-20260605152741084

image-20260605152853088
image-20260605152853088

image-20260605153117447
image-20260605153117447

image-20260608161853507
image-20260608161853507

image-20260605153301422
image-20260605153301422

任务五#

在管理操作节点(node)上部署 NFS 和 Samba 服务,并将共享目录添加到 PVE 集群

Terminal window
1)nfs下载安装
[root@node-200 ~]# dnf -y install nfs-utils
[root@node-200 ~]# mkdir -p /srv/nfs/share
[root@node-200 ~]# echo '/srv/nfs/share 10.11.0.0/24(rw,sync,no_subtree_check,no_root_squash)' >> /etc/exports
[root@node-200 ~]# systemctl enable --now nfs-server
Created symlink '/etc/systemd/system/multi-user.target.wants/nfs-server.service' '/usr/lib/systemd/system/nfs-server.service'
[root@node-200 ~]# showmount -e 10.11.0.128
Export list for 10.11.0.128:
/srv/nfs/share 10.11.0.0/24

image-20260606082808206
image-20260606082808206

node节点接着安装samba

Terminal window
'下载samb'
[root@node-200 ~]# yum -y install samba
[root@node-200 ~]# mkdir -p /srv/samba/share
[root@node-200 ~]# groupadd -g 888 smbuser
[root@node-200 ~]# useradd -g 888 -u 888 smbuser
[root@node-200 ~]# pdbedit -a smbuser
New password:
Retype new password:
[root@node-200 ~]# chown smbuser:smbuser /srv/samba/share/
[root@node-200 ~]# cat >> /etc/samba/smb.conf <<'EOF'
[samba-share]
path = /srv/samba/share
write list = smbuser
valid users = smbuser
EOF
[root@node-200 ~]# getenforce
Disabled
[root@node-200 ~]# systemctl is-active firewalld.service
inactive
[root@node-200 ~]# systemctl enable --now smb nmb

image-20260606085921119
image-20260606085921119

image-20260608161932196
image-20260608161932196

任务六#

在三台 PVE 节点上使用 nic5 创建 Open vSwitch 网桥 vmbr1

Terminal window
'安装 Open vSwitch'
root@host01 ~# apt -y install openvswitch-switch
root@host02 ~# apt -y install openvswitch-switch
root@host03 ~# apt -y install openvswitch-switch

image-20260606095119856
image-20260606095119856

Note

最后别忘记了应用配置

image-20260606095310298
image-20260606095310298

image-20260606095359401
image-20260606095359401

Note

把原来nic5里面的IP地址可以清除掉!

  • 三台都清理掉

image-20260606095916393
image-20260606095916393

image-20260606100033702
image-20260606100033702

image-20260606100111594
image-20260606100111594

Warning
  • 关机拍快照
    • 先启动node & backup
    • 在启动host

任务7#

image-20260606103222013
image-20260606103222013

image-20260606103532304
image-20260606103532304

image-20260606103648077
image-20260606103648077

Note

这个子网最后并没有用到 —> 后面我们用的==静态的==(非DHCP) —> 手动指定172.17.2.xxx

image-20260606103947960
image-20260606103947960

任务八#

image-20260606104441363
image-20260606104441363

Terminal window
✅️ 上传两个镜像到node节点的根目录下/root
# 用Xshell上传
[root@node-200 ~]# ls /root/ | grep Rocky
Rocky-10.2-x86_64-minimal.iso
Rocky-10-GenericCloud-Base.latest.x86_64.qcow2
Note

上传至 —> CephFS存储

  • 在一个节点(hots1)上传后, 别的节点在cephfs也可以看到!

image-20260606104801804
image-20260606104801804

  • 上传完毕后, 等一会

image-20260606105100298
image-20260606105100298

任务九#

Terminal window
'node节点操作'
[root@node-200 ~]# dnf -y install guestfs-tools
[root@node-200 ~]# dnf -y install qemu-kvm libvirt virt-install virt-viewer
[root@node-200 ~]# for drv in qemu network nodedev nwfilter secret storage interface; do \
systemctl enable --now virt${drv}d.socket; \
done
[root@node-200 ~]# systemctl daemon-reload
[root@node-200 ~]# for drv in qemu network nodedev nwfilter secret storage interface; do \
systemctl enable --now virt${drv}d.socket; \
done
[root@node-200 ~]# systemctl list-units --type=socket | grep virt
virtinterfaced.socket loaded active listening libvirt
virtnetworkd.socket loaded active listening libvirt
virtnodedevd.socket loaded active listening libvirt
virtnwfilterd.socket loaded active listening libvirt
virtqemud.socket loaded active listening libvirt
virtsecretd.socket loaded active listening libvirt
virtstoraged.socket loaded active listening libvirt
[root@node-200 ~]# guestfish -i --network -a /root/Rocky-10-GenericCloud-Base.latest.x86_64.qcow2
⚠️ 我的镜像在/root目录下
[root@node-200 ~]# ls -lhd /root
dr-xr-x---. 15 root root 4.0K Jun 6 10:44 /root
✅️ 它的这个目录/root权限有点特殊,我们移动到别的地方!
[root@node-200 ~]# cp /root/Rocky-10-GenericCloud-Base.latest.x86_64.qcow2 /var/lib/libvirt/images/
[root@node-200 ~]# chown root:qemu /var/lib/libvirt/images/Rocky-10-GenericCloud-Base.latest.x86_64.qcow2
[root@node-200 ~]# chmod 644 /var/lib/libvirt/images/Rocky-10-GenericCloud-Base.latest.x86_64.qcow2
[root@node-200 ~]# guestfish -i --network -a /var/lib/libvirt/images/Rocky-10-GenericCloud-Base.latest.x86_64.qcow2
Welcome to guestfish
Type: ‘help’ for help on commands
‘man’ to read the manual
‘quit’ to quit the shell
Operating system: Rocky Linux 10.2 (Red Quartz)
/dev/sda4 mounted on /
/dev/sda3 mounted on /boot
/dev/sda2 mounted on /boot/efi
><fs> command "yum -y install httpd"
...........
Complete!
><fs> touch /var/www/html/index.html
><fs> write /var/www/html/index.html "rocky-index"
><fs> cat /var/www/html/index.html
rocky-index
><fs> command "systemctl enable httpd"
><fs> command "systemctl is-enabled httpd"
enabled
><fs> selinux-relabel /etc/selinux/targeted/contexts/files/file_contexts /
><fs> exit
Note
  • 把这个 qcow2镜像 拷贝出来
    • 拷贝到桌面 —> 添加上去
      • 这个镜像里面预装了 ==httpd服务==
      • ⚠️ 一定不要上传错误

image-20260606162907766
image-20260606162907766

image-20260606115911859
image-20260606115911859

image-20260606120116939
image-20260606120116939

image-20260606120149826
image-20260606120149826

任务十#

使用 Rocky Linux 10 ISO 安装虚拟机 vm1,安装 qemu-guest-agent 后转换为 PVE 模板

image-20260606120610840
image-20260606120610840

image-20260606120708728
image-20260606120708728

image-20260606120744531
image-20260606120744531

image-20260606120939058
image-20260606120939058

image-20260606122042426
image-20260606122042426

  • 让虚拟机 CPU 尽量匹配宿主机
  • “类型” 改为:
    • kvm64(最推荐!通用、安全、兼容性强,自动适配宿主机能力)
场景CPU 类型
宿主机真实 CPUAMD Ryzen 5 5600H

  • 内存、网络都默认即可

image-20260606121548830
image-20260606121548830

Terminal window
'host1节点'
1)查看配置文件信息
root@host01 ~# cat /etc/pve/qemu-server/100.conf
✅️ 这里面装的是配置文件
boot: order=scsi0;ide2;net0
cores: 2
cpu: kvm64
2)过滤CPU信息
root@host01 ~# cat /etc/pve/qemu-server/100.conf | grep -E '^cpu:'
cpu: kvm64
3)启动虚拟机
root@host01 ~# qm start 100
start failed: QEMU exited with code 1
❌️ '最后依旧是起不来'

既然 PVE 的原生 cpu: 参数走不通,我们必须绕过 PVE 的解析器

直接使用底层的 args: 参数向 QEMU 传递完整的 CPU 定义

🎯 终极解决方案:纯 args 透传法#

Terminal window
步骤 1:清理配置文件中的 cpu args
root@host01 ~# vim /etc/pve/qemu-server/100.conf
删除 所有的 cpu: ...
删除 所有的 args: ...
步骤 2:添加精准的 QEMU 底层参数
'在配置文件中添加以下唯一一行 args'
# 整行复制,不要换行
args: -cpu host,+invtsc,-pcid,-cmp-legacy,-perfctr-core,-amd-stibp,-xsaveerptr
步骤 3:重启虚拟机
qm stop 100
qm start 100
kvm: warning: ...xxx
kvm: warning: ...xxx
'警告⚠️信息不用管'

image-20260606133534052
image-20260606133534052

image-20260606134914910
image-20260606134914910

Terminal window
[C:\~]$ ssh root@172.31.31.159
'可以从Xshell中成功登录进来!'
Connecting to 172.31.31.159:22...
Connection established.
=======================
Last login: Sat Jun 6 13:46:18 2026
1)安装并启动
[root@jiuzhao ~]# dnf -y install qemu-guest-agent
[root@jiuzhao ~]# systemctl enable --now qemu-guest-agent
'卡住了!'
^C
[root@jiuzhao ~]# reboot
'重启一下!'

image-20260606140721386
image-20260606140721386

image-20260606140959476
image-20260606140959476

Note

手动启动后,再重启一下虚拟机

image-20260606141233603
image-20260606141233603

关机 —> 更多 —> 装换模版 —> 是

image-20260606141412241
image-20260606141412241

image-20260606141829543
image-20260606141829543

任务十一#

Note

右上更多 —> 克隆

image-20260606142002367
image-20260606142002367

image-20260606142057647
image-20260606142057647

image-20260606142442584
image-20260606142442584

Note

必须关机做快照

  • 快照名称必须得是英文

image-20260606143226897
image-20260606143226897

Important

开机 —> 删除用户

image-20260606143741947
image-20260606143741947

Important

关机 —> 恢复快照 —> 验证用户

image-20260606143936489
image-20260606143936489

image-20260606144047569
image-20260606144047569

任务十二#

Important
  • 这次是在host02节点上创建虚拟机

image-20260606145750898
image-20260606145750898

image-20260606145815675
image-20260606145815675

image-20260606150021876
image-20260606150021876

image-20260606150242037
image-20260606150242037

image-20260606150143850
image-20260606150143850

内存 & 网络都==默认==就行

修改硬件#

image-20260606154416965
image-20260606154416965

image-20260606154503620
image-20260606154503620

image-20260606154953681
image-20260606154953681

image-20260606155600111
image-20260606155600111

image-20260606155100323
image-20260606155100323

image-20260606155202694
image-20260606155202694

image-20260606155416311
image-20260606155416311

image-20260606155439956
image-20260606155439956

image-20260606155729328
image-20260606155729328

Important
  • 依旧是Cpu架构选的有问题!
    • ==host2==
Terminal window
root@host02 ~# cd /etc/pve/qemu-server/
root@host02 qemu-server# ls
102.conf
root@host02 qemu-server# cd
root@host02 ~# vim /etc/pve/qemu-server/102.conf
'把CPU行删除了 --> 行尾加上这个'
args: -cpu host,+invtsc,-pcid,-cmp-legacy,-perfctr-core,-amd-stibp,-xsaveerptr
root@host02 ~# qm stop 102
root@host02 ~# qm start 102
generating cloud-init ISO
✅️ 现在就能够启动起来了

image-20260606164305694
image-20260606164305694

Note
  • 它和上面 vm1-clone 在同一网段!
    • 启动 vm1-clone

image-20260606160322309
image-20260606160322309

image-20260606164336177
image-20260606164336177

image-20260606164926086
image-20260606164926086

image-20260606165047225
image-20260606165047225

任务十三#

在 PVE 中下载 LXC 容器模板和 OCI 标准容器镜像

image-20260606165306424
image-20260606165306424

image-20260606165354818
image-20260606165354818

image-20260606165526674
image-20260606165526674

Terminal window
引用: docker.m.daocloud.io/busybox
标签: latest
文件名: busybox_latest

image-20260606170428840
image-20260606170428840

image-20260606170450837
image-20260606170450837

image-20260606171038240
image-20260606171038240

任务十四#

基于 LXC 模板创建两个容器 c1 和 c2,部署在不同主机,使用 OVS 网桥 vmbr1,VLAN Tag = 200

image-20260606171346417
image-20260606171346417

image-20260606171421371
image-20260606171421371

image-20260606171458777
image-20260606171458777

Cpu & 内存都默认下一步

image-20260606171558719
image-20260606171558719

image-20260606171821961
image-20260606171821961

image-20260606172249323
image-20260606172249323

image-20260606174648626
image-20260606174648626

静态IP & vlan#

network
network

Terminal window
========================================
'下面这两个都是vmbr0🌐' <-- Rocky Linux 10
没有Vlan
========================================
1)vm1-clone
[root@jiuzhao ~]# nmcli con modify ens18 ipv4.method manual ipv4.addresses 172.17.2.101/24
'没法补全只能手打' ✅️ 注意后面/24 <-- 子网掩码
⚠️ method ⚠️ methon × ⚠️
[root@jiuzhao ~]# nmcli con up ens18
Connection successfully activated
2)vm2
[root@vm2 ~]# nmcli con show
NAME UUID TYPE DEVICE
Wired connection 1 caa7d4xxx ethernet ens18
lo ad4c71xxx loopback lo
⚠️ 'Wired connection 1' <-- 单引号括起来
[root@vm2 ~]# nmcli con modify 'Wired connection 1' ipv4.method manual ipv4.address 172.17.2.102/24
[root@vm2 ~]# nmcli con up 'Wired connection 1'
Connection successfully activated
[root@vm2 ~]# ping -W2 -c2 172.17.2.101
PING 172.17.2.101 (172.17.2.101) 56(84) bytes of data.
64 bytes from 172.17.2.101: icmp_seq=1 ttl=64 time=1.09 ms
64 bytes from 172.17.2.101: icmp_seq=2 ttl=64 time=0.640 ms
--- 172.17.2.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.640/0.862/1.085/0.222 ms
'✅️ 可以成功ping通'

Terminal window
========================================
'下面两个容器都是vmbr1🌐' <-- Alpin-3.23
Vlan200
========================================
3)修改c1网络(静态) --> 172.17.2.103
✅️ c1创建在host1中, 'c2创建在host2中'

image-20260606201050680
image-20260606201050680


Terminal window
4)创建c2的同时'指定Vlan200'
⚠️ 依旧是Alpine镜像

image-20260606195527511
image-20260606195527511

alpin —> 磁盘(默认下一步) —> … —> ==网络==

image-20260606200722774
image-20260606200722774

DNS —> 确认

  • 👆 默认下一步!
Terminal window
c2:~# ip a
1: lo: xxx
inet 127.0.0.1/8 scope host lo
2: eth0@if35: xxx
link/ether bc:24:11:9c:c7:ce brd ff:ff:ff:ff:ff:ff
inet 172.17.2.104/24 scope global eth0
=========================
①测试和vm1-clone联通性 ❌️
c2:~# ping -W2 -c2 172.17.2.101
PING 172.17.2.101 (172.17.2.101): 56 data bytes
--- 172.17.2.101 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss ❌️
=========================
②测试和c1的联通性 ✅️
c2:~# ping -W2 -c2 172.17.2.103
PING 172.17.2.103 (172.17.2.103): 56 data bytes
64 bytes from 172.17.2.103: seq=0 ttl=64 time=4.449 ms
64 bytes from 172.17.2.103: seq=1 ttl=64 time=0.373 ms
--- 172.17.2.103 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss ✅️
round-trip min/avg/max = 0.373/2.411/4.449 ms

任务十五#

基于 OCI 容器镜像创建 c3 和 c4,使用 VXLAN 网络(VNI 100),部署在不同节点

image-20260606213001631
image-20260606213001631

  • 等一会就行了

image-20260606213117094
image-20260606213117094

Terminal window
========================================
'下面两个容器都是mynet🌐' <-- busybox
⚠️ Vlan100 ⚠️ c3 & c4
========================================
root@host01 ~# ip -d link show | grep vxlan
100: vxlan_myvnet: xxx
vxlan id 100 srcport 0 0 dstport 4789 ttl auto ageing
5)c3创建
# 172.17.2.105
✅️ 我们这次在host2创建 --> C3
busybox --> 172.17.2.105/24(mynet)'无需vlan已经设置过了'

image-20260606214345414
image-20260606214345414

Note

⚠️ 控制台由 console —> shell

image-20260606214831208
image-20260606214831208

Terminal window
~ # ip a
1: lo: xxx
inet 127.0.0.1/8 scope host lo
2: eth0@if44: xxx
link/ether bc:24:11:af:fd:83 brd ff:ff:ff:ff:ff:ff
inet 172.17.2.105/24 brd 172.17.2.255 scope global eth0
===================
~ # ping -W2 -c2 172.17.2.1
PING 172.17.2.1 (172.17.2.1): 56 data bytes
--- 172.17.2.1 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
===================
~ # ping -W2 -c2 172.17.2.3
PING 172.17.2.3 (172.17.2.3): 56 data bytes
--- 172.17.2.3 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

Terminal window
6)'c4创建'
# 172.17.2.106
✅️ 我们这次在host3创建 --> C4
busybox --> 172.17.2.106/24(mynet)'无需vlan已经设置过了'

image-20260606214945892
image-20260606214945892

Note

⚠️ 控制台由 console —> shell

Terminal window
~ # ip a
1: lo: xxx
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0@if17: xxx
link/ether bc:24:11:c7:f4:1e brd ff:ff:ff:ff:ff:ff
inet 172.17.2.106/24 brd 172.17.2.255 scope global eth0
===================
~ # ping -W2 -c3 172.17.2.101
PING 172.17.2.101 (172.17.2.101): 56 data bytes
--- 172.17.2.101 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
===================
~ # ping -W2 -c3 172.17.2.103
PING 172.17.2.103 (172.17.2.103): 56 data bytes
--- 172.17.2.103 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
===================
~ # ping -W2 -c3 172.17.2.105
PING 172.17.2.105 (172.17.2.105): 56 data bytes
64 bytes from 172.17.2.105: seq=0 ttl=64 time=0.522 ms
64 bytes from 172.17.2.105: seq=1 ttl=64 time=0.431 ms
64 bytes from 172.17.2.105: seq=2 ttl=64 time=0.307 ms
--- 172.17.2.105 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.307/0.420/0.522 ms

任务十六#

配置 PVE 安全组,控制 vm1 的端口访问(允许 HTTP/SSH,拒绝其他)

Tip

vm2(qcow2云镜像) —> 里面有httpd服务

那么这些防火墙的规则就是最终要在vm2上面生效

  • 上面的实验我们已经把vm1-clone和vm2放在了同一个网段(172.17.2.xxx/24)
  • 为了我用Xshell连接方便,我们给==vm1-clone==再添加一张网卡(桥接)
  • 我们在vm1里面验证防火墙是否生效

image-20260607091041238
image-20260607091041238

image-20260607091148157
image-20260607091148157

Terminal window
[C:\~]$ ssh root@172.31.31.91
Connecting to 172.31.31.91:22...
Connection established.
[root@jiuzhao ~]# hostname -I
172.17.2.101 172.31.31.91
'两个IP地址!'
===================
[root@jiuzhao ~]# ping -W2 -c3 172.17.2.102
PING 172.17.2.102 (172.17.2.102) 56(84) 字节的数据。
64 字节,来自 172.17.2.102: icmp_seq=1 ttl=64 时间=5.16 毫秒
64 字节,来自 172.17.2.102: icmp_seq=2 ttl=64 时间=0.688 毫秒
64 字节,来自 172.17.2.102: icmp_seq=3 ttl=64 时间=0.598 毫秒
--- 172.17.2.102 ping 统计 ---
已发送 3 个包, 已接收 3 个包, 0% packet loss, time 2060ms
rtt min/avg/max/mdev = 0.598/2.147/5.155/2.127 ms
===================
[root@jiuzhao ~]# ping -W2 -c3 172.17.2.104
PING 172.17.2.104 (172.17.2.104) 56(84) 字节的数据。
来自 172.17.2.101 icmp_seq=1 目标主机不可达
来自 172.17.2.101 icmp_seq=2 目标主机不可达
来自 172.17.2.101 icmp_seq=3 目标主机不可达
--- 172.17.2.104 ping 统计 ---
已发送 3 个包, 已接收 0 个包, +3 错误, 100% packet loss, time 2063ms
pipe 3
===================
[root@jiuzhao ~]# ping -W2 -c3 172.17.2.106
PING 172.17.2.106 (172.17.2.106) 56(84) 字节的数据。
来自 172.17.2.101 icmp_seq=1 目标主机不可达
来自 172.17.2.101 icmp_seq=2 目标主机不可达
来自 172.17.2.101 icmp_seq=3 目标主机不可达
--- 172.17.2.106 ping 统计 ---
已发送 3 个包, 已接收 0 个包, +3 错误, 100% packet loss, time 2082ms
===================
[root@jiuzhao ~]# ssh root@172.17.2.102
root@172.17.2.102: Permission denied ❌️
[root@jiuzhao ~]# ssh-keygen
[root@jiuzhao ~]# ssh-copy-id root@172.17.2.102
'因为这个vm2云镜像默认禁止密码登录'
# 所以我们没有办法通过这种方式拷贝公钥
✅️ 手动查看公钥
[root@jiuzhao ~]# cat /root/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEUfzvfEr7ANkqmxNMQnQzjw3stC6WC40B4ubOxRc6Fj 'root@jiuzhao'
⚠️ 后面的 'root@..' 不复制
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEUfzvfEr7ANkqmxNMQnQzjw3stC6WC40B4ubOxRc6Fj
✅️ 只能手动在vm2中添加公钥

image-20260607091905841
image-20260607091905841

Note

添加完成之后重启一下虚拟机

Terminal window
[root@jiuzhao ~]# ssh root@172.17.2.102
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATIO
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[root@jiuzhao ~]# > /root/.ssh/known_hosts
'再次尝试登录'
[root@jiuzhao ~]# ssh root@172.17.2.102
Web console: https://vm2:9090/
Last login: Sat Jun 6 11:30:07 2026
[root@vm2 ~]# hostname -I
172.17.2.102
[root@vm2 ~]# curl localhost
rocky-index
✅️ 里面有httpd服务
[root@vm2 ~]# exit
'ssh退出vm2后, 依旧可以通过IP访问服务'
[root@jiuzhao ~]# curl 172.17.2.102
rocky-index
✅️ 此时'数据中心'防火墙没有生效

image-20260607093241127
image-20260607093241127

创建安全群组#

Terminal window
root@host01 ~# systemctl stop pve-firewall
root@host02 ~# systemctl stop pve-firewall
root@host03 ~# systemctl stop pve-firewall
Note

我这里只要把数据中心的防火墙开启, 我的web页面就连不上了! Xshell也连不上了!

  • 所以先手动把它们的防火墙关了

image-20260607093331125
image-20260607093331125

  • 我们这里先默认拒绝所有
    • 目的IP 172.17.2.102

image-20260607102739041
image-20260607102739041

  1. 启动数据中心的防火墙
  2. 插入安全组 —> vm2
  3. 启动vm2的防火墙

image-20260607094547597
image-20260607094547597

image-20260607103444400
image-20260607103444400

image-20260607103358384
image-20260607103358384

image-20260607103509254
image-20260607103509254

Terminal window
root@host02 ~# systemctl start pve-firewall
===================
[root@jiuzhao ~]# curl 172.17.2.102
curl: (7) Failed to connect to 172.17.2.102 port 80
===================
[root@jiuzhao ~]# ping -W2 -c2 172.17.2.102
PING 172.17.2.102 (172.17.2.102) 56(84) 字节的数据。
--- 172.17.2.102 ping 统计 ---
已发送 2 个包, 已接收 0 个包, 100% packet loss, time 1007ms
===================
root@host02 ~# systemctl stop pve-firewall

image-20260607103929231
image-20260607103929231

image-20260607103959964
image-20260607103959964

把80和22端口添加进去!

image-20260607104056250
image-20260607104056250

Terminal window
root@host02 ~# systemctl start pve-firewall
'需要手动重启一下ssh服务'
===================
[root@jiuzhao ~]# ssh root@172.17.2.102
Web console: https://vm2:9090/
Last login: Sun Jun 7 03:16:38 2026 from 172.17.2.101
[root@vm2 ~]# exit
logout
Connection to 172.17.2.102 closed.
===================
[root@jiuzhao ~]# curl 172.17.2.102
rocky-index
===================
[root@jiuzhao ~]# ping -W2 -c2 172.17.2.102
PING 172.17.2.102 (172.17.2.102) 56(84) 字节的数据。
--- 172.17.2.102 ping 统计 ---
已发送 2 个包, 已接收 0 个包, 100% packet loss, time 1001ms
===================
root@host02 ~# systemctl stop pve-firewall
Note

ping不通 ---> ICMP协议

image-20260607112618311
image-20260607112618311

Terminal window
root@host02 ~# systemctl start pve-firewall
===================
[root@jiuzhao ~]# ping -W2 -c2 172.17.2.102
PING 172.17.2.102 (172.17.2.102) 56(84) 字节的数据。
64 字节,来自 172.17.2.102: icmp_seq=1 ttl=64 时间=1.41 毫秒
64 字节,来自 172.17.2.102: icmp_seq=2 ttl=64 时间=0.587 毫秒
--- 172.17.2.102 ping 统计 ---
已发送 2 个包, 已接收 2 个包, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.587/0.998/1.410/0.411 ms
✅️ 现在就能ping通了!
===================
root@host02 ~# systemctl stop pve-firewall

任务十七#

迁移vm2 —> host3中

  • 我们得 ==在线迁移==(热迁移)

image-20260607124109249
image-20260607124109249

Note

‘TASK ERROR: migration problems’ ❌️ 第一次迁移失败,因为CPU标志会阻止热迁移!

那我们关机 —> 试试冷迁移

image-20260607125236416
image-20260607125236416

  • 我们开机试一试

image-20260607125618926
image-20260607125618926


Note

我们==新建==C7容器 **热迁移 **

✅️ 新建的目的是为了有共享存储

  • 从host1 —> host3
    • 在线迁移

image-20260607132450669
image-20260607132450669

image-20260607131837611
image-20260607131837611

Important
  • rbd 共享存储池

image-20260607132516252
image-20260607132516252

image-20260607132552409
image-20260607132552409

启动C2 <— host2

  • Alpine vmbr1 vlan200
    • 172.17.2.104/24
Terminal window
c7:~# ip a
1: lo: xxx
inet 127.0.0.1/8 scope host lo
2: eth0@if19: xxx
link/ether bc:24:11:7f:02:60 brd
inet 172.17.2.107/24 scope global eth0
===================
c7:~# ping -W2 -c2 172.17.2.104
PING 172.17.2.104 (172.17.2.104): 56 data bytes
64 bytes from 172.17.2.104: seq=0 ttl=64 time=2.678 ms
64 bytes from 172.17.2.104: seq=1 ttl=64 time=0.306 ms
--- 172.17.2.104 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.306/1.492/2.678 ms

image-20260607133434722
image-20260607133434722

image-20260607133505679
image-20260607133505679

image-20260607133532844
image-20260607133532844

Terminal window
c7:~# ip a
2: eth0@if19: xxx
link/ether bc:24:11:7f:02:60 brd
inet 172.17.2.107/24
===================
c7:~# ping -W2 -c2 172.17.2.104
PING 172.17.2.104 (172.17.2.104): 56 data bytes
64 bytes from 172.17.2.104: seq=0 ttl=64 time=2.678 ms
✅️ 迁移后依旧可以ping通

任务十八#

将容器 c7 配置为 HA 模式,模拟节点故障测试自动恢复

image-20260607145412506
image-20260607145412506

image-20260607150129739
image-20260607150129739

手动==暂停(关机)==host3节点

image-20260607151936101
image-20260607151936101

image-20260607152052549
image-20260607152052549

任务十九#

在 PVE 集群中配置存储复制,将虚拟机/容器存储定期复制到目标节点

Note
  • 只有ZFS才可以复制!
    • 在 hsots3 添加一块磁盘

image-20260607153037803
image-20260607153037803

image-20260607153615186
image-20260607153615186

image-20260607160246630
image-20260607160246630

Tip
  • 重启生效

image-20260607160041237
image-20260607160041237

Note

创建zfs存储此zfs的命名要跟移动容器所在的zfs的命名一样

image-20260607160319088
image-20260607160319088

image-20260607163921979
image-20260607163921979

  • 我自己做的时候, 添加错了 —> 名字一样才行!
    • 有的用的是后面作业的文档📄

把c2 —> 从host2 复制到 hosts3

image-20260607160605239
image-20260607160605239

  • 启动c2容器

过 三分钟 —> 复制到host03

image-20260607161145683
image-20260607161145683

Tip
  • 过一会就有信息了!

image-20260608162651094
image-20260608162651094

任务二十#

创建 PVE 到 PBS 的备份任务,执行备份和恢复测试

image-20260607161754413
image-20260607161754413

image-20260607161916547
image-20260607161916547

image-20260607162007351
image-20260607162007351

image-20260607162050378
image-20260607162050378

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

PVE开源虚拟化管理平台
https://www.kpyun.fun/posts/services/virt/virt04/
作者
久棹
发布于
2026-04-25
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录