迁移背景

2023年2月份,笔者曾经使用ESXi虚拟化平台自组了一个NAS,并且称之为最终养老方案。如今,一年时间过去了,它的确称可以之为养老方案,稳得一匹。期间只因为CPU散热风扇异响,才停机处理过一次,其余时间均正常运行,使得笔者有限的时间能够用在欣赏影片之上。

可现在为什么又要迁移PVE呢?笔者总结了几个因素。第一点,博通收购VMware后,ESXi发展规划从买断制变成了订阅制,这意味着ESXi的可玩性将大打折扣;第二点,笔者之前安装的ESXi版本是7,它不支持Realtek家的RTL8125B 2.5G网卡,但刚好家里有备用的PCIE网卡,所以就将就着用了。大家如果是螃蟹RTL8125B网卡,则建议直接用ESXi 6.7版本,这也意味着被锁在6.7版本上;第三点,ESXi的性能监控对于家用来说,着实有些差强人意。ESXi只支持一个小时的性能监控,超过一个小时则需要安装专门的监控系统;第四点,PVE是基于Debian系统的虚拟化平台,这意味着宿主机有更多的操控性。

准备工作

本文中用到的主板包含两个nvme接口,原本做ESXi的时候,只用了一个nvme接口,因此还剩一个nvme接口尚未利用。这次在网上买了一个16GB大小的傲腾M1,准备当做PVE系统盘。

其次,nvme硬盘中包含了一个1.2TB大小的虚拟机,但nvme硬盘中文件系统的格式是VMFS6,在linux中无法使用。因此需要把这个1.2TB大小的硬盘先挪到别的地方,等PVE创建好,nvme硬盘挂载好后,再挪过来。这里补充一句,笔者将sata控制器直通给了DSM,由于手头暂时没有这么大的备用存储空间,因此只能先将这个1.2TB的硬盘文件先挪到DSM中。首先在DSM中配置好NFS,然后将NFS挂载到ESXi中,然后将硬盘复制到这个NFS中。这三步都不需要命令行,全部在web页面上操作即可。需要注意的是,在DSM中开启NFS后,在ESXi中配置的NFS共享这项要填成共享文件夹的装载目录。

1-dsm-nfs-config.png
开启NFS配置

2-dsm-file-nfs-config.png
修改共享文件夹

3-dsm-nfs-config.png
服务器名称或IP地址这里建议填写成IP网段,例如192.168.1.0/24

4-esxi-nfs-add.png
ESXi中添加NFS存储

复制时,请将fat文件和vmdk文件一起复制。

还有一点需要注意,那就是备份好虚拟机的mac地址,重新构建虚拟机时,需要指定为原先的mac地址。打开虚拟机配置所在位置,其中有一个后缀为vmx的文件,下载下来后,用记事本打开,其中ethernet0.generatedAddress这个对应的就是mac地址了。

笔者的DSM用的是USB做引导,然后直通了sata控制器,因此在PVE上重建时,就不会牵扯到硬盘的转移了,只用把USB和sata控制器配置上就可以了。

PVE系统安装

小的注意点

迁移过程相对来说比较简单,但在PVE8上踩了一个坑,最新的PVE 8.1.4版本不支持ventoy安装,只能使用rufus软件将PVE的安装镜像dd到U盘中,不过从ventoy官网的更新说明中可以看到,2024年1月24号发布了1.0.97版本,此版本修复了PVE8不能启动的问题。大家可以按需选择安装方式。

由于傲腾16G硬盘实在过小,因此在安装时,会提示安装将会跳过pve-lvm的安装,这个不要紧,笔者的所有虚拟机和数据盘都会放在另一个大容量nvme硬盘中,傲腾的作用仅仅是代替U盘,避免系统读写卡顿。

网卡名称变动问题

在迁移时,笔者遇到了一个小问题,为了避免安装时,误删其他硬盘中的数据,因此在安装前把另一块nvme硬盘还有sata硬盘都取下来了。安装好后,将另一块nvme硬盘插上时,服务器连不上网了。经过排查,发现是网卡的接口名发生了变动,原先是 enp2s0 ,在插入nvme硬盘后,变成了 enp3s0 。如何确认网卡的名称呢?可以使用 ifconfig 或者 ip addr 命令查看,如果这两个命令都没有,可以使用 lspci 命令查看网卡的地址。

