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";
  };
}

也是误打误撞找齐了所有关键的资料,网上居然没人提到这个显卡顺序错乱的完整修复方法

posted @ 2025-07-18 23:34  int16  阅读(73)  评论(0)    收藏  举报