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

ZAB*_*ZAB 5 dual-boot nvidia vmware graphics drivers

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

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

我找到的唯一相关答案是这个,但它对我不起作用。switchlibglxNVIDIA 驱动程序中没有。

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

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

2)制作一个复杂的配置文件,根据存在的适配器运行脚本并在引导期间覆盖符号链接(请参阅下面的答案)

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

Mtt*_*ocy 2

您遇到此问题是因为您的 X 配置正在尝试加载 nvidia 驱动程序,然后该驱动程序正在寻找兼容的 nvidia 设备。来宾环境中不存在此类设备,而是提供 VMware 虚拟图形设备,因此 nvidia 驱动程序不是来宾操作系统中的正确驱动程序。

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

sudo apt-get install xserver-xorg-video-vmware
Run Code Online (Sandbox Code Playgroud)

另请确保在虚拟机配置上启用了 3D 加速,并且您已正确安装 vmware guest 附加组件。您还应该确保您没有明确选择 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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