标签: amd

  • 记录一次电脑的升级,如何使用PVE9打造双系统主力机

    记录一次电脑的升级,如何使用PVE9打造双系统主力机

    最近尝试使用了一段时间neovim编辑器,结合linux的sway wm,发现越来越顺手了。又萌生了让台式机同时开双系统的想法。但是台式机的老旧平台(intel 11700)实在让我没兴趣折腾,而且我的5070Ti搭配这样一套平台有点浪费。于是决定升级一下平台,好激动又可以装电脑了。这次无论是硬件安装还是之后pve虚拟机的安装,整个过程虽然遇到很多坑,但都顺利解决了。完成之后的效果可以说相当满意,手中传下来的每个硬件都利用上了。

    更新换代的硬件:CPU、主板、内存、硬盘

    CPU:AMD 9700x

    主板:微星X670E战斧导弹

    内存:阿斯加特 博拉琪二代 6000,c28, 32G*2

    硬盘:致钛TiPro9000 2T

    其它的库存硬件

    硬盘:三星970EVO 256G x2,2.5寸sata固态1TB x1,2.5寸sata机械2TB x1

    显卡2:蓝宝石RX5500XT,用了好久的一个AMD入门级甜品卡

    显卡1:映众5070TI,标准双槽3风扇,25年3月份购入

    系统安装规划/结果

    • pve宿主机:安装在1T2.5寸SSD
    • windows宿主机:256Gnvme硬盘。主要用来硬件测试,主板灯光设置等。跟pve只能启动一个,平时不会启动。

    ProxmoxVE虚拟机管理平台(简称PVE)

    PVE是一个基于Debian的操作系统,是一套完善的虚拟机管理平台,以QEMU作为虚拟机管理工具,底层基于KVM(Kernel-based Virtual Machine:基于内核的虚拟机)虚拟化技术。以下是KVM与普通虚拟机(VirtualBox等)的区别:

    要安装满足日常使用的虚拟机需要开启pci硬件直通,所谓硬件直通就是把硬件完全分配给虚拟机。比如把显卡分配给虚拟机,虚拟机将完全拥有这张显卡,跟物理机直接使用这张显卡几乎没有区别。

    如何使用pve的硬件直通

    官方文档 中介绍的很详细,建议通读一遍官方文档之后再进行操作:

    1. 首先是BIOS的设置

    主要是开启硬件虚拟化功能,包括CPU的虚拟化和I/O设备的虚拟化,以及开启IOMMU(全称输入输出内存管理单元(Input – Output Memory Management Unit)

    2. 配置Linux内核参数,开启系统IOMMU

    编辑 /etc/default/grub修改如下

    GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"
    • pcie_acs_override=downstream,multifunction 这个选项强用来制开启pci分组,对于这块主板来说是必须的
    • 修改完之后需要更新grub,执行:update-grub

    重启之后使用 dmesg | grep -e DMAR -e IOMMU -e AMD-Vi 命令验证一下,出现类似 “IOMMU, Directed I/O or Interrupt Remapping is enabled” 的字样,说明iommu开启成功

    3. 加载内核硬件直通相关模块,

    编辑 /etc/modules,添加如下几行:

    vfio
    vfio_iommu_type1
    vfio_pci

    修改完之后需要刷新initramfs,执行:update-initramfs -u -k all

    3. 宿主机屏蔽要直通的PCI硬件

    PVE 会尝试自动使 PCI(e) 设备对宿主机不可用。但是保险起见还是主动屏蔽

    第一种方式在vfio-pci选项后添加设备ID

    首先执行 lspci -nn 命令查看设备ID

    如上图5070Ti显卡的设备ID就是中括号的字符串。

    然后将设备ID添加到 /etc/modprobe.d/vfio.conf 文件中,多个设备ID以逗号分割,如下添加了显卡以及显卡带的声卡ID。

    options vfio-pci ids=10de:2c05,10de:22e9
    第二种方式将设备驱动加入黑名单

    使用 lspci -k 命令可以查看到设备驱动名称,但是条目太多。可以根据类型进行过滤,例如查看显卡设备可以使用 lspci -k | grep -A 3 "VGA"

    我的电脑中有三个显卡,分别是:RTX5070Ti,RX5500XT,以及9700x自带的核显,所以显示了3个条目。将需要屏蔽设备的驱动名称添加到黑名单配置中:

    编辑 /etc/modprobe.d/pve-blacklist.conf,添加如下几行代表屏蔽n卡驱动:

    blacklist nvidiafb
    blacklist nvidia
    blacklist nouveau

    配置完之后也需要刷新initramfs,执行:update-initramfs -u -k all

    PS:因为我的电脑中已经配置好直通,所以`kernel driver in use:` 的值是 `vfio-pci`,这也是检测硬件是否成功屏蔽的方式

    上述2,3,4步骤修改任意一步都需要重启才能使修改生效。配置好之后就可以通过web控制台创建虚拟机,以及给虚拟机添加需要直通的PCI硬件。

    创建windows11虚拟机可以参考 windows11虚拟机最佳实践,但是这里面有个坑,下面会说到。

    遇到的问题

    1. Windows11虚拟机很不流畅

    一种能明显感知到的不流畅。理论上毕竟是虚拟机,性能损失肯定有的,但是基于kvm的硬件底层虚拟化,并且用上了硬件直通,性能损失应该是感知不到的。这种不流畅肯定是哪里没配好。

    于是乎测试了下硬盘速度,直通的TiPro9000固态硬盘性能直接砍半!

    这是宿主机测试的速度

    这是虚拟机测试的速度

    这也不是我第一次玩PVE了,性能损失不可能这么大,绝对有问题,经过不断测试,发现了问题所在,windows11虚拟机最佳实践中,关于wsl部分,添加了参数

    把这个参数去掉,就好了!,,之后再测试的性能:

    性能损失仍然有,但是没那么夸张了,操作起来已经感知不到了。但是这个性能依然不是很理想,不知道有没有大神可以解答下。

    2. AMD显卡的vendor-rest

    AMD Navi系列显卡都会有无法重置的问题

    现象就是虚拟机使用直通的AMD显卡,第一次能正常启动虚拟机,之后关机或重启都无法启动。而RX5500XT正是属于Navi系列。不过还好有大神提供了 vender-reset内核模块 ,但是这个模块很久没更新,在最新的ProxmoxVE 9中并不能正常编译安装成功。但是网络上从来不乏热心人,另一位大神基于原有的vendor-reset模块提供了 最新的vendor-reset模块 ,解决了在新版pve系统中无法编译安装的问题,并且很详细的介绍如何使用。

    安装并配置好最新的vendor-reset模块之后,显卡依然不能正常重置

    仔细研究vendor-reset原理,其实分成两个步骤,1 是编译安装并开启对应的内核模块,2 是系统启动时自动修改显卡的reset_method配置 ,检查显卡配置位于:`/sys/bus/pci/devices/0000:18:00.0/reset_method`,发现内容为bus, 如果重置成功,文件的内容应该是 `device_specific`。尝试以root用户身份手动修改竟然无法修改成功。root用户都无法改动,那一定是启动的时候有什么安全机制阻止文件被修改。于是进入BIOS仔细查看了一番,发现有一项“安全启动”是打开状态,根据以往的经验,这项应该是关闭的。关闭之后果然可以重置了。

    3. 嵌套虚拟化,虚拟机windows下开启hyper-v,安装WSL

    虽说日常开发打算用Linux,但是Linux系统还需要一段时间完善,短时间内还是需要WSL开发环境。众所周知WSL本质是依赖Hyper-V的虚拟机。这就需要开启嵌套虚拟化了,经过前面的操作,嵌套虚拟化已经默认开启了。安装wsl是直接以管理员身份运行power shell,执行wsl –install命令,安装过程竟然异常顺利,期间没有遇到任何报错。

    但是!装是装上了,也能正常使用了,整个系统又回到了卡卡的感觉了。就知道不可能这么顺利,网上查的大部分资料都是教你如何开启嵌套虚拟化,问AI也没用。但是已经检查过,嵌套虚拟化已经是默认开启状态,不过最终还是让我找到了2篇有用的文章:Marc’s blogHyper-V Enlightenments

    KVM和Hyper-V都属于Ⅰ型虚拟机,linux内核已经很好实现了虚拟化嵌套的能力(kvm本就是linux内核模块),但是window之类的商业系统并没有很好的实现。需要添加一些所谓的enlightentments来告诉windows虚拟机运行在兼容 Hyper-V 的虚拟机管理程序之上。最终我给自己的虚拟机配置添加了下面的参数:

    args: -cpu host,hv-passthrough,-hv-syndbg,-hv-enforce-cpuid,-hv-evmcs
    • hv-passthrough:一个参数就表示添加所有的Hyper-V Enlightenments
    • 后面的带减号的参数:表示删除对应的enlightenment

    惊喜

    这次装机的惊喜主要是主板带给我的。对于虚拟机直通来说,首要考虑的是扩展性。这次选择的主板是 微星X670E战斧导弹,在同时插入两张双槽显卡的同时,还有两个PCIE扩展槽,并且没有任何冲突。而且用来插显卡的第1,3 pcie插槽都是CPU直出的。市面上能完美符合这种扩展性的主流主板真不多。

    虽然说AMD芯片组的设计很拉跨,增加扩展性的方式就是堆叠南桥芯片,但在一定程度上却更利于硬件直通

    直通sata控制器

    在pve中,单独的sata硬盘无法做到完全直通给虚拟机,最好的方式是直通整个控制器。

    从主板的pcie扩展分布图可以看出,SATA端口是分布在两个南桥芯片上的,这意味着主板上虽然只有4个sata接口,但是却可能有两个sata控制器,每个控制器上有两个sata端口。经过验证确实如此,因此可以将pve宿主机安装进一个sata硬盘。将另外一个sata控制器直通给windows,原来的windows存储盘直接可以在虚拟机里正常使用了。

    直通usb控制器

    在pve中,从web控制台可以给虚拟机添加usb,但是数量不能超过5个,而且无法通过usb端口连接拓展坞。

    从图中可以看出,usb也端口也分布在不同的芯片上,这也意味着可以将不同的USB控制器直通给不同的虚拟机,就可以无视pve usb端口限制了,可以随意连接拓展坞。

    直通声卡

    声卡竟然也可以直通,这一点是我没想到的,也许在其它平台上声卡也能直通,只是之前没试过。因为我一直把声卡和解码器搞混了,比如这款主板使用的音频解码器是`Realtek® ALC1200`,在pcie中没有找到相关设备就以为它不能直通。直到仔细看了上图的声卡部分有个`HD Audio`,主板pcie设备中有个`HD Audio Controller`,尝试直通了一下,没想到成功了,而且直通声卡后,对应的解码器也可以正常使用。

    TIPS

    如此,便实现了一台电脑上同时开着两个系统,如果要两个人同时使用这台电脑,只需要连接两套显示器、键盘、鼠标就行,两个人同时使用互不干扰。

    但是,一个人使用时,只有一套键盘、鼠标、显示器,如何方便的在两个系统间切换呢?这时需要一个KVM切换器(此处的KVM是键盘(Keyboard)、显示器(Video)、鼠标(Mouse)的缩写),有的显示器支持KVM,不支持也没关系,网上搜一下可以买到。

    总结

    这次装机折腾总体结果是达到了自己的期望,期间还有一些意外之喜,比如有2个stata控制器,能直通声卡等,但是仍有一些缺陷:

    主板的RGB灯光控制器虚拟机内无法识别

    主板的灯光控制以usb方式分配给windows虚拟机,msi app无法识别。光污染这个东西,也就刚装上有新鲜感,直接通过BIOS关闭就行了。

    有一些不稳定因素

    直通声卡偶尔导致系统崩溃,现象就是QQ音乐点击播放或切歌的时候,windows突然死机,音响一直发出噪音,重启虚拟机发现声卡不见了,必须重启整个pve系统才行。但是这种情况就出现过两次,没法稳定复现。

    性能损失

    pve官方给出的性能损失是3%~%5,但是个人怀疑这个性能损失是指在虚拟化linux系统的时候。经过实测,在windows虚拟机中cpu性能损失在5%~6%,下面两个图是宿主机和虚拟机的基准跑分(是在开启hyper-v的情况下)

    cpu的性能损失是完全可以接受的,但是硬盘的的4k性能损失有点太大了,明明是直通的,不知道是不是测试软件的原因。

    但跑分归跑分,实际使用下来并没有什么明显的感知。

    最后总结一下,如果想同时开多个虚拟机像我一样在不同的系统间灵活切换。或者想要组一个all in one的系统,一台电脑既要满足搭建各种服务器的需求(比如NAS),又要满足日常使用。使用PVE完全OK。

    但是如果追求完美,追求极致稳定,那还是别瞎折腾了。