为了防止过热,使用专有的NVidia驱动程序与Mac上的EFI。

我在我的2010年中期的白色MacBook上安装了双系统,分别是Mac OS X 10.8和Kubuntu 12.10 64x。(型号标识:MacBook7,1。我已将内存从2GB升级到8GB,如果这有关系的话。)我在Kubuntu上安装了专有的NVIDIA驱动程序。
根据Kubuntu中的温度监视小工具显示,我的温度似乎比在Mac OS X下高约10℃。在Mac OS X中,我使用Temperature Monitor。我将Kubuntu中的CPU Core 0和CPU Core 1值与Mac OS X中的CPU Core 1和CPU Core 2值进行比较。
10℃的温差可能不是一个非常严重的过热问题,但当我在电脑上进行非常强烈的操作(例如玩Team Fortress 2一段时间)时,我的CPU在OSX上达到约70℃,而在Kubuntu上玩同样的游戏一段时间后,我的CPU达到约80℃。我担心更高的温度可能会缩短我的笔记本电脑的使用寿命。
我做了一些研究,发现可能是因为我以BIOS模式安装了它,导致了过热的问题。我无法以EFI模式安装,因为专有的NVidia驱动程序在那种模式下无法工作(已经尝试过,结果只有黑屏)。有人知道如何在EFI模式下让专有的NVidia驱动程序正常工作吗?
编辑:好吧,即使没有办法在EFI模式下使用专有的nvidia驱动程序(似乎没有办法,我没有得到任何答案),如果能够在BIOS模式下解决过热问题,我也会很高兴。我尝试在我的xorg.conf文件的设备部分添加以下内容以启用节能功能:
     Option         "DPMS" "1"
     Option         "RegistryDwords" "EnableBrightnessControl=1; PowerMizerEnable=0x1; PerfLevelSrc=0x2233; PowerMizerDefault=0x3"

...但那没起作用。

哦,并且我并没有使用rEFIt,可能是那个原因吗?

4个回答

对我来说,在加载Nvidia驱动程序的情况下,以UEFI模式启动Ubuntu也总是导致众所周知的黑屏问题,特别是在X启动时。
直到昨天,这个问题才得到解决!
另一个帖子中,我找到了一些非常有希望的信息,关于如何在Mac上以UEFI模式安装Windows 7。那里的人们遇到了Windows 7所需的int 10h传统支持的问题,并发现可以通过执行无人值守安装来绕过此问题(因为在安装过程中显示器不工作)。成功启动带有Nvidia驱动程序的Ubuntu的关键信息是,在EFI引导开始时(在交给grub之前),苹果的固件实际上并没有将VGA卡激活为PCI-E总线主控。Windows的人们解释了如何使用EFI shell来绕过这个问题,该shell会链式加载Windows引导管理器,以至少在无人值守模式下运行设置。而且好消息是:在GRUB中很容易做到这一点
实际上,我现在正在使用一台运行Ubuntu Vivid的MacBook Pro 7,1(2010年中期)以UEFI模式启动的电脑来输入这段文字(Xorg.0.log)。然而,只要有GRUB的EFI版本,比如Ubuntu 14.04.2 LTS,就可以轻松地在任何Linux发行版上运行或适应。
~$ dmesg | grep -i efi
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-3.19.0-15-generic.efi.signed root=UUID=7843c644-e6f4-4d64-9317-0b854cb524f2 ro quiet splash intremap=off acpi_osi=! acpi_osi=Darwin nomodeset vt.handoff=7
[    0.000000] efi: EFI v1.10 by Apple
[    0.000000] efi:  ACPI=0xbf96a000  ACPI 2.0=0xbf96a014  SMBIOS=0xbf71a000

简而言之,我们需要设置两个PCI-E寄存器:一个用于启用显卡的总线主控功能,另一个用于启用显卡的PCI-E桥接器上的VGA支持。所以这实际上与Nvidia驱动程序无关,甚至可以说与苹果过时/残缺不全的EFI实现也无关。
以下是我解决问题的方法。当然,首先要感谢MacRumors论坛上的那些人。 免责声明 以下说明按原样提供,不提供任何保证,也不承担任何责任。 请自行承担风险!
  1. 以UEFI模式安装Ubuntu并安装Nvidia驱动程序

我不会在这里详细介绍,因为网络上有很多文章告诉你如何做到这一点,并最终使你的机器过热或在安装Nvidia驱动程序后出现黑屏(例如:www.rodsbooks.com/ubuntu-efi)。
请注意,以下说明假定您已成功安装并以UEFI模式启动。您可以通过检查目录/sys/firmware的存在来验证,该目录只在以EFI模式启动后才会创建。
  1. 找到正确的PCI-E总线标识符

