The problem#
I recently replaced my old Nvidia graphics card with a newer one.
Upon booting up, I ran glxgears
to test that 3D graphics
were working properly and got an error like
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 155 (NV-GLX)
Minor opcode of failed request: 4 ()
Resource id in failed request: 0x1200003
Serial number of failed request: 34
Current serial number in output stream: 34
The solution#
Either delete /etc/X11/xorg.conf
or edit it and remove (or
comment out) the "Files"
section; that is, the lines
Section "Files"
...
EndSection
The details#
Initial troubleshooting#
Doing a search on the error message, I found suggestions that this was a sign the Nvidia driver installation was corrupted and a reinstall might fix it. Other posts pointed me at the Xorg logs.
Looking at the Xorg log file in /var/log/Xorg.0.log
,
I found messages like
(II) LoadModule: "glx"
(II) Loading /usr/lib/xorg/modules/extensions/libglx.so
(II) Module glx: vendor="X.Org Foundation"
(II) Loading extension GLX
...
(EE) NVIDIA(0): Failed to initialize the GLX module; please check in your X
(EE) NVIDIA(0): log file that the GLX module has been loaded in your X
(EE) NVIDIA(0): server, and that the module is the NVIDIA GLX module.
indicating the wrong libglx.so
was being loaded.
Finding libglx.so
#
This leads to the question of which libglx.so
should be loaded.
Using locate
found
$ locate libglx.so
/etc/alternatives/glx--linux-libglx.so
/etc/alternatives/nvidia--libglx.so
/usr/lib/nvidia/current/libglx.so
/usr/lib/nvidia/current/libglx.so.390.87
/usr/lib/nvidia/libglx.so
/usr/lib/xorg/modules/extensions/libglx.so
/usr/lib/xorg/modules/linux/libglx.so
and wajig
's whichpkg
sub-command found
$ wajig whichpkg libglx.so
INSTALLED MATCHES (x3)
----------------------
xserver-xorg-video-nvidia: /usr/lib/nvidia/current/libglx.so
xserver-xorg-video-nvidia: /usr/lib/nvidia/current/libglx.so.390.87
xserver-xorg-core: /usr/lib/xorg/modules/extensions/libglx.so
The desired libglx.so
is the one from the Nvidia-related package
(xserver-xorg-video-nvidia
), not the general Xorg package
(xserver-xorg-core
), which suggests that /usr/lib/xorg/modules/extensions/
is not actually where Xorg should be looking for modules (at least not
as the first choice).
Wait, /usr/lib/xorg/modules/linux/libglx.so
isn't an installed file?#
Note that /usr/lib/xorg/modules/linux/libglx.so
is not actually listed
by wajig whichpkg
. Looking at that file reveals that it's
a symbolic link:
$ ll /usr/lib/xorg/modules/linux/
total 0
lrwxrwxrwx 1 root root 38 Jan 26 2018 libglx.so -> /etc/alternatives/glx--linux-libglx.so
As the correct libglx.so
to use depends on the system setup, Debian's
alteratives system is used to select which one to use.
A quick check in the /etc/alternatives
directory shows that is indeed
pointing at an Nvidia-related file as expected.
$ ll /etc/alternatives | grep glx--linux-libglx.so
lrwxrwxrwx 1 root root 25 Oct 17 20:05 glx--linux-libglx.so -> /usr/lib/nvidia/libglx.so
We also could have used readlink
to skip to the final
target of the chain of links:
$ readlink -f /usr/lib/xorg/modules/linux/libglx.so
/usr/lib/nvidia/current/libglx.so.390.87
Fixing ModulePath
in xorg.conf
#
Looking in more detail at /var/log/Xorg.0.log
, I noticed the line
(==) ModulePath set to "/usr/lib/xorg/modules"
To help interpret this line, looking toward the top of the log is the legend for the prefixes of the lines in this log:
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
indicating that (==)
means it's the default setting. Looking at my
xorg.conf
, I found
Section "Files"
EndSection
Given that Debian intentionally put libglx.conf
in
/usr/lib/xorg/modules/linux/
—and that was not getting included in the
ModulePath
list—I figured that empty "Files"
section was overridding
a settings file from Debian. Indeed, after removing it, glxgears
worked
and Xorg.0.log
contained the line
(**) ModulePath set to "/usr/lib/xorg/modules/linux,/usr/lib/xorg/modules"
indicating that path was now being correctly included in ModulePath
, and
the (**)
indicates that it's from a config file.
Why did that work?#
Looking further, the log file contains the information on the config files it uses:
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using config directory: "/etc/X11/xorg.conf.d"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
In /usr/share/X11/xorg.conf.d/
, the file nvidia-drm-outputclass.conf
contains
Section "Files"
ModulePath "/usr/lib/xorg/modules/linux"
ModulePath "/usr/lib/xorg/modules"
EndSection
which is apparently where ModulePath
is supposed to be set.
Comments
Have something to add? Post a comment by sending an email to comments@aweirdimagination.net. You may use Markdown for formatting.
There are no comments yet.