ifconfig 命令结果:

enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 66:55:44:33:22:11  txqueuelen 1000  (Ethernet)
        RX packets 892889182  bytes 771248699137 (718.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 544079971  bytes 475072812733 (442.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 18

ip addr 命令结果:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000

lspci 命令结果:

02:00.0 Non-Volatile memory controller: XXXXXX NVMe SSD
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)

此时,需要做的是修改网络配置,此时就要用到命令行了,使用vim/vi/nano任意工具在命令行修改 /etc/network/interfaces ,将其中所有内容为 enp2s0 的地方,全部修改为 enp3s0。然后使用命令systemctl restart network,或者重启系统reboot即可。

此时,PVE就安装成功了,后面修改源之类的就不具体展开了。

网卡驱动升级

PVE下,RTL8125B网卡使用的驱动默认是r8169,此驱动没有开启网卡多队列等特性。导致一个网卡的软中断只能使用固定的一个核心开接收和发送数据。

看看网卡的pci编号:

$ lspci | grep RTL8125 
22:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
2a:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)

看看网卡加载的驱动:

$ lspci -s 03:00.0 -k # 03:00.0这块网卡
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
        Subsystem: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller
        Kernel driver in use: r8169
        Kernel modules: r8169

查看网卡软中断数量:

$ cat /proc/interrupts | grep -P 'enp|CPU0'  # 我的网卡名叫enp3s0、enp4s0
            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11      CPU12      CPU13      CPU14      CPU15      
  51:          0          0          0          0          0          0          0          0          0  631894756          0          0          0          0          0          0  IR-PCI-MSIX-0000:22:00.0    enp3s0
  59:          0          0          0          0          0          0          0          0          0          0          0  932824696          0          0          0          0  IR-PCI-MSIX-0000:2a:00.0    enp4s0

也可以用这个命令看看软件中断(%soft)是不是大量集中在某个核心上:

$ mpstat -P ALL 1 5

总之,RTL8125B网卡建议更换驱动,笔者曾尝试从源码安装RTL8125B的驱动,但由于系统中缺少一些编译工具,因此便没有成功。本文采用了网上一位大佬编译好的,开启了多网卡队列的驱动包。这是两个驱动包:realtek-r8125-dkms 未开启多网卡队列realtek-r8125-dkms 开启了多网卡队列,大家按需使用。

以下是安装流程:

$ apt update
$ apt upgrade
$ apt install -y dkms pve-headers #pve 8.0.4+建议将pve-headers替换为proxmox-default-headers

## 安装headers
$ headers=$(dpkg -l | awk '/^ii.+kernel-[0-9]+\.[0-9]+\.[0-9]/{gsub(/-signed/, ""); gsub(/kernel/, "headers"); print $2}' | tr "\n" " ")
$ eval apt install -y $headers

## 安装刚刚下载好的deb包,此命令只会为当前系统所使用的内核以及刚刚安装的最新内核(也可能当前所使用的内核就是最新内核)安装驱动
$ dpkg -i realtek-r8125-dkms_*.deb  # 如通配符会匹配多个时亦可指定具体的文件名

## 如果想为那些既不是系统当前所使用的内核,也不是刚刚安装的最新内核安装驱动,需要手动指定安装
## 看看哪些内核安装好了驱动
$ dkms status
## 列出全部内核版本kernel_version,找出那些还没有安装驱动的内核
$ dpkg -l | awk '/^ii.+kernel-[0-9]+\.[0-9]+\.[0-9]/{gsub(/proxmox-kernel-|pve-kernel-|-signed/, ""); print $2}'
## 手动指定驱动版本(在deb文件名中有体现)和内核版本(从上一句命令的输出中),zsh按tab可自动补全,比如:dkms install realtek-r8125/9.011.01 -k 6.2.16-5-pve
$ dkms install realtek-r8125/<driver_version> -k <kernel_version>

