如何关闭 Macbook Pro 上的 NVIDIA 显卡?

如何关闭 Macbook Pro 上的 NVIDIA 显卡?

我有一台 2010 年的 Macbook Pro,它配备了 NVIDIA 显卡和 Intel 集成显卡:

$ lspci|grep -i vga
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 12)
01:00.0 VGA compatible controller: NVIDIA Corporation GT216M [GeForce GT 330M] (rev a2)

当我安装专有的 NVIDIA 驱动程序 (340.76) 时,启动 X 服务器时系统挂起。我听说了这是因为 NVIDIA 驱动程序不支持 Macbook 的特殊硬件特性。

因此,我想完全关闭 NVIDIA 显卡,只使用 Intel 集成显卡,因为自从安装了 Ubuntu 后,在办公室工作时电池只能维持约 1.5 小时。在 Mac OS 上进行类似工作时,电池可以维持约 3 小时。

我读过两种方法可以做到这一点:

  1. 在 BIOS 中关闭独立显卡设备
  2. 或切换至集成显卡nvidia-settings
  3. 更新:启动进入 OS X 并强制使用 2.2.1 中的集成显卡gfxCardStatus

第一种方法对我来说不起作用,因为 Macbook 上没有 BIOS。第二种方法也不行,因为我无法安装专有驱动程序,如上所述。

它基本上是全新安装的 Ubuntu 14.04,没有任何值得一提的调整。

更新:在阅读了大量的文档后,我得出的结论是,这只能通过在 Macbook Pro 上使用方法 3 来实现,即必须仍然安装有 OS X,而我还没有!这真是糟糕透了,因为这意味着我没有机会关闭 NVIDIA GPU

答案1

我碰巧有和你一模一样的电脑。我的想法是在 grub 中添加几行代码,以在 efi 级别禁用独立显卡:

$ cat /etc/grub.d/10_linux
# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
    echo "    load_video" | sed "s/^/$submenu_indentation/"
else
    if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
        echo "        load_video" | sed "s/^/$submenu_indentation/"
    fi
fi
if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
    ([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
    echo "    gfxmode \$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
fi

echo "        outb 0x728 1" | sed "s/^/$submenu_indentation/"
echo "        outb 0x710 2" | sed "s/^/$submenu_indentation/"
echo "        outb 0x740 2" | sed "s/^/$submenu_indentation/"
echo "        outb 0x750 0" | sed "s/^/$submenu_indentation/"

echo "        insmod gzio" | sed "s/^/$submenu_indentation/"
echo "        if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/"

insmod gzio我只是在和之间添加了 outb 行linux_gfx_mode。供参考:

outb 0x728 1 # Switch select
outb 0x710 2 # Switch display
outb 0x740 2 # Switch DDC
outb 0x750 0 # Power down discrete graphics 

这将在 pcie-link 级别禁用显卡,使其从系统中消失。与 macOS 不同,IronLake Intel HD Graphics 可以驱动外部显示输出,但没有音频。

您所描述的 mac 禁用 igpu,除非启动 macOS,这适用于 2010 年以后生产的任何 mac,或任何带有 Sandy Bridge 芯片或更高版本的 mac。(2010=nehalem,第一代 45nm。)apple_set_os.efi 技巧在 2011 年之前不起作用(2011 年之前,当时,使用 efi 启动的任何东西都会像 macOS 一样运行,efi 没有检查操作系统,只是它是本地启动的,启用了集成显卡。并且启动禁用 igpu 的操作系统的唯一方法是传统启动,而我们没有这样做)我尝试运行它,它打印出未找到 apple_set_os 协议。我运行 16.04.3 稳定版,一旦您可以在不崩溃的情况下使用计算机,那是一种非常好的体验。

关于 nvidia 专有驱动程序:我使用 dolphin-emu 和 DRI_PRIME=1 进行了一些 opengl 测试,启动时没有 outb 0x750,因此禁用了 dGPU 与 lvds 显示器的连接,但可以无头渲染。Nouveau 和专有驱动程序的性能几乎相同。(事实上,这里的大多数极端情况都是 nouveau 胜出的)NV50/Tesla 架构可能是 nouveau 支持最好的架构。因此,我实际上建议继续使用 nouveau。

最后,要永久启用启动时的英特尔显卡(只要 nvram 变量没有被删除),您可以从 Linux 执行以下操作:

mount -t efivarfs rw /sys/firmware/efi/efivars/ # make sure efi is mounted
sudo bash -c 'printf "\x07\x00\x00\x00\x01\x00\x00\x00" > /sys/firmware/efi/efivars/gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9'

你也可以在 macOS 上完成同样的事情:

sudo nvram fa4ce28d-b62f-4c99-9cc3-6815686e30f9:gpu-power-prefs=%01%00%00%00

答案2

对于此适配器,正确的驱动程序是 nvidia-340。可以按以下方式安装:

sudo apt-get install nvidia-340 nvidia-prime

答案3

这是一个黑客攻击,应该仔细阅读来源,但这可能会对你有所帮助:

如果启动了除 MacOS 之外的其他程序,Macbook 将停用英特尔板载显卡。您可以向 efi 添加一个文件,并添加一个 grub 选项来链式加载它,让 efi 认为它正在启动 MacOS,因此所有硬件在启动期间都处于激活状态。

从以下位置获取最新版本的二进制 efi 文件https://github.com/0xbb/apple_set_os.efi/releases

将其复制到已安装的 efi 分区的新子文件夹中

mkdir /boot/efi/EFI/custom
cp apple_set_os.efi /boot/efi/EFI/custom

添加到 /etc/grub.d/40_custom

search --no-floppy --set=root --label EFI
chainloader (${root})/EFI/custom/apple_set_os.efi
boot

来源: https://github.com/0xbb/apple_set_os.efi

相关内容