我知道类似的问题已经被问过无数次了,但到目前为止,没有一个解决方案对我有用。让我们从头开始。
我有一台工作站,上面有一台运行 Ubuntu 20.04 的 NVidia RTX A5000。在今天发生事件之前,我能够使用 SSH 连接到我的工作站,并使用 Mac Book Pro 上的 XQuartz 渲染 OpenGL 窗口。
今天我在工作站尝试运行一个窗口程序,并收到“无法建立 dbus 连接”错误。谷歌搜索后,似乎这是因为我的驱动程序中有一个错误(495.44,提到这里)。我决定更新驱动程序。“附加驱动程序”选项卡中的所有选项都变灰,最后显示我正在使用手动安装的驱动程序。我遇到了这个问题然后跑了
sudo ubuntu-drivers autoinstall
它运行起来没有任何问题。然后我重启了机器,结果不是登录界面,而是黑屏,顶部有一个闪烁的白色光标。幸运的是,我仍然能够通过 SSH 进入它。过了一会儿,我发现已经ubuntu-drivers
安装了nvidia-driver-470
。我按照说明操作关于这个答案将其移除
dpkg -P $(dpkg -l | grep nvidia-driver | awk '{print $2}')
apt autoremove
我没有安装noveau
(Nvidia 驱动程序自述文件说这不是个好主意)。我重启了机器,这次出现了登录屏幕。打开“附加驱动程序”显示我回到了手动安装的(有缺陷的)驱动程序(我nvidia-smi
也通过运行 确认了这一点)。
这次我决定手动安装驱动程序,然后运行
sudo apt install nvidia-driver-510
我重启了电脑,这次一切都正常了。我进入了登录屏幕,错误消失了,我设法运行了我想要的应用程序(我还发现我使用了错误的参数来调用它,这让我怀疑这一切是否都是徒劳的......)。当我使用连接到工作站的显示器时,一切都很好。
我现在遇到的问题是通过 SSH 进行渲染。作为参考,可以xclock
正常工作,所以我没有完全失去远程 X 渲染。对于其他应用程序(我认为共同点是它们使用 GL,但我不确定),我收到以下错误
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
我看到一些答案说要运行apt-get intall -y mesa-utils libgl1-mesa-glx
。我遗漏了libgl1-mesa-glx
,但这并没有解决问题。运行带有调试信息的 GL 应用程序(例如glxgears
或)glxinfo
,我得到以下信息
$ LIBGL_DEBUG=verbose glxinfo
name of display: localhost:10.0
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 149 (GLX)
Minor opcode of failed request: 24 (X_GLXCreateNewContext)
Value in failed request: 0x0
Serial number of failed request: 16
Current serial number in output stream: 17
$ LIBGL_DEBUG=verbose glxgears
libGL: MESA-LOADER: dlopen(/usr/lib/x86_64-linux-gnu/dri/swrast_dri.so)
libGL: Can't open configuration file /etc/drirc: No such file or directory.
libGL: Can't open configuration file /home/[my username]/.drirc: No such file or directory.
libGL: Can't open configuration file /etc/drirc: No such file or directory.
libGL: Can't open configuration file /home/[my username]/.drirc: No such file or directory.
libGL: Disabling server's aux buffer support
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Error: glXCreateContext failed
我尝试了几种方法,其中包括从“其他驱动程序”选项卡中选择 noveau 驱动程序(安装 Nvidia 驱动程序后,该选项卡不再变灰)。但都不起作用。我从某处读到,这可能是由于 Nvidia 驱动程序引起的,因此我决定卸载nvidia-driver-510
并返回手动安装的驱动程序。但是,重新启动后,我的屏幕分辨率降至 640x480,所有内容都超出比例,并且选择了 noveau 驱动程序。我卸载xserver-xorg-video-nouveau
并重新启动,希望获得手动安装的驱动程序,但登录后,我又出现了 noveau(尽管xserver-xorg-video-nouveau
没有安装;我检查过了)。我nvidia-driver-510
再次安装以使屏幕恢复正常。
我看到其他遇到同样问题的用户能够通过安装特定于发行版的软件包(mesa-libGLw-devel.x86_64
在 CentOS7 中,mesa-dri-drivers
在 Redhat 中)来解决问题,但我不知道如何找到适用于我的发行版的等效软件包。其他答案建议卸载 Nvidia 驱动程序,但仅凭这一点不足以恢复到(有缺陷但可以工作的)手动安装的驱动程序。noveau
除了我可能错过的驱动程序之外,还有其他软件包可以提供驱动程序xserver-xorg-video-nouveau
吗?如果有,我该如何找到那个包?
如果有帮助的话,以下是我在其他问题中看到人们询问的附加信息
$ sudo ldconfig -p | grep -i gl.so
libwayland-egl.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libwayland-egl.so.1
libcogl.so.20 (libc6,x86-64) => /lib/x86_64-linux-gnu/libcogl.so.20
libOpenGL.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libOpenGL.so.0
libOpenGL.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libOpenGL.so
libGL.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libGL.so.1
libGL.so.1 (libc6) => /lib/i386-linux-gnu/libGL.so.1
libGL.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libGL.so
libEGL.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libEGL.so.1
libEGL.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libEGL.so
其中libGL.so
和libGL.so.1
都指向/lib/x86_64-linux-gnu/libGL.so.1.7.0
。
$ lspci -k | grep -EA3 'VGA|3D|Display'
08:00.0 VGA compatible controller: NVIDIA Corporation Device 2231 (rev a1)
Subsystem: NVIDIA Corporation Device 147e
Kernel driver in use: nvidia
Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
这是一个很长的问题...感谢您读到这里。
答案1
你想做什么?
“我现在遇到的问题是通过 SSH 进行渲染”是一个非常宽泛的短语。它可以表示:
- 在服务器中渲染,不显示任何内容(即离屏渲染)
- 在服务器中进行渲染,在服务器的显示屏上显示命令
- 在服务器中渲染,并将结果转发到你的计算机
- 将 X11 命令从服务器转发到客户端计算机,并在客户端计算机中进行渲染
通常,如果您通过 SSH 进入服务器并运行使用 GPU 的命令,则只有屏幕外渲染会起作用(选项 1),但大多数程序都没有编码来处理这个问题;所以它们会失败并显示像您遇到的神秘错误消息(因为它们必须使用 EGL DRM 接口与 GPU 通信,而大多数 OpenGL 程序会尝试使用 GLX X11 或 EGL X11)。
可以通过设置 DISPLAY 环境变量来解决这个问题,DISPLAY=:0.0 glxinfo
即将变成选项 2(在服务器中渲染,在服务器的显示器中显示命令)。
如果您想要选项 3,则很难做到正确;因此我建议您使用适合此任务的替代软件,例如 Nomachine、TeamViewer 或 Anydesk(警告:它们都不是 FOSS)。您可以尝试其他工具,例如 X2Go 或 VNC,但根据我的经验,不幸的是,它们的延迟或质量远不及我提到的其他工具
您没有粘贴用于打开xclock
或glxinfo
通过 SSH 的命令,这会产生深远的影响。
env
另外,比较SSH 与主机上的终端(从 GNOME/Xfce/etc 启动)的输出可以帮助您识别任何错误或缺失的内容。
斯瓦斯特
swrast 由以下机构提供libgl1-mesa-dri
尝试:
sudo apt install --reinstall libgl1-mesa-dri
- 卸载 Ubuntu 提供的 NVIDIA 驱动程序
- 安装 NVIDIA 驱动程序其网站(警告:在极少数情况下,安装程序会使您的系统处于无法启动到 GUI 的状态,请确保您具有 SSH 访问权限,以便您可以将其恢复到工作状态,例如正在运行
./installer --uninstall
。
默认情况下,Ubuntu 的软件包会启用 NVIDIA 驱动程序并禁用或破坏 Mesa 驱动程序;而官方安装程序会让 Mesa 与 NVIDIA 驱动程序一起工作。这可能会导致与您类似的用例产生截然不同的结果。
答案2
我遇到了类似的问题。
这个问题帮助我了解发生了什么:NVIDIA 440.64 32 位库包破坏 64 位驱动程序包
脚步:
- 删除所有与 NVIDIA 驱动程序和 CUDA 相关的内容:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#removing-cuda-toolkit-and-driver
sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \ "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"
sudo apt-get autoremove
- 支持32位库
sudo dpkg --add-architecture i386
sudo apt update
- 通过包管理器安装驱动程序以及 32 位 OpenGL
sudo apt-get install nvidia-driver-515
这还将安装libnvidia-gl-515
并libnvidia-gl-515:i386
您可能需要在安装之前检查您的 ppa 源:
apt-cache policy nvidia-driver-515
NVIDIA 于 2022 年 4 月进行了 GPG 更新:https://developer.nvidia.com/blog/updating-the-cuda-linux-gpg-repository-key/
sudo reboot
最后,我让 swrast 和 Nvidia 515 驱动程序一起工作。
请注意,我不必在我的计算机上安装 CUDA。如果您需要 CUDA,则根本问题是您必须采取一些变通措施,因为不包括 32 位库:
https://forums.developer.nvidia.com/t/latest-cuda-driver-from-deb-repository-breaks-steam/70950
我想从 NVIDIA 的角度对这个问题投赞成票。问题是,最新的 CUDA 驱动程序不再捆绑任何 32 位兼容库。这会破坏需要 32 位兼容性的软件,例如 steam。如果下一个 CUDA 驱动程序可以重新包含这些,那就太好了,这样我就可以拥有一台同时运行 CUDA 和 steam 的 Ubuntu 机器。
这不是一个真正的问题,你只需要以正确的方式安装驱动程序和 cuda:
- 添加 ubuntu 图形 ppa:https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
- 从那里安装驱动程序(sudo apt install nvidia-driver-430)
- 下载 cuda .deb,将 repo 添加到你的系统(前三个步骤
- 根据下载页面上的安装说明)不要安装 cuda
- 相反,运行 sudo apt install cuda-toolkit-10-1