PVE安装使用笔记
PVE(Proxmox VE)是个好东西,但是一直没空试……主要是因为没有硬件来跑。
(2022-03更新)
在PN51上安装PVE7.1的问题处理
因为之前用的J1900限制最大内存8G,跑PVE开不了几个虚拟机,一怒之下收了一台Asus PN51,配置如下:
- CPU: AMD Ryzen3-5300U
- 内存:16G
- 硬盘:500G NVMe
硬件是非常赞的:CPU只有15W的TDP,性能接近10代i7,关键是体积还很小,只有半升,比N1大不了多少,台积电5nm的制程对散热也非常有利,全负荷大概25W跑起来温度也不高(内置风扇加持)。
因为在Debian上加装的模式目前只支持在Buster上装PVE6,最新的PVE7是基于Debian 11 Bullseye的,不提供加装模式,加上上次尝试加装模式失败就不想再试了,还是直接刷吧。
但是刷PVE7.1倒是碰到不少问题,可能是硬件太新了,据说PVE7.2可以解决,但要下个季度才会发布。只能先手工处理一下。
主要是两个问题:
- 网络不通
- 关机不能
网络问题处理
安装好后interfaces的配置是没问题的,跟文档里说的一样,但是就是网络不通。ip link
显示vmbr0不存在,enp2s0则是down的状态。手工用ip link set enp2s0 up
启用网卡也没有分配IP地址。
只好先改为正常的DHCP或静态地址配置:
# 注释掉原来的enp2s0(以太网卡eth0的实际别名)和vmbr0(PVE网桥)配置
# 使用新的enp2s0配置,以静态IP为例
auto enp2s0
#allow-hotplug enp2s0
iface enp2s0 inet static
address 192.168.x.x/24
gateway 192.168.x.1
改完systemctl restart networking
即可上网(但因为没有网桥,虚拟机暂时无法连网,后面再修),但重启后发现还是不行,再看一下systemctl status networking
,显示某个依赖有问题导致启动失败。然而奇怪的是,这个时候手工启动一下systemctl start networking
就又可以了。
暂时先这样,能上网就能修复另一个问题了。
不能关机问题处理
正常关机或重启后,进行到这里会卡住不动,只能强制关机:
kvm: exiting hardware virtualization
在PVE论坛找到的解决方案是需要升级内核,但是我用apt search pve-kernel-5.15
找不到,似乎这些人都是用了企业版,所以有一个enterprise repository
可以用,我们免费用户只能注释这个,不然会报401错误,还好后来在官方文档找到非订户的仓库配置:
# PVE pve-no-subscription repository provided by proxmox.com,
# NOT recommended for production use
deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription
这样就可以安装新内核了:
apt install pve-kernel-5.15 pve-kernel-5.15.5-1-pve pve-headers-5.15 pve-headers-5.15.5-1-pve
装完新内核后重启就不会卡住了。
而且更好的是:重启后网络服务启动也成功了,不需要再手工启动一次。
现在把interfaces
改回原样再重启一次,PVE就完全修复了。
迁移虚拟机
新的服务器装好,当然要把原来服务器上的虚拟机迁移过来,这个PVE提供了:
- 登录虚拟机,把虚拟机关机
- 登录旧服务器的WEB管理
- 选择备份虚拟机,备份方式选择STOP(如未关机也可以用SNAPSHOT),压缩方式我选择了比较通用的gzip,当然你可以选择更快更好的zstd方式
- 在
/var/lib/vz/dump
下找到备份文件*.vma.*
,传输到新服务器的相同路径下 - 登录新服务器的WEB管理
- 在
Backups
里找到相应的备份文件,选择Restore
- 指定
VM ID
,可选是否恢复后启动Start after restore
- 恢复完成即可使用虚拟机
迁移VirtualBox虚拟机
先要进入虚拟机,把VBoxGuest程序删除掉,如果系统没有卸载功能,可以挂上Guest虚拟光盘,运行其中的uninstall卸载。
然后从VBox里把虚拟机导出来,GUI的话用VBox的导出功能,导出来OVA文件即可。命令行的话是这样:
# 列出虚拟机
vboxmanage list vms
# 导出指定的虚拟机
vboxmanage export <vmname> -o <vmname>.ova
把导出的OVA文件传输到PVE服务器,然后解包:
tar -xvf <vmname>.ova
可以得到一个ovf文件和一个vmdk文件。
先创建虚拟机:
qm importovf <VM ID> <vmname>.ovf local-lvm --format qcow2
导入过程可能报一些错误,但是在WEB管理里可以看到新的虚拟机已经创建。检查一下虚拟机的options和hardware配置,看一下有什么需要改的,比如网卡,虚拟机名字,操作系统类型之类没有成功从ovf里解析出来的内容。
如果没有硬盘的话,再手工导入一次:
qm importdisk <VM ID> <vmname-diskxxx>.vmdk local-lvm -format qcow2
现在在WEB管理里可以看到虚拟机已经有一个未使用的硬盘,选择编辑这个硬盘,接口改为SATA,然后点添加,即可将它加入虚拟机。
现在,你可以启动虚拟机来使用了。如果是windows的话,初次启动会安装一堆的驱动并重启几次,如果是linux的话,可能需要手工安装qemu-guest-agent
。
WEB代理
PVE的WEB管理是可以用NGINX代理出来的,但是有个问题就是console会连不上,因为它用了websocket,所以要参考官网说明配置:
proxy_redirect off;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass https://localhost:8006;
proxy_buffering off;
client_max_body_size 0;
proxy_connect_timeout 3600s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;
}
其中的upgrade配置如下:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
存储管理
默认情况下PVE会把整个硬盘给分配掉,以我的500G硬盘为例,它给系统留了90G左右,剩下400多G全部给了local-lvm这个存储空间,用于分配给虚拟机。
但由于我还要在系统里跑docker,需要较多的空间,90G有点不够用,倒是虚拟机我不会开太多,用不了那么多,所以需要调整一下。
用lvs
看了一下系统分配,发现有一个叫data
的逻辑卷占用了最大的空间,论坛里看到的说法是这是local-lvm用的thin pool,不能用常规的方法调整大小,但是如果不用可以删除……
我就不信没法处理,还好在官方文档找到说明,不但可以调整大小,而且删除也可以重建……当然我用了最简单的方法,在这个thin pool里建一个新的LV给docker用:
# 创建一个LV给docker
lvcreate -n docker -V 100G pve/data
# 格式化LV
mkfs.xfs /dev/pve/docker
# 配置mount
echo "/dev/pve/docker /var/lib/docker xfs defaults 0 0" >> /etc/fstab
# 停止docker服务
systemctl stop docker
# 备份docker
mkdir /var/lib/docker_bak
mv /var/lib/docker/* /var/lib/docker_bak/
# 挂载docker卷
mount /var/lib/docker
# 恢复docker到卷中
mv /var/lib/docker_bak/* /var/lib/docker/
# 删除备份目录
rmdir /var/lib/docker_bak
# 重启docker服务
systemctl start docker
VNC客户端配置
系统自带的虚拟机远程桌面是web版的noVNC,不支持VNC客户端的连接,有时不太方便——比如需要复制粘贴点东西啥的就不行了。要使用客户端需要参考官方文档配置:
在虚拟机关机状态下找到配置文件:/etc/pve/local/qemu-server/<VM ID>.conf
,加入一行:
args: -vnc 0.0.0.0:<VNCID>
其中0.0.0.0
是绑定的IP,实际上我是绑定在127.0.0.1
上,然后走SSH隧道连接,这样比较安全。图省事的话,也可以用官方文档说的配置一个密码,但相对来说肯定没有SSH隧道来的安全。
VNCID是VNC的显示号,为任意数字,每个虚拟机不能重复,最终的VNC端口号将会是:5900+VNCID
,比如VNCID为7,则端口号为5907。
启动虚拟机后即可看到相应的VNC端口被监听,然后就可以用VNC客户端进行远程连接了。
(2021-07-18)
去年把家里服务器换成AMD以后,换下来的J1900就闲置了,但是缺少硬盘,也跑不了。前不久因为一台笔记本坏了,换下来一块SATA的SSD,终于可以试试这个了。
安装
本来想先安装Debian再装PVE,然而碰到很多问题,比如:
pve-ssl.key: failed to load local private key (key_file or key) at /usr/share/perl5/pve/apiserver/anyevent
修改hosts,去掉重名的IP
hostname --ip-addr
确保只有一个IP再重装。还是有问题,8006端口打不开。
参考这篇,重启pveproxy。
如果不行的话,再运行:
pvecm updatecerts
再重启就可以了。
然而不幸的是,虽然PVE安装成功了,但是网卡配置始终有问题,手工创建了网桥仍然不通,最后还是只能格掉直接安装PVE。
直接安装也很简单,就是做一个安装U盘,像安装一般Linux一样安装即可。
OpenWRT
先来试试在PVE里跑一个OpenWRT:
然后解压出来,再转一下格式:
qemu-img convert -f raw -O qcow2 openwrt-19.07.8-x86-64-combined-ext4.img openwrt.qcow2
然后在PVE里创建一个虚拟机,假设虚拟机ID为101。
再把磁盘镜像导入系统:
qm importdisk 101 openwrt.qcow2 local-lvm
现在可以在PVE里把这个盘加入虚拟机,然后配置虚拟机从这个硬盘启动,即可进入OpenWRT。
推送到[go4pro.org]