前言

最近把之前的N5105工程机闲鱼出掉了,就为了准备一台设备,可以更多的PCIE槽可以插显卡做显卡直通解码用,也可以插万兆网卡做万兆内网。

因此,特地重新配了一台电脑,买了Intel X710-DA4的网卡,再把之前淘汰下来的GTX1060显卡插上。

为什么选择台式机,而不是服务器?

服务器吵啊!个人理解,好比家装和工装的区别,台式机就是家装,各个设备都比较好点,尤其是风扇明显声音小得多,服务器图一个便宜,扩展性能会更强一点,但是台式机主板能满足我的个人需求就行了。

关于直通

对于ESXI8.0来说,直通其实非常简单,仅需在设备管理页面切换直通即可,而且无需重启。

过程

如上所示,在列表中设备已经切换为直通状态。

但是在实际给虚拟机安装驱动时,驱动反复安装不上。

Part.1

第一次是直接给Ubuntu Server安装驱动,Ubuntu的驱动安装网上教程也很多,无非就是

配置虚拟机配置文件:

hypervisor.cpuid.v0 = FALSE

屏蔽nouveau:

1
vim /etc/modprobe.d/blacklist-nouveau.conf

添加:

1
2
blacklist nouveau
options nouveau modeset=0

更新内核并重启:

1
2
sudo update-initramfs -u
sudo reboot

接着正常安装下载的Nvidia驱动。

安装完成后,正常情况下通过 nvidia-smi 可以查看到显卡相关的信息。

但是我的提示是: No Device Found 或者 NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver

Part.2

根据显示的错误,在网上搜索了一大堆的文章,有使用 dkms 的,也有匹配内核版本的,始终无法解决问题。

实际排查问题过程中,重新安装了 Ubuntu Server 22.04 Ubuntu Server 24.04 Debian 以及 Ubuntu Desktop ,在Debian和Ubuntu Desktop这种有图形界面中,可以看到驱动安装上了,但是通过 nvidia-smi 始终报错。

Part.3

之后又猜想是不是下载的驱动版本不对,于是又在官网下载了各种不同版本:555,550,535,470等,每个版本都试着安装一遍。

可惜的是,问题依旧!

Part.4

后来,又在Bilibili中搜索相关视频的时候在想,干脆在Windows虚拟机中试试能不能安装驱动,毕竟Windows使用的最多,安装驱动这么简单的事情,步骤肯定不会错。

于是又装了Windows虚拟机,在其中装上驱动后,在设备管理界面可以正常看到显卡了,但是任务管理器中并没有GPU栏目,而且重启之后,设备管理器界面的显卡有个黄色感叹号,显示 错误代码43

崩溃了。

Part.5

当时实在太晚了就躺床上想,猜测还有一个可能是不是 PCIE插槽的通道和NVME插槽的通道共享带宽,导致显卡无法正常被识别。

这里我排除了显卡供电不足的问题。

于是干脆再从床上爬起来,卸掉了一条M.2硬盘,问题又来了,不知道是不是拿掉硬盘导致ESXI系统无法启动了(猜测,未排查)。只能重装系统再来一遍

最后的结果真的是Shit!!!问题依旧!

Part.6

最后的最后,实在没办法了,想换PVE,但是我觉得问题应该还是一样。

难道是因为GTX1060是消费级显卡,无法被直通使用吗?

甚至搞得我想搞个专业级的显卡了。。。

最后,不知道看了多少篇文章之后,看到一篇文章,里面提到:

核显直通后在Win10下驱动错误,代码43(据说其它系统可以直通,但不能显示)

想直通独显,需要在bios屏蔽核显,否则可能无法启动或蓝屏(有的主板没这个限制)

NVIDIA显卡直通需要配置hypervisor.cpuid.v0 = FALSE,否则驱动错误,代码43

ESXi7.0以后切换显卡直通不需要重启,但是已经直通显卡再重启会导致直通失败,手动切换两次可恢复。这个BUG导致直通显卡的虚拟机是无法开机自动启动的。