我们需要图形卡的ID和它连接到的PCI-E桥接器的ID。在命令行中执行以下命令:
~$ sudo lshw -businfo -class bridge -class display
pci@0000:00:00.0              bridge         MCP89 HOST Bridge
pci@0000:00:03.0              bridge         MCP89 LPC Bridge
pci@0000:00:0e.0              bridge         NVIDIA Corporation
pci@0000:00:15.0              bridge         NVIDIA Corporation
pci@0000:00:16.0              bridge         NVIDIA Corporation
pci@0000:00:17.0     >!!<     bridge         MCP89 PCI Express Bridge
pci@0000:04:00.0     >!!<     display        MCP89 GeForce 320M

请查看以下内容:(1)显示为display的行和(2)在那个显示行之前的桥接线路。写下桥接设备(此处为00:17.0)和显示器设备(此处为04:00.0)的PCI-E总线ID(格式为XX:YY.Z),并记住哪个是哪个。注意:这些ID可能因您的Mac型号和版本而异。

  1. 创建一个GRUB脚本,在引导时设置PCI-E寄存器。

使用sudo nano /etc/grub.d/01_enable_vga.conf打开文本编辑器,并复制/粘贴下面的内容。确保将所有4行粘贴到该文件中!在步骤2中注意到的桥接设备的PCI-E ID处替换00:17.0。在步骤2中注意到的显示设备的PCI-E ID处替换04:00.0
cat << EOF
setpci -s "00:17.0" 3e.b=8
setpci -s "04:00.0" 04.b=7
EOF

最后,将创建的文件设置为可执行,并使用以下两个命令更新您的 grub 配置文件。
~$ sudo chmod 755 /etc/grub.d/01_enable_vga.conf
~$ sudo update-grub

4. 重新启动并检查。
如果在重启后,寄存器的值已经设为8(桥接设备)和7(显示设备),那么一切都进行得很顺利。
 ~$ sudo setpci -s "00:17.0" 3e.b
 08
 ~$ sudo setpci -s "04:00.0" 04.b
 07

安装Nvidia驱动程序,尽情享受吧!
使用Ubuntu的“附加驱动程序”图形界面来安装Nvidia驱动程序。我建议按照这篇文章中的步骤来启用亮度控制,因为它在初始状态下无法正常工作。

你能否提供你的/etc/X11/xorg.conf文件的链接? - Patrick
抱歉,在写完这篇文章几个月后,我已经卖掉了这台机器。但你可以尝试在这个 Arch 论坛的帖子上询问:https://bbs.archlinux.org/viewtopic.php?id=162289&p=4。 - Andreas
1这对我的2010款MacBook Air完全有效,之前在待机后屏幕一片黑,性能也很差劲。谢谢,解决了我的问题! - pyrho
1几年过去了,这款2010年的Macbook Air仍然救了不少人的命。谢谢! - Axel Lieber
Debian维基有一篇关于这种方法的介绍(并给予了这篇帖子的认可):https://wiki.debian.org/InstallingDebianOn/Apple/MacBookPro/7-1#GPU_.2F_Nvidia_Geforce_320M - daviewales

我之前的笔记本电脑也遇到了类似的问题,下面的方法对我有帮助,希望对你也有用。

首先,使用Jupiter可以解决大部分过热和电池寿命问题。
我的笔记本电脑平均运行在50摄氏度左右,在安装Jupiter之前一直运行在68摄氏度。

sudo add-apt-repository ppa:webupd8team/jupiter
sudo apt-get update
sudo apt-get install jupiter

安装完Jupiter后,我还安装了Bumblebee,以便可以正常使用NVIDIA显卡并在需要时切换到英特尔显卡,以节省电池寿命并降低发热。

add-apt-repository ppa:bumblebee/stable
sudo apt-get install nvidia-current
sudo apt-get install bumblebee bumblebee-nvidia

重新启动电脑

然后,测试一下是否成功:

optirun glxspheres

要安装Bumblebee GUI界面,请参考此链接: https://askubuntu.com/a/170596/207851

完成上述步骤后,我的笔记本电脑平均运行在47摄氏度左右,电池续航时间为3小时(这是在听音乐和进行开发/使用Blender等3D工作的情况下)。

祝你好运,希望这能帮到你。

