NixOS 天选air2024 独显bug修复过程(独显顺序在核显前)
笔者在用NixOS与天选Air2024的时候总是遇到奇奇怪怪的bug,比如每次启动应用都会唤醒独显,还会导致应用启动速度非常慢。steam打开就黑屏,QQ这种史山还经常打不开。就研究了半天这些问题的原因以及修复方法。
环境

原因
lspci
64:00.0 VGA compatible controller: NVIDIA Corporation AD107M [GeForce RTX 4060 Max-Q / Mobile] (rev a1)
64:00.1 Audio device: NVIDIA Corporation AD107 High Definition Audio Controller (rev a1)
65:00.0 Non-Volatile memory controller: Broadcom / LSI Device 1071 (rev 01)
66:00.0 Display controller: Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] (rev c1)
ls -la /dev/dri/by-path
total 0
drwxr-xr-x 2 root root 120 2025-07-18 23:15 .
drwxr-xr-x 3 root root 140 2025-07-18 23:15 ..
lrwxrwxrwx 1 root root 8 2025-07-18 23:15 pci-0000:64:00.0-card -> ../card0
lrwxrwxrwx 1 root root 13 2025-07-18 23:15 pci-0000:64:00.0-render -> ../renderD129
lrwxrwxrwx 1 root root 8 2025-07-18 23:15 pci-0000:66:00.0-card -> ../card1
lrwxrwxrwx 1 root root 13 2025-07-18 23:15 pci-0000:66:00.0-render -> ../renderD128
哎呀!骇似我力!竟然是因为独显的pcie序号排在核显前面,导致kde和hyprland优先使用了独显,还导致应用总是唤醒独显,以及一系列的bug。
解决方案
- NixOS下的解决方案
environment.variables = {
__EGL_VENDOR_LIBRARY_FILENAMES="/run/opengl-driver/share/glvnd/egl_vendor.d/50_mesa.json";
__GLX_VENDOR_LIBRARY_NAME = "mesa";
WLR_DRM_DEVICES = "/dev/dri/card1:/dev/dri/card0";
KWIN_DRM_DEVICES = "/dev/dri/card1:/dev/dri/card0";
AQ_DRM_DEVICES = "/dev/dri/card1:/dev/dri/card0";
};
AQ_DRM_DEVICES是给hyprland用的,KWIN_DRM_DEVICES是给kde用的,用来指定主显示设备。开头两个egl/glx的环境变量则是给程序识别显卡用的。NixOS下这个glvnd目录也是写死的,参考来源:NixOS Wiki - OpenGL
- 这是我所参考的ArchWiki给出的解决方案,参考来源ArchWiki - Prime
/etc/environment
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
__GLX_VENDOR_LIBRARY_NAME=mesa
完整n卡配置文件
nvidia.nix
{ config, lib, pkgs, ... }:
{
# NVIDIA fxxk U
services.xserver.videoDrivers = lib.mkForce ["amdgpu" "nvidia"];
hardware = {
graphics = {
enable = true;
enable32Bit = true;
};
## Enable the Nvidia card, as well as Prime and Offload:
amdgpu.initrd.enable = true;
nvidia = {
package = config.boot.kernelPackages.nvidiaPackages.stable;
open = true;
modesetting.enable = true;
nvidiaSettings = true;
prime = {
offload = {
enable = true;
enableOffloadCmd = true;
};
amdgpuBusId = "PCI:101:0:0";
nvidiaBusId = "PCI:100:0:0";
};
powerManagement = {
enable = true;
finegrained = true;
};
dynamicBoost.enable = true;
};
};
# MultiGPU
environment.variables = {
__EGL_VENDOR_LIBRARY_FILENAMES="/run/opengl-driver/share/glvnd/egl_vendor.d/50_mesa.json";
WLR_DRM_DEVICES = "/dev/dri/card1:/dev/dri/card0";
KWIN_DRM_DEVICES = "/dev/dri/card1:/dev/dri/card0";
AQ_DRM_DEVICES = "/dev/dri/card1:/dev/dri/card0";
__GLX_VENDOR_LIBRARY_NAME = "mesa";
};
}
也是误打误撞找齐了所有关键的资料,网上居然没人提到这个显卡顺序错乱的完整修复方法
浙公网安备 33010602011771号