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:

先下载:combined-ext4.img.gz

然后解压出来,再转一下格式:

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]