我会尽力帮助你。
首先,你是正确的。你不能同时使用EFI模式和专有驱动程序。不仅如此,还会导致很多其他问题。目前,你最好的支持选择是以BIOS模式安装。
至于散热问题,请记住,OS X运行时温度较低,因为他们知道在高温下使用他们的“腿部加热器”是不舒服的。也就是说,你可以在Linux中控制一些设置,使温度保持较低。
这个代码相当不错。编译它,运行它,并设置它在启动时自动启动,你应该会得到“更好”的结果。
你也可以手动控制风扇速度。
首先。
echo 1 > /sys/devices/platform/applesmc.768/fan1_manual  
echo 1 > /sys/devices/platform/applesmc.768/fan2_manual  

然后将一个速度回传给风扇控制器。
echo 6000 > /sys/devices/platform/applesmc.768/fan1_input  
echo 6000 > /sys/devices/platform/applesmc.768/fan2_input  

6000是你在上面的脚本中设定的转速目标。6000是“官方”的最大值。在那个速度下,你会听到熟悉的起飞声音,而且你的17英寸散热器会变得相当凉爽。但你的风扇也会很快烧坏。2000是最低值。我经常以2000的速度运行,即使在游戏时也很少超过3000。当然,这意味着它比在OS X中运行时更加温暖。
那款型号的CPU的官方最高温度是105摄氏度。所以你有足够的余地。
附言:清理一下通风口,以确保畅通。
再附言:这是我的mbpfan配置,我用它来过度冷却(相当多),但它能让笔记本保持触感凉爽,并且比在OS X中更凉爽。
[general]   
min_fan_speed = 3200    # default is 2000  
max_fan_speed = 6200    # default is 6200  
low_temp = 45       # try ranges 55-63, default is 63  
high_temp = 60          # try ranges 58-66, default is 66  
max_temp = 62           # do not set it > 90, default is 86  
polling_interval = 7    # default is 7  

我的做法是运行一些会让我的CPU极度负荷并将CPU运行到100%的东西。然后将风扇转速设置为6000 RPM,看温度会在哪里稳定下来。然后将该温度设置为我的“ high_temp”。
将“ max_temp”设置为略高于该温度。不要太远,但比过度冷却的例子更远。
接下来将CPU切换到节能模式。让它处于空闲状态,风扇仍然保持在6000.将该温度设置为您的“ low_temp”。
最后,将最小风速设置为“你喜欢的”值。基本上,刚好足够低,以至于您听不到它。
然后您可以运行一段时间并查看。同样,该型号的CPU最大温度为105度,因此Linux让其达到80度并没有错。它不会损坏任何东西。但是更改风扇速度确实使外壳保持更凉爽(因为它是CPU和GPU的散热器,可以在您的膝盖上变得相当温暖),这纯粹是个人喜好。
对我来说,最低温度50度,最高温度60度,最大温度70度非常适合。但是这种微调的程度完全取决于个人口味。通过这种过度降温的配置,我的CPU从未超过59度。当然,噪音也相当大。