## 卸载不再需要的headers
$ eval apt-mark auto $headers
$ apt autopurge

## 禁用r8169驱动
$ echo "blacklist r8169" >> /etc/modprobe.d/dkms.conf

## 重启
$ update-grub
$ update-initramfs -u -k all
$ reboot

## 再次查看网卡加载的驱动,现在加载的是r8125了
$ lspci -s 03:00.0 -k
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
        Subsystem: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller
        Kernel driver in use: r8125
        Kernel modules: r8169, r8125

sata控制器直通

网卡搞定后,需要开启sata控制器直通。此时需要调整PVE中的/etc/default/grub文件,找到GRUB_CMDLINE_LINUX_DEFAULT="quiet"这一行,在后面补上intel_iommu=on

在里面找到:GRUB_CMDLINE_LINUX_DEFAULT="quiet"
intel CPU修改为:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
amd cpu请改为:GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"

5-sata-controller-direct.png

修改完后,使用update-grub更新一下grub,这时不用着急重启,还需要调整另外一个文件。编辑/etc/modules文件,在其中添加如下的配置内容:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd 

6-modules-config.png

调整完后,请重启服务器。

虚拟机配置

DSM配置

7-dsm-new-config.png

由于笔者使用的是USB引导以及sata控制器直通,因此配置起来就很简单了。在新建虚拟机时,操作系统tab中选择不使用任何介质;系统tab中机型选择q35,BIOS选择OVMF(UEFI);磁盘tab中删除所有磁盘;cputab中类别选择host类型;网络tab中mac地址请指定成之前用的mac地址。最后完成创建。

8-add-usb.png

8-add-sata-controller.png

创建完成后,在硬件tab中,添加USB设备,建议使用使用USB供应商/设备ID这一选项,这样你的U盘插在哪个USB口上都可以;然后添加PCI设备,选择原始设备,找到并选择sata控制器,然后勾选所有功能

9-change-start-number.png

之后,在选项tab中,调整一下引导顺序,将U盘调整到第一位。然后启动虚拟机就OK啦。

如果需要arpl/rr或更详细的安装步骤,请参考本文最后的参考资料部分链接。

虚拟机硬盘转换

本文对PVE添加硬盘功能不做展开,仅描述如何将vmdk后缀的硬盘文件转换成pve能识别使用的硬盘。

本文前面将一个1.2T的硬盘文件放到了DSM中,因此还需要将它打通到PVE系统中。这里还是采用NFS挂载的方式,DSM部分就不详细展开了,PVE上需要使用命令行,将NFS挂载上。

mkdir -p /mnt/data
mount -t nfs 你的内网IP地址:/volume2/data1 /mnt/data

需要先创建好虚拟机,得到虚拟机编号,例如100、101等。然后使用下面的命令,将DSM中的vmdk硬盘转换成qcow2格式硬盘,这个过程会比较长,请使用screen工具保持会话。

# 注释内容可选
# apt install screen
# screen -S copytask
qm importdisk 101 /mnt/data/xxxx/xxxx.vmdk 存储库(例如pve、pve-lvm等) --format=qcow2
# 执行完命令后,先后按键`Ctrl+a` `d`退出,然后可以再使用`screen -r copytask`进入查看

转换完成后,在虚拟机选项里,硬件tab中会出现一个尚未使用的硬盘,双击配置,可以开启SSD仿真选项。

再之后,调整引导顺序,然后就可以启动使用了。

总结

从ESXi迁移到PVE,整体大约花了一天多时间,其中转移1.2T硬盘花费了近一半。目前来看,得到的收益有:第一个是可以看更长时间范围的监控了;第二个是使用了原生网卡,不用再使用pcie网卡了,后面有机会可以在pcie位置扩展安装一些其他设备;第三个是查看硬盘smart信息更方便了,PVE可以在web页面上直接查看。

折腾完这一轮后,预计又将再休养生息一段时间,笔者希望至少能维持一年以上。

参考资料

标签: pve, 群晖, 虚拟机, DSM, Esxi, 迁移, Promox

添加新评论