我正在尝试使用 Ubuntu 20.04 LTS 恢复旧的 Lenovo Ideapad Z360 笔记本电脑。这台笔记本电脑有一个集成的 Intel GPU 和一个独立的 Nvidia GPU,如下所示:
$ lspci -k | grep -EA3 'VGA|3D|Display'
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 18)
Subsystem: Lenovo Core Processor Integrated Graphics Controller
Kernel driver in use: i915
Kernel modules: i915
--
01:00.0 VGA compatible controller: NVIDIA Corporation GT218M [GeForce 310M] (rev a2)
Subsystem: Lenovo GT218M [GeForce 310M]
Kernel driver in use: nvidia
Kernel modules: nvidiafb, nouveau, nvidia
在 Ubuntu Mate 20.04 上,我可以顺利地从 Nvidia GPU 切换到 Intel GPU。我可以使用面板图标 (mate-optimus) 执行此操作;或者使用终端 (prime-select);或者使用 Nvidia 应用程序 (nvidia-settings)。它们都可以正常工作,在我注销并重新登录后,桌面可以正常加载。“按需”选项不起作用 --- mate-optimus 的 github 指出“NVIDIA On-Demand(称为 PRIME Render Offload)将需要 NVIDIA 435 驱动程序”,所以我想这不包括我的 GPU(使用 NVIDIA 340 驱动程序)---,但我对此没意见。我很高兴能够在需要时在 Intel 和 Nvidia GPU 之间切换。在 Ubuntu Mate 20.04 上,这很好用。
但是,在 Ubuntu 20.04(Gnome)上,切换到 Intel GPU 不起作用!!
我注意到的第一件事是 Nvidia 应用程序 (nvidia-settings) 中没有“PRIME 配置文件”菜单部分。我可以通过安装 nvidia-prime 软件包(Ubuntu Mate 中预装,但 Ubuntu Gnome 中没有)来解决这个问题。
但是,当我尝试切换到 Intel GPU 时,我无法在注销后重新登录桌面(它会循环回到 gdm3 欢迎界面)。如果在选择 Intel GPU 时重新启动,则会出现黑屏。为了解决这个问题,我必须切换回 Nvidia GPU(使用 prime-select),或者删除所有 nvidia 软件包(并改用 nouveau 驱动程序)。
所以我的问题是:为什么它在 Ubuntu Mate 上运行,但在 Ubuntu Gnome 上运行不起来?
答案1
我有一台旧的 Alienware 11Mx3,在 Nvidia 310 上安装了 Optimus。它在 Nvidia 345.21 上运行得非常好。我可以顺利地来回切换……我的诀窍是选择不安装“第三方驱动程序和……”。这样我就可以获得一个封闭驱动程序的干净安装。
从那里登录后,我更新、升级并无需重新启动即可安装 nvidia-driver-435。重新启动后,一切正常。
一切都很顺利,相信我,我已经对 Optimus 失去了所有希望。以前,我的 Alienware 一直在包里积满灰尘……现在它和我到处都在一起。我正在运行 Ubuntu Budgie 20.04 LTS,在 Intel 和 Nvidia 模式下运行非常流畅……
答案2
我也一直在努力解决这个问题,我偶然发现你需要将 nouveau 内核模块列入黑名单。一旦我这样做了,机器就可以在双显示器和笔记本电脑模式下正常启动。
我还发现 nouveau 在另一个系统上与机器学习的 lambda 堆栈有关。你必须在 Linux 内核和 grub 中将 nouveau 列入黑名单。
简写:
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
在 grub 中将 nouveau 列入黑名单:
编辑 /etc/default/grub
修改 GRUB_CMDLINE_LINUX_DEFAULT 以包含 nomodeset。例如:
GRUB_CMDLINE_LINUX_DEFAULT="nomodset"
运行更新-grub
重启