我有一台华硕 GL553,配备英特尔 560 和 Nvidia GTX 1050,我尝试使用 nvidia-prime 配置我的混合卡。我安装了 Ubuntu Gnome 17.04,然后安装了 nvidia-381 并运行 prime-select intel,我不得不硬重启,当我尝试登录时系统冻结。我已经研究并阅读了所有这些主题,但我找不到解决方案。
- https://devtalk.nvidia.com/default/topic/991853/complete-freeze-with-nvidia-prime/?offset=8
- https://devtalk.nvidia.com/default/topic/991853/complete-freeze-with-nvidia-prime/?offset=18
- 编辑为:在 16.04 上,使用 4.7.2 内核的英特尔显卡关机时挂起
- NVIDIA-PRIME:无法切换到英特尔
- https://bugs.launchpad.net/lightdm/+bug/1637733
- https://bugs.launchpad.net/ubuntu/+source/nvidia-prime/+bug/1663926
有人可以正确配置 nvidia 吗?
答案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。
更新:现在 GRUB 支持额外的 initrd:GRUB_EARLY_INITRD_LINUX_CUSTOM=acpi_gpufix.img 到你的 /etc/default/grub
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
答案2
很久以前,我曾经拥有一台 nvidia 笔记本电脑,也遇到过类似的 gnome 问题。对我而言,唯一有效的办法就是卸载 gnome,改用 KDE。但我再说一遍,我想那是很久以前的 10~ 版本了。
您可以在命令模式中启动来执行此操作:
要启动single user
模式,请编辑要启动的 GRUB 菜单项的启动说明,并添加内核参数/选项single
。下面是有关如何执行此操作的简要说明。
- 重启时按住左键
Shift
调出 GRUB 菜单 - 选择(突出显示)您想要使用的 GRUB 启动菜单项。
- 按下
e
即可编辑所选启动菜单项的 GRUB 启动命令。 在命令列表底部附近查找类似以下内容的行
linux /boot/vmlinuz-3.2.0-24-generic root=UUID=bc6f8146-1523-46a6-8b\ 6a-64b819ccf2b7 ro quiet splash initrd /boot/initrd.img-3.2.0-24-generic
通过将内核启动参数 single 添加到行尾(即 之后
ro quiet splash
)来更改 (4) 中的中间一行。
对于此示例,您需要更改:
6a-64b819ccf2b7 ro quiet splash
到
6a-64b819ccf2b7 ro quiet splash single
- 按
Ctrl+X
或F10
使用这些内核选项进行启动。
笔记:这些变化不是持久性。通过这种方式对内核启动选项所做的任何更改都只会影响下一次启动,并且只有在您仍处于 GRUB 编辑模式时按 Ctrl+X 或 F10 启动该启动时才会影响。