作者:Rakutens

链接:https://www.jianshu.com/p/acbc255bcebb

对于我来说,最重要的一条就是:想直通独显,需要在bios屏蔽核显,否则可能无法启动或蓝屏(有的主板没这个限制)

Part.7

重新连接显示器,进入BIOS把iGPU给屏蔽了。

问题终于得到解决。

最后

就这一个小问题,把我折腾的不要不要的。家里的网络被我搞得家人意见非常大。

网上查下来的各种方法大多都是没有用的,不得不感叹我国的网络环境真的是太差了。大部分内容都是照抄搬运,都不是自己测试使用过的就往上面搬。

中间走了太多弯路,心累,写篇文章记录一下这个事情。

附:完整直通流程(以Ubuntu Server为例)

第一步:显卡直通

(提前屏蔽iGPU就不说了)

ESXI主机界面-管理-硬件-PCI设备,选择需要直通的设备,切换直通。

第二步:创建虚拟机

正常的创建流程,在【编辑设置】界面,添加需要直通的PCIE设备,内存选项勾选【预留所有客户机内存(全部锁定)】,创建后再次编辑虚拟机,在虚拟机选项-高级-编辑配置,添加以下参数:

1
2
3
hypervisor.cpuid.v0         False   #必须
pciPassthru.use64bitMMIO True #非必须
pciPassthru.64bitMMIOSizeGB 32 #非必须,张显卡,值为32;如果是多张显卡,设置值为64

第三步:安装驱动

一、正常安装完系统后更新:

1
2
apt update
apt upgrade

二、屏蔽nouveau:

1
vim /etc/modprobe.d/blacklist-nouveau.conf

添加:

1
2
blacklist nouveau
options nouveau modeset=0

三、更新内核并重启:

1
2
sudo update-initramfs -u
sudo reboot

四、安装依赖

这一部分网上很少涉及,不安装的安装过程中会出现一些警告或者错误。

1
sudo apt install build-essential pkg-config xorg-dev xorg libvulkan1 libglvnd-dev

五、安装Nvidia驱动

官网搜索相对应的显卡型号并下载驱动,一般为 .run 格式。

上传至系统,赋予权限:

1
chmod +x NVIDIA-Linux-x86_64-xxx.xx.run

运行安装:

1
bash NVIDIA-Linux-x86_64-xxx.xx.run

安装完成后即可通过 nvidia-smi 查看显卡信息。

对于网上一堆乱七八糟的教程,说什么安装需要添加一些参数:

-no-x-check -no-nouveau-check -no-opengl-files -m=kernel-open

我只能说:一个都不要加!

第四步:安装NVIDIA Container Toolkit(非必须)

NVIDIA Container Toolkit 是一个包的集合,它将容器运行时(如 Docker)与主机上 NVIDIA 驱动程序的接口包装在一起,允许用户构建和运行 GPU 加速的容器。它包括一个容器运行时库和一些工具,可以自动配置容器来利用 NVIDIA GPU3。

也就是如果想让Docker也能使用显卡相关功能,需要安装。

具体配置参考:Installing the NVIDIA Container Toolkit

输入几条命令即可:

  1. 配置生产存储库:

    1
    2
    3
    4
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
    && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

    (可选)将存储库配置为使用实验包:

    1
    sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
  2. 从存储库更新软件包列表:

    1
    sudo apt-get update
  3. 安装 NVIDIA Container Toolkit 软件包:

    1
    sudo apt-get install -y nvidia-container-toolkit
  4. 配置 Docker

    1
    sudo nvidia-ctk runtime configure --runtime=docker
  5. 重启 Docker

    1
    sudo systemctl restart docker
  6. 使用以下 sudo nvidia-ctk 命令进行配置 /etc/nvidia-container-runtime/config.toml

    1
    sudo nvidia-ctk config --set nvidia-container-cli.no-cgroups --in-place

Over~