你很快也会让你的粉丝失去兴趣。这是不是意味着我的粉丝会被弄坏?还是我误解了?不然的话,我会试一试。 - jobukkit
以全速运行6000会很快烧坏它们。以更正常的速度运行(比如3000-4000)就没问题。风扇是为了在6000时达到峰值,而不是一直以此速度运转。 - coteyr
我尝试安装了那个,但是没有任何效果。我的MacBook还是很热,我能感觉到热量。 - jobukkit
你试过手动运行风扇到6000转并清理空气流通路径了吗?我的CPU温度目前是59.5度,所有四个核心都在100%。它不会比这更凉快。 - coteyr
这不可能是我的空气流通路径的问题,因为在Mac OS X下一切都很正常。当我把手指放在左侧“Alt”键上时,在Ubuntu系统下能感觉到热量,但在Mac OS X下则没有。 - jobukkit
Linux和OS X的散热方式不同。Linux更倾向于“安静”,而OS X则更倾向于“凉爽”。所以,如果你闲置时感觉温暖,很可能是因为空气流动不畅(因为它已经变暖,但还不足以使风扇运转得更快)。如果你想保持更凉爽的状态(除了个人偏好外,并没有真正的必要,而且有一块17英寸的散热器,我觉得这是一个重要因素),那么你需要在Linux中将风扇速度设置为高于默认值。我已经在答案中添加了我的mbpfan测试配置。请注意,这样会导致过度降温。 - coteyr
@coteyr 我认为这些论点并不太有道理。如果运行不同的软件引起了这个问题,那么你就不能说是硬件的错了。事实上,大多数Linux专有驱动在功耗方面对于许多移动设备来说优化得不够好(导致发热更多)。在我的HP笔记本上,这主要与Nvidia驱动有关。在Linux下空闲系统功耗为20-25W,而在Windows中只有7W! - gertvdijk
嗯——OS X在大约70度时会进入喷气发动机模式(6000 RPM)。Linux甚至不会在温度较高时超过3000 RPM,因为CPU可以达到105度。所以对于Linux来说,达到比OS X更高的温度并不罕见。也就是说,你可以在Linux中“手动”控制风扇,以获得相同的过冷效果。这个问题与驱动程序优化无关,纯粹是一个“热量”与“冷却”问题。当CPU达到70度时,无论它有多“忙”,喷气发动机仍然会启动。现在如果你想比较热量产生,那么你可以说Linux... - coteyr
生成“喷气发动机”的频率更高。然而,这并不有效,因为你没有比较相同的风扇缩放算法。所以,如果你想降低一个指标(温度),那就运行更多的冷却。即使在Linux中功耗较低,它仍然会默认运行得更热,因为风扇速度选择器选择了不同的理想范围。这就像把空调设定在90度,然后试图责怪烤箱导致房子变暖一样。只需去调低空调温度即可。 - coteyr
谢谢提供配置文件,我会试一下。但是请问我应该把这个配置文件放在哪里?(我已经安装了 mbpfan) - jobukkit
/etc/mbpfan.conf - coteyr
我尝试了那个配置,我的风扇疯狂地转动起来。说真的,在登录界面时,它们的声音比在Mac OS X下玩3D FPS游戏时要大3-4-5倍。这肯定不是好事。不过还是谢谢你指出那个配置,我会看看能不能调整一下。 - jobukkit
添加了回答的步骤 - coteyr
实际上,我已经在我的Mac Book Pro 5,1上使用了我的nvidia 9400GT/9600GT显卡以EFI模式。因此,除非你确定这适用于这个特定的型号,否则我会说这是相当可能的。 - tomodachi
@tomodachi,我听人们说过这个,但我从未让我的MBP7.1实现过。也许是硬件或EFI固件之类的差异,尽管我完全同意这可能与硬件版本有关。 - coteyr
@tomodachi 哎呀?好奇怪。我的显卡是Nvidia GeForce 320M,在尝试以EFI模式安装这些驱动程序时,重新启动后屏幕变黑。难道我应该通过附加驱动程序界面进行安装吗? - jobukkit

我正在将Linux Mint 20 xfce安装到一台2010年中期的MacBook Pro上。
我按照这些步骤进行操作,我的PCI桥和显卡的数字ID实际上与此处列出的相同(17和4)。我将脚本添加到了/etc/grub.d目录下,但在重新启动后,虽然"setpci"显示"setpci -s "04:00.0" 04.b=7"这一行正在应用,但"setpci -s "00:17.0" 3e.b=8"似乎没有生效,因为"setpci -s "00:17.0" 3e.b"返回02。
更奇怪的是,在root shell中,"setpci -s "00:17.0" 3e.b=8"确实生效了,"setpci -s "00:17.0" 3e.b"返回08。
我担心切换到NVIDIA驱动程序会导致黑屏问题,所以有些犹豫。
非常感谢任何指导...

更新。如果我从/etc/grub.d中删除01文件,setpci -s检查04.b仍然显示07。这表明我的01文件根本没有加载。我已经确认它具有与/etc/grub.d中的其他脚本相同的0755权限。请注意,update-grub命令会报告缺少设备/dev/sdb的错误,我认为这是用于安装Mint的USB闪存驱动器。此外,在/boot/grub/grub.cfg中没有任何setpic调用的迹象。将解决该问题并重试。 - randy rue
更新:关于/dev/sdb的update-grub错误并不是问题所在。问题出在我发现了一个内置的读卡器,我需要设置一个LVM过滤器来忽略它。但这并没有解决我的问题。 - randy rue
解决:我之前误读了上述说明,需要更好地理解 update-grub 的工作原理。/etc/grub.d 中的脚本不会被插入到 /boot/grub/grub.cfg 中,而是实际上对其进行操作。不知道这一点,我忽略了上面 01... 脚本中的 cat << EOF 行,以为 OP 只是在试图让编写文件变得简单,并且搞乱了说明。哎呀。将 01 脚本改为四行内容,运行 update-grub,重新启动。安装了 Nvidia 驱动程序,重启后进入了图形界面。 - randy rue
1最后一点说明:在按照上述步骤重新启动后,"setpci -s "00:17.0" 3e.b" 返回的是 "0a" 而不是 "8"。冒了个险,无论如何重新启动后一切似乎都正常。 - randy rue