在双启动环境中切换视频驱动程序

在双启动环境中切换视频驱动程序

让 ubuntu 在安装了 NVIDIA 卡的本机计算机和 VMware 客户机上启动的最简单方法是什么。安装nvidia-304驱动程序包后,我无法在 VMware 中加载它。它卡在登录循环中,出现以下错误.xsession-errors

Xlib:显示“:0”时缺少扩展“GLX”。

我发现的唯一相关答案是但它对我不起作用。NVIDIAswitchlibglx驱动程序中没有。

编辑:我的调查结果。NVIDIA 通过系统目录中的符号链接用他们的 OpenGL 模块破坏了系统libglx.so。他们的模块只能与 NVIDIA 驱动程序一起使用,如果您使用不同的视频适配器启动系统,则显然不会加载该驱动程序。没有默认的和简单的方法来根据加载的驱动程序选择使用哪个 OpenGL 模块。这是一个经典的 unix 逻辑。在任何困难的情况下,都不要费心发明 API 和选项,只需覆盖全局目录中的默认符号链接,让用户处理这个混乱。NVIDIA 只使用标准拐杖来安装他们的驱动程序和模块。有三种可能的解决方法:

1)每次在 VMware 中使用时安装和卸载 nvidia 驱动程序

2)制作一个复杂的配置文件,根据现有的适配器在启动期间运行脚本并覆盖符号链接(见下文答案)

3)以某种方式禁用 X 服务器中的 GLX 扩展,以便在 VMware 中加载它

答案1

您之所以遇到此问题,是因为您的 X 配置正在尝试加载 nvidia 驱动程序,而该驱动程序正在寻找兼容的 nvidia 设备。客户机环境中不存在此类设备,而是显示 VMware 虚拟图形设备,因此 nvidia 驱动程序不是客户机操作系统中的正确驱动程序。

vmware 虚拟图形接口的正确驱动程序是 xserver-xorg-video-vmware 软件包提供的驱动程序,而不是 nvidia-* 软件包提供的驱动程序,后者仅适用于直接访问 GPU。您可以在客户机上使用以下命令安装正确的驱动程序:

sudo apt-get install xserver-xorg-video-vmware

还要确保虚拟机配置中启用了 3D 加速,并且正确安装了 vmware 客户端附加组件。您还应确保没有明确选择 nvidia 驱动程序的 xorg.conf 文件,因为这将失败。

如果您想要一个脚本,您可以在 lightdm 启动之前将其设置为在启动时运行,您可以尝试如下操作:

#!/bin/bash
# Vendor identifiers
nvidia=\"10de\"
vmware=\"15ad\"

# Detect NVIDIA driver
nvidia_driver=`dpkg --get-selections | awk '/nvidia-[0-9]+\t+install/ { print $1 }'`

# Detect PCI bus ID
vga_bus_id=`lspci | awk '/VGA/ { print $1 }'`

# Detect VGA vendor identifier
vga_vendor=$(lspci -nm | awk "/$vga_bus_id/ { print \$3 }")

if [ $vga_vendor == $nvidia ]; then
   # Configure for nvidia GLX via update-alternatives
   update-alternatives --set i386-linux-gnu_gl_conf /usr/lib/${nvidia_driver}/alt_ld.so.conf
   update-alternatives --set i386-linux-gnu_egl_conf /usr/lib/${nvidia_driver}/alt_ld.so.conf
   update-alternatives --set x86_64-linux-gnu_gl_conf /usr/lib/${nvidia_driver}/ld.so.conf
   update-alternatives --set x86_64-linux-gnu_egl_conf /usr/lib/${nvidia_driver}/ld.so.conf
elif [ $vga_vendor == $vmware ]; then
   # Configure for mesa GLX via update-alternatives
   update-alternatives --set i386-linux-gnu_gl_conf /usr/lib/i386-linux-gnu/mesa/ld.so.conf
   update-alternatives --set i386-linux-gnu_egl_conf /usr/lib/i386-linux-gnu/mesa-egl/ld.so.conf
   update-alternatives --set x86_64-linux-gnu_gl_conf /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf
   update-alternatives --set x86_64-linux-gnu_egl_conf /usr/lib/x86_64-linux-gnu/mesa-egl/ld.so.conf
else
   # Configure for mesa GLX via update-alternatives
   update-alternatives --set i386-linux-gnu_gl_conf /usr/lib/i386-linux-gnu/mesa/ld.so.conf
   update-alternatives --set i386-linux-gnu_egl_conf /usr/lib/i386-linux-gnu/mesa-egl/ld.so.conf
   update-alternatives --set x86_64-linux-gnu_gl_conf /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf
   update-alternatives --set x86_64-linux-gnu_egl_conf /usr/lib/x86_64-linux-gnu/mesa-egl/ld.so.conf
fi

该脚本会检查检测到的显卡供应商标识符,如果是 nvidia,它将配置 ld 以使用 nvidia 提供的 opengl 库,但是如果检测到 vmware 设备,它将配置 mesa,如果无法识别任何供应商字符串,则 mesa 为默认值。

这里做出了一些假设,如果不是以下情况,脚本将无法正常工作:

  1. 假定安装了 Multilib,因此 i386 和 x86_64 的设置
  2. 假设已经安装了 ubuntu 提供的 nvidia 驱动程序,如果您不使用 apt 手动安装 nvidia 驱动程序,则此操作将不起作用。

但是我没有安装 vmware,所以我只能测试并确保在检测到 nvidia 设备并安装了 ubuntu 提供的 nvidia 驱动程序后它能够正常工作。

相关内容