极摩客M7 R7 6800H PVE直通680M核显

参考视频:B站-爱折腾的老高

参考文章:https://pve.sqlsec.com/4/2/

vbios提取源码:pve论坛-xi4oyu

关于PVE核显直通的内容,网上的资料已经是非常得多的了。对于核显直通来说,最主要的内容是获取到BIOS固件并提取到vbios固件。但是对于极摩客M7来说,官网是没有bios固件文件的,只能通过咨询客服提供。

本篇文章主要以直通核显做为记录,如果你的新安装的PVE电脑,建议去网上将下列工作处理完成,这里推荐一个pve设置工具Github:pve-source

  1. 修改软件包源为国内镜像源
  2. 删除企业软件源
  3. 去掉无效订阅源提示
  4. 合并local-lvm空间

一、硬件直通配置

这里需要保证你的BIOS已经启用了SR-IOVR/iommu直通

编辑/etc/default/grub,将GRUB_CMDLINE_LINUX_DEFAULT="quiet"修改为下列内容

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on initcall_blacklist=sysfb_init iommu=pt"
ShellScript

保存后更新grub

update-grub
ShellScript

编辑/etc/modprobe.d/blacklist.conf,并替换为下列内容:

# Nvidia
blacklist nvidiafb
blacklist nouveau
blacklist nvidia
 
# AMD
blacklist amdgpu
blacklist radeon
 
# Intel UHD
blacklist snd_hda_codec_hdmi
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core
blacklist i915
 
#屏蔽hdmi声音驱动
options vfio_iommu_type1 allow_unsafe_interrupts=1
ShellScript

保存后更新initramfs

update-initramfs -u -k all
ShellScript

最后重启pve

先更新一下PCI列表

update-pciids
ShellScript

在检测一下是否开启了中断映射

dmesg | grep 'remapping'
ShellScript

如果出现类似下列内容说明直通成功

"AMD-Vi: Interrupt remapping enabled"
"DMAR-IR: Enabled IRQ remapping in x2apic mode"
ShellScript

二、直通核显

核显直通要分为部分,第一部分是获取到vbios,用于和虚拟机可以正常加载核显,第二部分是获取到GOP,这个是用于让显示器正常可以加载开机动画。当然第二部分是可选的

apt install gcc
ShellScript

将下列源码上传到pve上并命名为vbios.c

#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;
}
C
gcc vbios.c -o vbios
ShellScript

运行编译出来的vbios程序即可在当前目录下生成你的vbios文件

“dump vbios 1002:1681 to vbios_1002_1681.bin”

这里分享一下我编译好的vbios文件和提取到的vbios文件,点我打开

将vbios_1002_1681.bin文件移动到/usr/share/kvm/备用,后续设置核显直通的时候需要加载该文件

因为bios固件官网是没有的,因此只能找客服要,这里我也给出bios固件

先下载UBU提取工具,点我打开

输入下列命令

cd 你的UBU文件夹目录

#执行UBU.cmd
UBU.cmd
ShellScript

此时会要求你选择一个文件,此时找到你的bios的rom文件

在菜单选择页面的时候选择2- Video Onboard

这样在Extracted文件夹内就可以看到AMDGopDriver.efi文件了,但是这个文件还需要转换成ROM文件才可以被使用

在Github可以直接下载edk2-BaseTools-win32工具,本地下载

下载后解压出来

输入下列命令

cd 你的edk2-BaseTools-win32文件夹目录

EfiRom.exe -f 0x1002 -i 0x你的设备id -e 你的AMDGopDriver.efi路径
ShellScript

注意,每一台电脑设备id不一样,因此需要自己去pve后台查询核显的设备id号

lspci -D -nn | grep VGA
ShellScript

输入完成上面的命令后就可以在AMDGopDriver.efi同目录下载看到AMDGopDriver.rom了

将AMDGopDriver.rom文件移动到/usr/share/kvm/备用,后续设置核显直通的时候需要加载该文件

在你的虚拟机上添加你的核显并勾选主GPU

如果你提取了GOP的话还可以将GOP直通到声卡上来加载GOP来获得开机动画

打开/etc/pve/qemu-server/核显直通的虚拟机id号.conf,在你的直通设备后面在添加上vbios驱动

#请对照自己的直通id号
hostpci?: 0000:e6:00.0,x-vga=1,romfile=vbios_1002_1681.bin
hostpci?: 0000:e6:00.1,romfile=AMDGopDriver.rom
ShellScript

这样就完成了核显直通,接下来如果是windwos的话安装好对应的驱动就可以直接使用核显了


📌 本文由 FishBoss_Tca 原创,转载请注明作者和原文链接。
原文链接:https://www.ytca.top/guidance/linux/2600/

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