nvidia-xrun

出自 ArchWiki

nvidia-xrun 是一个实用程序,允许启用 NVIDIA Optimus 的笔记本电脑按需使用独立的 NVIDIA 显卡运行 X server。此解决方案提供完整的 GPU 利用率、兼容性以及比 Bumblebee 更好的性能。

X server 只能与集成显卡或独立 NVIDIA 显卡一起使用,但不能同时使用两者,因此用户可能希望切换到单独的 虚拟控制台 并使用与第一个 X server 不同的显卡启动另一个 X server。

安装

安装:

  • nvidia - 如果使用旧驱动程序,您必须编辑 nvidia-xrun 的 PKGBUILD 并删除 NVIDIA 依赖项
  • nvidia-xrun-gitAUR(推荐)或 nvidia-xrunAUR (旧方法,使用 bumblebee 关闭独立显卡)
  • 任何 窗口管理器,因为不建议像 nvidia-xrun application 那样直接运行应用程序。

配置

设置正确的总线 ID

注意: 如果您从 AUR 安装了软件包,则总线 ID 已在 /etc/X11/nvidia-xorg.conf 中自动设置。 确保总线 ID 已正确设置,否则请更改它(您可以使用 lspci 命令找到正确的总线 ID)。 在某些情况下,您需要将 lspci 的十六进制输出转换为十进制以用于 nvidia-xorg.conf,例如 3b:00.0 变为 "PCI:59:0:0"

查找您的显示设备总线 ID

$ lspci | grep -i nvidia | awk '{print $1}'

它可能会返回类似于 01:00.0 的内容。 然后创建一个文件(例如 /etc/X11/nvidia-xorg.conf.d/30-nvidia.conf)以设置正确的总线 ID

/etc/X11/nvidia-xorg.conf.d/30-nvidia.conf
Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "PCI:1:0:0"
    #  Option "DPI" "96 x 96"
EndSection

通过这种方式,您还可以在遇到问题时调整一些 NVIDIA 设置

/etc/X11/nvidia-xorg.conf.d/30-nvidia.conf
Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    #  Option "AllowEmptyInitialConfiguration" "Yes"
    #  Option "UseDisplayDevice" "none"
EndSection

外部 GPU 设置

您也可以在外部 GPU 设置中使用此方法。 确保加载 nvidia-modesetnvidia-drm 模块,并将选项 Option "AllowExternalGpus" "true" 添加到 "Device" 部分。

更改自动生成的配置以在具有多个 NVIDIA 显卡的设备上使用内置显示器

/etc/X11/nvidia-xorg.conf.d/30-nvidia.conf
Section "ServerLayout"
  Identifier "layout"
  Screen 0 "nvidia" 0 0
  Inactive "intel"
  Option  "AutoAddGPU" "false"
EndSection

Section "Device"
  Identifier "nvidia"
  Driver "nvidia"
  BusID "PCI:9:0:0"
  Option "AllowExternalGpus" "true"
  Option "ProbeAllGpus" "false"
  Option "HardDPMS" "false"
  Option "NoLogo" "true"
  Option "UseEDID" "false"
#    Option "UseDisplayDevice" "none"
EndSection

Section "Screen"
  Identifier "nvidia"
  Device "nvidia"
  Option "AllowEmptyInitialConfiguration" "Yes"
#  Option "UseDisplayDevice" "None"
EndSection

请记住将总线 ID 设置为正确的显卡。

自动运行窗口管理器

为了方便起见,您可以创建一个包含您喜欢的窗口管理器的 $XDG_CONFIG_HOME/X11/nvidia-xinitrc 文件。(如果使用 nvidia-xrun < v.0.3.79,则创建 $HOME/.nvidia-xinitrc

if [ $# -gt 0 ]; then
  $*
else
  your-window-manager
fi

有了它,您无需指定应用程序,只需执行

$ nvidia-xrun

由于此方法启动了一个隔离的 X server,因此最好复制您位于 /etc/X11/xorg.conf.d/ 中的所有其他配置文件,但您的先前标准集成 GPU 配置除外。

使用 bbswitch 管理 NVIDIA 显卡

注意: nvidia-xrun > 0.3.78 应该会自动禁用显卡,因此此方法是不必要的

当不需要 NVIDIA 显卡时,可以使用 bbswitch 将其关闭。 nvidia-xrun 脚本将自动负责运行窗口管理器和唤醒 NVIDIA 显卡。 为了实现这一点,您需要

在启动时加载 bbswitch 模块

# echo 'bbswitch' > /etc/modules-load.d/bbswitch.conf

在启动时禁用 nvidia 模块

# echo 'options bbswitch load_state=0 unload_state=1' > /etc/modprobe.d/bbswitch.conf 

重启后,NVIDIA 显卡将被关闭。 可以通过查询 bbswitch 的状态来查看这一点

$ cat /proc/acpi/bbswitch  

要分别强制显卡打开/关闭,请运行

# echo OFF > /proc/acpi/bbswitch
# echo ON > /proc/acpi/bbswitch

有关 bbswitch 的更多信息,请参阅 Bumblebee-Project/bbswitch

用法

开机启动

启用 nvidia-xrun-pm.service - 这将在启动期间关闭 NVIDIA 显卡。

系统启动后,从虚拟控制台登录到您的用户,然后运行 nvidia-xrun application

如果上述方法不起作用,请切换到未使用的虚拟控制台并重试。

如前所述,直接使用 nvidia-xrun application 运行应用程序效果不佳,因此最好创建一个如前所述的 nvidia-xinitrc 文件,并使用 nvidia-xrun 启动您的窗口管理器。

故障排除

NVIDIA GPU 无法关闭或被设置为默认

请参阅 #使用 bbswitch 管理 NVIDIA 显卡

如果 NVIDIA GPU 仍然无法关闭,或者在您使用或不使用 nvidia-xrun 时不知何故被设置为默认,那么您可能需要将特定模块列入黑名单(这些模块以前被 Bumblebee 列入黑名单)。 创建此文件并重启您的系统

/usr/lib/modprobe.d/nvidia-xrun.conf
blacklist nvidia
blacklist nvidia-drm
blacklist nvidia-modeset
blacklist nvidia-uvm
blacklist nouveau

nvidia-xrun-pm.servicesystemd-modules-load.service 之间似乎存在竞争条件,后者加载 nvidia 模块。 如果后者先运行,则 nvidia-xrun-pm 将在设备移除期间挂起(实际上是 tee 命令)。 如果另一方面 nvidia-xrun-pm 先运行,那么它将成功,然后模块将加载失败并显示错误(这是无害的,但很难看)。 因此,最好始终将上述模块列入黑名单。

应启用 DRM 内核模式设置以使 PRIME 同步工作(例如在仅 Intel GPU 连接到输出的 muxless 设备上)。 但是,如果出现问题,请考虑禁用它。 请参阅 NVIDIA#DRM 内核模式设置

在某些硬件上,NVIDIA GPU 在 PCI 总线上公开两个设备:一个 3D 控制器和一个音频设备。 在这种情况下,需要从总线中移除这两个设备,GPU 才能完全断电。 这可以通过简单地在 /etc/default/nvidia-xrun 中为音频设备总线 ID 添加一行,并在 /usr/bin/nvidia-xrun 中的函数 turn_off_gpu 中添加相应的行来删除第二个设备。