U盘安装pve虚拟化
概述
Proxmox VE(Virtual Environment)是一个完整的、开源的企业虚拟化服务器管理平台。它将KVM管理程序和Linux Containers (LXC)、软件定义的存储和网络功能紧密集成在一个平台上。通过集成的基于web的用户界面,您可以轻松地管理vm和容器、集群的高可用性或集成的灾难恢复工具。
pve的特点:
- PVE 的虚拟化核心是 QEMU/KVM
- pve 的软件和社区支持都是免费的,企业用户则可以通过订阅制获得付费商业支持
- 网络方面,PVE 支持桥接和路由两种方式(默认是桥接)
相对于 VMware Esxi 虚拟化,pve的优势如下:
- pve 是开源项目,可以认为 不存在授权问题,而 VMware Esxi 免费试用60天
- 对硬件兼容性更好:支持笔记本、台式机、服务器等,且 pve 支持 Intel 和 AMD 的 cpu(vmware不支持AMD)
- 去中心化:基于Web的管理界面,无需部署独立的vCenter管理节点,每个节点都是Master,可以在任意节点管理集群
- 多台 PVE 节点可以组成一个集群(cluster)
制作开机启动盘
1、制作开机启动u盘,请参考 制作启动u盘
2、下载最新的 proxmox-ve_7.4-1.iso
并将其拷贝到u盘根目录,示例版本 7.2-1
开始安装 PVE 系统
第1步,将u盘插入需要安装pve系统的服务器,开机按 DELETE 进入 BIOS,调整USB设备启动
第2步,进入如下界面,选择 Install Proxmox VE
第3步,选择要安装到哪个磁盘设备,并点击下一步
第4步,设置时区,建议设置为 Asia/Shanghai
第5步,设置管理员账号(root)密码和邮箱
第6步,设置网络及IP地址,默认第一片网卡,如果网线接在别的网卡上,请务必修改,否则会访问失败
第7步,确认配置无误后,点击安装
第8步,开始安装中 ...
第9步,安装完成后,重启
第10步,安装完成后,会显示 pve 的 Web管理界面
第11步,在上一步输入 root 及密码后,可以登录后台,执行 cat /etc/os-release
可以看出底层系统是 Debian 11
操作系统
root@node01:/dev/pve# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
第12步,登录Web管理界面
- 地址:
https://ip:8006
- 账号:
root
- 密码:
安装时设置的密码
注:安装pve会自动化格式化硬盘,无需单独格式化。
常用功能
安装第一台虚拟机
第1步,浏览器访问 https://ip:8006
,上传os镜像文件到共享存储中
第2步,创建虚拟机,以虚拟光驱形式挂载该iso镜像到 CD/DVD 设备上,然后开始安装系统
创建模板并通过模板克隆虚拟机
第1步,选中需要设为模板的虚拟机,先关机(不要创建快照),再右键选择 Convert to templage
第2步,设为镜像模板之后,请注意该虚拟机的图标变了
第3步,选中该模板镜像,右键选择 Clone,注意 Mode 改为 Full Clone(默认为 Linked Clone)
注:不建议直接对某虚拟机右键选择 Clone 的方式来克隆虚拟机,如下是错误示范:
配置虚拟机为自启动
修改 nic
假设服务器有3块网卡(
enp2s0f0
、wlp3s0
、enx2c16dba9a0f3
),安装pve的时候网卡选错为enp2s0f0
,需要改为enx2c16dba9a0f3
。root\@pve:~# cat /etc/network/interfaces auto lo iface lo inet loopback
iface enp2s0f0 inet manual
auto vmbr0 iface vmbr0 inet static address 192.168.20.181/22 gateway 192.168.23.254 bridge-ports enp2s0f0 bridge-stp off bridge-fd 0
iface enx2c16dba9a0f3 inet manual
iface wlp3s0 inet manual
登录pve的 >_ Shell 控制台,修改如下文件,最后重启网卡服务以生效。
vi /etc/network/interfaces #.找到 bridge-ports enp2s0f0 #.改为 bridge-ports enx2c16dba9a0f3
service networking restart
修改 ip
登录pve的 >_ Shell 控制台,修改如下文件,其中
/etc/issue
修改的是欢迎界面的显示地址ip(不配置也不影响使用),最后重启网卡服务以生效。oldip=192.168.4.195 newip=192.168.4.196
sed -i "s/
$oldip/$
newip/g" /etc/network/interfaces sed -i "s/$oldip/$
newip/g" /etc/hosts sed -i "s/$oldip/$
newip/g" /etc/issuecat /etc/network/interfaces | egrep "(address|gateway)" service networking restart
修改 dns
登录pve的 >_ Shell 控制台,修改如下文件,并重启网卡服务以生效。
olddns=192.168.3.10 newdns=192.168.3.11
sed -i "s/
$olddns/$
newdns/g" /etc/resolv.confcat /etc/resolv.conf service networking restart
修改 hostname
登录pve的 >_ Shell 控制台,修改如下文件,执行 Reboot 以生效。
oldname=pve01 newname=pve02
hostnamectl set-hostname
$newname sed -i "s/$
oldname/$newname/g" /etc/hostname sed -i "s/$
oldname/$newname/g" /etc/hosts sed -i "s/$
oldname/$newname/g" /etc/postfix/main.cfreboot
修改虚机机的 vmid name
登录pve的 >_ Shell 控制台,执行 qm list
找到这台虚机的 vmid(示例将102从 k8s-node2 改为 8s-node2-4.232),然后执行 qm config <vmid>
确认一下老的 vmid name,再执行 qm set <vmid> --name <newname>
来修改 vmid name(亲测有效)。
root@node01:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
100 linux-template stopped 4096 40.00 0
101 k8s-node1 running 4096 40.00 4963
102 k8s-node2 running 4096 40.00 8673
103 win10-4.240 running 4096 32.00 599826
104 ubuntu-template stopped 4096 32.00 0
root@node01:~# qm config 102 | grep name
name: k8s-node2
root@node01:~# qm set 102 --name k8s-node2-4.232
update VM 102: -name k8s-node2-4.232
root@node01:~# qm list | grep 102
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
102 k8s-node2-4.232 running 4096 40.00 8673
注:同样的办法,可以使用 qm set
修改某 的其他参数。
修改虚拟机的 vmid
登录pve的 >_ Shell 控制台,执行 qm list
找到这台虚机的 vmid,示例将 k8s-node4-4.204
从 115 改为 114
root@node01:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
113 win10-yu-4.205 stopped 4096 50.00 0
115 k8s-node4-4.204 running 4096 40.00 0
先执行 qm stop <vmid>
将该虚拟机关机,然后调整vmid配置文件:
qm stop 115
cd /etc/pve/qemu-server
mv 115.conf 114.conf
快照与恢复
创建快照
- 选中需要创建快照的虚拟机,依次选择 Snapshots - Take Snapshot,填写快照名称并创建。
恢复快照
- 选中需要恢复快照的虚拟机,在 Snapshots 标签页,选择需要的快照,点击上面的 Rollback 按钮并恢复。
备份与迁移
有2台PVE服务器,但是没有做集群,现在需要把一个虚拟机从 node01 上迁移到 node02 上。
备份迁移的注意事项
- 互相迁移的节点,需要虚拟机在同一个储存点。例如一个是local-lvm,那么另一个必须是local-lvm,否则不能迁移。
- 互相迁移的节点,网卡一定要一样。例如一个是vmbr0,那么另外一个也要是vmbr0。
- 迁移的虚拟机,挂载了ISO的话,迁移需要另外的虚拟机,在同样位置有同样的iso,否则不能迁移。最好的办法就是卸载iso。
- 链接克隆的无法迁移。必须是完整克隆才能迁移。
- 热迁移只适合共享储存。例如SAN/NFS等储存。
- 迁移后,原虚机的快照将会丢失
操作步骤
- 第1步,打开 node01 的web页面将虚拟机关机(stop模式提供最强的数据一致性),并在 Backup 标签页,点击上面的
Backup now
按钮并备份
附1:以上操作也可以借助 vzdump 命令行来实现,参考如下:
root@node01:~# qm stop 100
root@node01:~# vzdump 100 --quiet 1 --mode stop --compress zstd --storage local
附2:关于虚拟机的3种备份模式,简单介绍如下:
备份模式 | 介绍 | 备注 |
---|---|---|
stop模式 | 该模式能提供最强的数据一致性保障 | 代价是备份过程中虚拟机要先关机 |
suspend模式 | 提供该模式的唯一原因是兼容性 | 该模式首先会挂起虚拟机,然后执行snapshot模式 |
snapshot模式 | 采用该模式虚拟机停机时间最短 | 代价是备份数据有可能不一致,实际上采用的是pve在线备份 |
第2步,登陆 node01 的终端(不是虚拟机),确认目录
/var/lib/vz/dump
下有新的备份文件产生,并转移备份文件到 node02 上root\@node01:~# ls -l /var/lib/vz/dump/ total 797288 -rw-r--r-- 1 root root 1790 Feb 3 10:25 vzdump-qemu-100-2023_02_03-10_25_04.log -rw-r--r-- 1 root root 816408657 Feb 3 10:25 vzdump-qemu-100-2023_02_03-10_25_04.vma.zst -rw-r--r-- 1 root root 12 Feb 3 10:25 vzdump-qemu-100-2023_02_03-10_25_04.vma.zst.notes
root\@node01:~# scp /var/lib/vz/dump/vzdump-qemu-100-2023_02_03-10_25_04.vma.zst root\@192.168.4.202:/root/ vzdump-qemu-100-2023_02_03-10_25_04.vma.zst 100% 779MB 112.0MB/s 00:06
第3步,登陆 node02 的终端,执行
qmrestore 备份文件 200
可指定恢复的虚机 vmid 为200
(注:新恢复的虚拟机vmid不要与已有的虚拟机id冲突)root\@node02:~# qmrestore /root/vzdump-qemu-100-2023_02_03-10_25_04.vma.zst 200 restore vma archive: zstd -q -d -c /root/vzdump-qemu-100-2023_02_03-10_25_04.vma.zst | vma extract -v -r /var/tmp/vzdumptmp195877.fifo - /var/tmp/vzdumptmp195877 CFG: size: 420 name: qemu-server.conf DEV: dev_id=1 size: 42949672960 devname: drive-scsi0 CTIME: Fri Feb 3 10:25:04 2023 Logical volume "vm-200-disk-0" created. new volume ID is 'local-lvm\:vm-200-disk-0' map 'drive-scsi0' to '/dev/pve/vm-200-disk-0' (write zeros = 0) progress 1% (read 429522944 bytes, duration 0 sec) progress 2% (read 859045888 bytes, duration 0 sec) ... progress 99% (read 42520215552 bytes, duration 5 sec) progress 100% (read 42949672960 bytes, duration 5 sec) total bytes read 42949672960, sparse bytes 40431001600 (94.1%) space reduction due to 4K zero blocks 5.36% rescan volumes... root\@node02:~#
第4步,打开 node02 的web页面,可以看到新的虚拟机已经创建,如下图示:
虚机在线迁移
- 第1步,pve集群内的虚机,支持在线迁移。先找到要迁移的虚机,右键选择
Migrate
,然后选择Target node
和Target storage
并开始迁移
- 第2步,迁移完成则可以在新的节点上看到这台虚机,注意 vmid 没有变。
在线迁移的注意事项
- 迁移的虚拟机,不支持CD/DVD迁移。最好的办法就是卸载 CD/DVD驱动器
- 迁移的虚拟机,建议先删掉快照和备份
遇到的问题
场景1:安装 windows 无法识别硬盘
报错原因:
- 创建虚拟机,在配置 OS 的时候,
Type
默认为Linux
,需要改为Microsoft Windows
- 创建虚拟机,在配置 System 的时候,务必指定
TPM Storage
和EFI Storage
为local-vm
场景2:无法登录 web 页面
症状:2022.11.18,在联想SR558H上装完vpe之后,打不开 https://ip:8006
,且登录pve后台,ping 不通网关地址。
解决:后来经过多次尝试才发现,这台机器共2块网卡,每块网卡有4个网口,pve默认使用第一块网卡的第一个网口,后来在配置网络及IP地址的时候,调整绑定正确的网口就好了,调整过程如下:
场景3:无法关闭虚拟机
症状:2023.03.03.有一台windows机器无法关机,在vpe终端对该虚机执行 Stop
或 Shutdown
都失败。
解决:登录pve的 >_ Shell 控制台,执行 qm list
找到这台虚机的 vmid(比如示例windows的vmid为103),然后执行 qm stop <vmid>
来执行关机(亲测有效)。
root@node01:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
100 linux-template stopped 4096 40.00 0
101 k8s-node1 running 4096 40.00 4963
102 k8s-node2 running 4096 40.00 8673
103 win10-4.240 running 4096 32.00 599826
104 ubuntu-template stopped 4096 32.00 0
root@node01:~# qm stop 103
场景4:暴露Clickjacking漏洞
症状:2023.03.28.针对pve web暴露的 Web应用程序可能易受Clickjacking
漏洞
针对Apache:在配置文件中添加:Header always append X-Frame-Options SAMEORIGIN
针对Nginx:在 nginx.conf 中 http{} 添加:add_header X-Frame-Options SAMEORIGIN;
解决:实测下来,并未找到配置 X-Frame-Options 的地方。建议通过nginx代理的方式访问pve控制台,在nginx中修复Clickjacking漏洞,并通过iptables封掉源pve端口,具体步骤如下:
第1步,pve服务端:离线安装docker,并拉起一个nginx容器,nginx映射8007:8007
mkdir -p /data/docker/nginx/www docker pull nginx:1.23.1 cat /data/docker/nginx/nginx.conf docker run -idt -p 8007:8007 -v /data/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v /data/docker/nginx/www:/data --name nginx nginx:1.23.1
第2步,pve服务端:配置nginx代理,将
https://pve.xxx.com:8007
转发给https://{ip}:8006
,注意在nginx.conf中配置域名+证书、消除tls漏洞、点击劫持漏洞,核心配置如下:http { #.修复Clickjacking漏洞 add_header X-Frame-Options SAMEORIGIN;
server { #.配置ssl证书 listen 8007 ssl; server_name pve.xxxx.com; ssl_certificate /data/server.crt; ssl_certificate_key /data/server.key; #.修复tls漏洞 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; #.配置nginx代理 location / { root html; index index.html index.htm; proxy_pass "https://192.168.4.37:8006"; } }
}
第3步,pve服务端:配置iptables限制8006仅本机内网ip访问(比如 192.168.4.37),用于nginx转发。而伪装后的8007则允许本网段访问
/usr/sbin/iptables -F /usr/sbin/iptables -X /usr/sbin/iptables -Z /usr/sbin/iptables -A INPUT -i lo -j ACCEPT /usr/sbin/iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT /usr/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /usr/sbin/iptables -A INPUT -p icmp --icmp-type any -j ACCEPT /usr/sbin/iptables -A INPUT -p tcp -s 192.168.4.37 --dport 8006 -j ACCEPT /usr/sbin/iptables -A INPUT -p tcp -s 192.168.4.0/24 --dport 8007 -j ACCEPT /usr/sbin/iptables -A INPUT -p tcp -s 192.168.4.0/24 --dport 22 -j ACCEPT /usr/sbin/iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset /usr/sbin/iptables -A INPUT -j DROP /usr/sbin/iptables -A FORWARD -j DROP
第4步,windows客户端:配置hosts
修改 C:\Windows\System32\drivers\etc\hosts 添加 192.168.4.37 pve.xxxx.com
第5步,windows客户端:使用浏览器访问
https://pve.xxxx.com:8007
,不要再使用https://{ip}:8006
来访问
参考:https://forum.proxmox.com/threads/how-to-configure-web-interface-internals.56470
场景5:调整内存导致启动失败
症状:2023.05.04.将虚拟机内存从4G改为16G后开机启动失败并显示以下错误:
Kernel panic - not syncing : Fatal exception
Shutting down cpus with NMI
注:没有找到解决办法,最后重装了系统,囧。
场景6:恢复快照遇到 VM is locked
症状:2023.07.19.将虚机恢复快照的时候,最后弹出窗口提示 VM is locked (rollback),执行 qm list
看到该节点(示例305
)状态已经是 stopped
root@pve27:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
100 ubuntu20.04-template stopped 1024 50.00 0
101 cnetos79-template stopped 4096 40.00 0
102 kylin-template stopped 4096 40.00 0
305 zhanglu-3.213 stopped 4096 40.00 0
root@pve27:~# qm unlock 305
解决:执行 qm unlock 305
,再次重试ok。
附录
常用的qm命令
qm guest cmd <vmid> <command>
qm guest exec-status <vmid> <pid>
qm guest passwd <vmid> <username> [OPTIONS]
qm guest exec <vmid> [<extra-args>] [OPTIONS]
qm clone <vmid> <newid> [OPTIONS]
qm config <vmid> [OPTIONS]
qm create <vmid> [OPTIONS]
qm delsnapshot <vmid> <snapname> [OPTIONS]
qm destroy <vmid> [OPTIONS] //删除某个虚机
qm list [OPTIONS] //列出所有虚机
qm listsnapshot <vmid>
qm migrate <vmid> <target> [OPTIONS]
qm move_disk <vmid> <disk> <storage> [OPTIONS]
qm pending <vmid>
qm reset <vmid> [OPTIONS]
qm resize <vmid> <disk> <size> [OPTIONS]
qm resume <vmid> [OPTIONS]
qm rollback <vmid> <snapname>
qm sendkey <vmid> <key> [OPTIONS]
qm set <vmid> [OPTIONS]
qm shutdown <vmid> [OPTIONS]
qm snapshot <vmid> <snapname> [OPTIONS]
qm start <vmid> [OPTIONS] //启动某个虚机
qm stop <vmid> [OPTIONS] //停止某个虚机
qm suspend <vmid> [OPTIONS]
qm template <vmid> [OPTIONS]
qm monitor <vmid>
qm mtunnel
qm nbdstop <vmid>
qm rescan [OPTIONS]
qm showcmd <vmid> [OPTIONS]
qm status <vmid> [OPTIONS] //查看集群/虚机状态
qm terminal <vmid> [OPTIONS]
qm unlock <vmid> //取消某个虚机的锁定状态
qm vncproxy <vmid>
qm wait <vmid> [OPTIONS]
qm help [<extra-args>] [OPTIONS]
常用的pve目录
目录 | 功能 | 备注 |
---|---|---|
/dev/pve |
pve虚拟磁盘 | - |
/etc/network/interfaces |
网络配置文件 | 可修改pve主机ip地址 |
/etc/pve/qemu-server |
存放虚拟机的配置文件 | - |
/var/lib/vz/template/iso |
存放iso文件 | - |
/var/lib/vz/dump/ |
备份路径 | - |