SER6 Pro Vest 7735HS Proxmox VE 核显直通

SER6 Pro Vest 7735HS Proxmox VE 核显直通

Tags
Proxmox VE
Published
March 14, 2023
Author
Dreamy.WJY

环境信息

Proxmox VE: 7.3-1

修复安装引导 Xorg

Xorg -configure cp /xorg.conf.new /etc/X11/xorg.conf sed -i 's/amdgpu/fbdev/g' /etc/X11/xorg.conf startx

删除 local-lvm 合并到 local

lvmremove pve/date lvextend -l +100%FREE -r pve/root

AMD Radeon 680M 核显直通给 Windows 11 虚拟机

Windows 11: Build 25300
virtio-win: 0.1.229
AMD Ryzen™ 7 7735HS Drivers: Adrenalin 23.3.1
1. 编辑 kernel commandline
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt initcall_blacklist=sysfb_init"/g' /etc/default/grub update-grub
2. 添加内核模块
cat >>/etc/modules <<EOF vfio vfio_iommu_type1 vfio_pci vfio_virqfd EOF
3. 添加驱动黑名单
cat >>/etc/modprobe.d/pve-blacklist.conf <<EOF blacklist amdgpu blacklist snd_hda_intel EOF
4. 将显卡绑定至 vfio-pci,其中显卡是 1002:1681,声卡是 1002:1640
cat >/etc/modprobe.d/vfio.conf <<EOF options vfio-pci ids=1002:1681,1002:1640 EOF
5. 刷新 initramfs 并重启 Proxmox VE
update-initramfs -u -k all reboot
6. 获取 vBIOS
编译 vBIOS 获取工具
点击展开
#include <stdint.h> #include <stdio.h> #include <stdlib.h> typedef uint32_t ULONG; typedef uint8_t UCHAR; typedef uint16_t USHORT; typedef struct { ULONG Signature; ULONG TableLength; // Length UCHAR Revision; UCHAR Checksum; UCHAR OemId[6]; UCHAR OemTableId[8]; // UINT64 OemTableId; ULONG OemRevision; ULONG CreatorId; ULONG CreatorRevision; } AMD_ACPI_DESCRIPTION_HEADER; typedef struct { AMD_ACPI_DESCRIPTION_HEADER SHeader; UCHAR TableUUID[16]; // 0x24 ULONG VBIOSImageOffset; // 0x34. Offset to the first GOP_VBIOS_CONTENT block from the beginning of the stucture. ULONG Lib1ImageOffset; // 0x38. Offset to the first GOP_LIB1_CONTENT block from the beginning of the stucture. ULONG Reserved[4]; // 0x3C } UEFI_ACPI_VFCT; typedef struct { ULONG PCIBus; // 0x4C ULONG PCIDevice; // 0x50 ULONG PCIFunction; // 0x54 USHORT VendorID; // 0x58 USHORT DeviceID; // 0x5A USHORT SSVID; // 0x5C USHORT SSID; // 0x5E ULONG Revision; // 0x60 ULONG ImageLength; // 0x64 } VFCT_IMAGE_HEADER; typedef struct { VFCT_IMAGE_HEADER VbiosHeader; UCHAR VbiosContent[1]; } GOP_VBIOS_CONTENT; int main(int argc, char** argv) { FILE* fp_vfct; FILE* fp_vbios; UEFI_ACPI_VFCT* pvfct; char vbios_name[0x400]; if (!(fp_vfct = fopen("/sys/firmware/acpi/tables/VFCT", "r"))) { perror(argv[0]); return -1; } if (!(pvfct = malloc(sizeof(UEFI_ACPI_VFCT)))) { perror(argv[0]); return -1; } if (sizeof(UEFI_ACPI_VFCT) != fread(pvfct, 1, sizeof(UEFI_ACPI_VFCT), fp_vfct)) { fprintf(stderr, "%s: failed to read VFCT header!\n", argv[0]); return -1; } ULONG offset = pvfct->VBIOSImageOffset; ULONG tbl_size = pvfct->SHeader.TableLength; if (!(pvfct = realloc(pvfct, tbl_size))) { perror(argv[0]); return -1; } if (tbl_size - sizeof(UEFI_ACPI_VFCT) != fread(pvfct + 1, 1, tbl_size - sizeof(UEFI_ACPI_VFCT), fp_vfct)) { fprintf(stderr, "%s: failed to read VFCT body!\n", argv[0]); return -1; } fclose(fp_vfct); while (offset < tbl_size) { GOP_VBIOS_CONTENT* vbios = (GOP_VBIOS_CONTENT*)((char*)pvfct + offset); VFCT_IMAGE_HEADER* vhdr = &vbios->VbiosHeader; if (!vhdr->ImageLength) break; snprintf(vbios_name, sizeof(vbios_name), "vbios_%x_%x.bin", vhdr->VendorID, vhdr->DeviceID); if (!(fp_vbios = fopen(vbios_name, "wb"))) { perror(argv[0]); return -1; } if (vhdr->ImageLength != fwrite(&vbios->VbiosContent, 1, vhdr->ImageLength, fp_vbios)) { fprintf(stderr, "%s: failed to dump vbios %x:%x\n", argv[0], vhdr->VendorID, vhdr->DeviceID); return -1; } fclose(fp_vbios); printf("dump vbios %x:%x to %s\n", vhdr->VendorID, vhdr->DeviceID, vbios_name); offset += sizeof(VFCT_IMAGE_HEADER); offset += vhdr->ImageLength; } return 0; }
gcc vbios.c -o vbios ./vbios mv vbios_1002_1681.bin /usr/share/kvm/
7. 配置 Windows 11 虚拟机
直接挂载镜像并添加 TPM v2.0 提示设备不受支持无法安装。这里采用 Rufus 烧录镜像干掉 TPM 直通 U 盘给虚拟机安装。
创建虚拟机时,BIOS 选择 SeaBIOS,Machine 选择 q35,Disks Bus/Device 选择 SCSI 并勾选 Discard 和 SSD emulation,Network Model 选择 VirtIO。
安装完成后在 Windows 虚拟机内启用远程桌面并关机。
在虚拟机配置页面添加 PCI Device 选择 0000:74:00.0(显卡)并勾选 Primary GPU 和 PCI-Express,再添加一个 0000:74:00.1 (声卡)。将 Display 的 Graphic card 修改为 none。直通你的键盘和鼠标。
编辑 /etc/pve/qemu-server/.conf,在显卡后追加 romfile=vbios_1002_1681.bin。
sed -i 's/0000:74:00.0,pcie=1,x-vga=1/0000:74:00.0,pcie=1,x-vga=1,romfile=vbios_1002_1681.bin/g' /etc/pve/qemu-server/<VM ID>.conf
启动虚拟机,通过远程桌面连接后下载驱动程序并安装(安装时选择 Driver Only)。
至此,核显直通流程基本完成。后续虚拟机每次关机之前须通过远程桌面手动弹出显卡及声卡,否则会导致 Proxmox VE 强制重启!