注:我认为这个应该与发行版无关,但如果相关的话,我将 Arch Linux 与 KDE Plasma 5 和 SDDM 一起使用。
我会尽量保持简短,只保留绝对相关的细节。
我全新安装了 Arch Linux,并且想为 Optimus/Prime 功能设置 Bumblebee(我有一台 Optimus 笔记本电脑 - Asus X550V)。我在使用 bumblebee 时遇到了一些问题,在接下来的实验中解决它时,我意识到我仍然不明白 xorg 和图形驱动程序是如何工作的(请注意,我思考我有一个混合显卡的无复用解决方案 - 至少我无法更改 BIOS 中的活动卡)。
我认为它是如何工作的:
1) 如果未安装专有驱动程序,系统将同时加载 intel 和 nouveau 驱动程序,默认使用 intel,并在将 DRI_PRIME=1 传递给命令时使用 nouveau。
2) 如果安装了专有驱动程序,系统将不会加载它们,除非按照此处详细说明的方式设置 xorg 配置(https://wiki.archlinux.org/index.php/NVIDIA_Optimus- “使用 nvidia”部分)。
3) 如果安装了专有驱动程序,并设置了正确的 xorg 配置,则系统将尝试使用 nvidia 驱动程序和 nvidia GPU,但会出现黑屏,因为 nvidia GPU 未连接到显示器 - ~/.xinitrc(如果使用 startx)或显示管理器配置文件中需要两行 xrandr 行来告诉 xorg 使用卸载。
实际发生了什么:
为了调查我的 bumblebee 问题,我卸载了与 nvidia 或 bumblebee 相关的所有内容,并且仅安装了 nvidia 驱动程序。
令我惊讶的是,启动后,SDDM 未能出现。我切换到一个免费的tty,杀死了sddm(sudo systemctl stop sddm),并使用了startx(.xinitrc是用exec startkde设置的,但是不是与两条 xrandr 行)。让我(再次)惊讶的是,KDE 启动了。我的字体看起来很小/分辨率很低,但其他方面都很好,还有一个 glxinfo | grep NVIDIA 确认我正在使用 nvidia。
之后,我将两行 xrandr 附加到 /usr/share/sddm/scripts/Xsetup 中,然后 SDDM 启动没有问题,并且我可以登录 Plasma。字体仍然很糟糕,但它可以与 nvidia 一起使用。
问题:
如果我根本没有 xorg.conf 文件,为什么我的系统要使用 Nvidia 驱动程序? (xorg.conf.d 也是空的,保存键盘文件)如果它默认使用 Nvidia 驱动程序,那么为什么要告诉各处(Arch Wiki、Nvidia 文档)为 nvidia 驱动程序创建 xorg.conf 文件(如果我想)使用它们?更重要的是,为什么安装bumblebee后系统会默认使用Intel呢? /etc/X11 文件夹在两种情况下具有相同的内容不xorg.conf 文件。或者,当使用内置 PRIME 小程序时,在 Ubuntu 上也会发生同样的情况 - 当您切换到 NVIDIA 时,会使用 xorg.conf 文件,但在使用 Intel 时,该 xorg.conf 被禁用。那么为什么它不使用 NVIDIA,如果在我的情况下使用 NVIDIA,即使有没有 xorg.conf 文件告诉 xorg 使用 NVIDIA?
为什么我能够在 NVIDIA 上运行 Plasma,而我的 startx 中没有 xrandr 行?只有 SDDM 有问题。使用startx 运行是可能的。我认为只有在这些线路存在的情况下才应该进行卸载?
答案1
它们的工作方式取决于相关的发行版。您所描述的实际行为与大多数发行版的行为相匹配,但是有一些奇怪的情况,例如 Gentoo(需要您手动将内核驱动程序列入黑名单以加载专有驱动程序),它们不会这样做。
至于为什么它的行为方式就是这样,现代 X 服务器将自动正确检测大多数内容,而无需您提到的任何配置文件。事实上,当前最好的做法是明确不是拥有这些配置文件,除非您的设置无法通过自动检测正确开箱即用,因此更改周围的硬件(例如,安装不同的显卡)不会破坏您的 X 配置。还值得注意的是,很多文档还没有赶上这一点,Arch 特别建议您拥有这些文件,这样您就可以获得您想要的行为(这可能是也可能不是最好的选择)。这里重要的是 X 将使用默认情况下由内核加载的任何视频驱动程序,并且如果提供的配置没有意义(或不适用于硬件)。
这就提出了一个问题:为什么你的内核加载专有驱动程序而不是 nouveau。如果没有关于您的确切配置的大量信息,我无法确切地告诉您为什么会发生这种情况,但我愿意打赌 Arch 上的当前行为与大多数发行版相匹配,并且会优先使用专有驱动程序而不是 nouveau。假设是这种情况,您(可能)可以通过将以下内容添加到引导加载程序的内核命令行来强制使用 nouveau:
modules_blacklist=nvidia
这将阻止专有驱动程序加载(即使您也使用类似工具明确告诉它们modprobe -f
),这应该会导致 nouveau 加载。