过去一周,我一直在多个发行版上苦苦挣扎于 gnome 3.24。
我有一台使用 NVIDIA Optimus 技术的戴尔 XPS 9560,它基本上具有双 GPU(集成 CPU + 独立 CPU)。就我而言,它是来自 i7 的 Kaby Lake 显卡和 NVIDIA GTX 1050。
我尝试安装 Ubuntu 17.04 Gnome,因为它是最新的发行版,并且我想象它会比我多次失败的尝试(arch、tumbleweed、fedora 26)更好。
问题是我可以启动 Wayland 会话(全新安装后),但我无法使用辅助 GPU(nvidia)打开应用程序、游戏等。它也没有出现在设置中的任何地方。
然后,我运行 Xorg 会话来获取附加驱动程序并安装了 nvidia 驱动程序,重新启动,并且在 Xorg 会话中我的默认 GPU 现在是 NVIDIA,但是我无法启动我的 Wayland 会话。
因此,我打开了 Nvidia 设置,并在 Prime Profiles 中将 GPU 切换为 Intel GPU,然后重新启动,现在我可以启动 Wayland 会话,但现在 Xorg 会话只会显示灰色屏幕。即使在 Wayland 中使用 nvidia 驱动程序并在 Intel Graphics 上设置了 prime 配置文件,我也无法使用辅助 GPU 打开。因此,到目前为止,我已恢复为默认的 xorg nouveau 驱动程序,并使用我的 Wayland 会话和 Intel Graphics。
我还没有尝试在这个发行版上安装最新的测试版驱动程序,但是当我先前尝试时,我甚至无法让主要配置文件出现在 nvidia 设置中。
我不知道我的问题是否来自过时的驱动程序、硬件支持或矩阵故障,因此任何形式的帮助都将不胜感激。
编辑:我尝试安装的 nvidia 版本是当前的 375,我也在其他发行版中尝试过 381 beta,但还没有在 Ubuntu 17.04 中尝试过。另外:
$ lspci | grep -E "VGA|3D"
00:02.0 VGA compatible controller: Intel Corporation Device 591b (rev 04)
01:00.0 3D controller: NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile] (rev a1)
答案1
尝试这个:
1.- 创建一个文件夹来存储 SSDT 文件。然后从 ACPI 表中提取它(以 root 身份运行此部分):
# mkdir dsdt
# cd dsdt
# SSDT_FILES=`ls /sys/firmware/acpi/tables/ | grep SSDT`
# for file in $SSDT_FILES ; do cat "/sys/firmware/acpi/tables/$file" > "$file.dat"; done
# cat /sys/firmware/acpi/tables/DSDT > DSDT.dat
2.- 确保已安装 IASL。在 ubuntu 上,sudoapt install iasl
就足够了。我下载了源代码并自行编译以获取最新版本,但我认为这没有必要。
3.- 一个 SSDT 文件中有一个重复的定义,我们无法对其进行反汇编。找出它是哪一个并将其删除:
# grep PRT0 *.dat
Binary file DSDT.dat matches
Binary file SSDT1.dat matches
# mv SSDT1.dat SSDT1.bak
所以在我的情况下是 SSDT1。用你得到的任何内容替换它。不要碰 DSDT.dat
4.- 接下来,我们找到包含需要更改的代码的 SSDT 文件。我们查找同时包含“NVID”和“OSYS”的文件:(在 grep 中可能有一个更好的方法可以做到这一点)
# grep NVID *.dat
Binary file SSDT10.dat matches
Binary file SSDT3.dat matches
# grep OSYS SSDT10.dat
# grep OSYS SSDT3.dat
Binary file SSDT3.dat matches
因此,就我的情况而言,它是 SSDT3,如果它不同,则您可以用获得的任何内容替换所有 SSDT3 的进一步实例。
5.- 拆卸!
# iasl -e *.dat -d SSDT3.dat
6.- 希望此时您没有看到任何错误。将声明之外的所有 OSYS 实例替换为适用于 Windows 7 的常量,并将定义块编号增加一:
# sed -i '/^ *External/! s/OSYS/0x07D9/g' SSDT3.dsl
# sed -i '/^ *DefinitionBlock/ s/0x00001000/0x00001001/g' SSDT3.dsl
如果您使用的是不同的 BIOS,则 Definition Block 编号可能不是 1000。只需在文本编辑器中打开 SSDT3.dsl 并查找 DefinitionBlock。无论您在该行上看到什么数字,都将其加一。
7.- 编译所有内容并希望没有错误。
# iasl -ve -tc -p SSDT3 SSDT3.dsl
8.-制作图像:
# mkdir -p kernel/firmware/acpi
# cp SSDT3.aml kernel/firmware/acpi/ssdt3.aml
# find kernel | cpio -H newc --create > acpi_gpufix
8.- 以下所有说明均适用于 Ubuntu 和 GRUB2。将其复制到启动文件夹。initrd.img 是启动文件夹中的默认 img:
# cp acpi_gpufix /boot/
您可以通过编辑 /etc/grub.d/10_linux 将其永久添加到您的 GRUB。我必须将该行更改initrd ${rel_dirname}/${initrd}
为initrd ${rel_dirname}/acpi_gpufix ${rel_dirname}/${initrd}
。然后运行 update-grub2。
9.- 检查其是否有效:
$ dmesg | grep ACPI | grep override
[ 0.000000] ACPI: Table Upgrade: override [SSDT-PegSsd- PegSsdt]
[ 0.000000] ACPI: SSDT 0x000000007A715080 Physical table override, new table: 0x0000000079493000
现在你可以更换 GPU 而不会冻结
来源:
https://github.com/Bumblebee-Project/Bumblebee/issues/764#issuecomment-306543064 https://devtalk.nvidia.com/default/topic/1012369/linux/laptop-freezes-changing-video-cards https://askubuntu.com/a/923216/680254