2011 MacBook Pro 显卡问题 High Serria 解决方式之软件篇

前言

2011 年 MacBook Pro 的 AMD 显卡问题困扰我不止一次了,早在 2015 年 10月份的时候,我就感受到了一波(原文),机器莫名其妙的就重启,之后无法进入系统,当初也是折腾了好久,好在我赶上了最后一波的 Apple 免费维护,给我更换了主板。然而好景并不长久,过了两年故伎重演,这次早就过了苹果的维护周期。

双苹果 白屏 蓝屏

问题已经无法靠官方来解决了,好在这台机器在我这里服役已经超过6年,也算是命途多舛,经历了升级内存,硬盘报废,升级 SSD,显卡损坏,还2次,对我来说也是没什么遗憾了。而且有了上几次的经验,其实我已经改变了对于电脑这东西的看法:

电脑只是计算中心,珍贵的是数据!

没有什么地方的数据是绝对安全的,没有什么硬盘是不会坏的,没有电脑不会死机,所以数据只有同时在两个以上的地方存在才算是安全的!

这次我的电脑有完整的备份在 TimeMachine 里,所有的代码都在云端的 GitHub 或者 bitbucket 里安安稳稳的躺着,所以我也没有了之前电脑坏掉的那种焦虑感。
虽然我不喜欢新版 MacBook Pro 2017 的去掉的 MagSafe 和没有键程的手感,但是也到时候更新了!所以这次,我可以放心的”玩”一下这台服役良久的机器了。

运行 Apple 的硬件检测程序并不能检测到任何问题

我查遍了网络,基本找到了2种截然不同的解决方式,一种是软件方式,一种是硬件方式,软件方式相比之下成本比较低,但是也不算特别省事儿,但是对动手能力要求稍微低点;硬件方式解决需要额外的工具,而且要求胆大心细,毕竟要打开机身,焊接,有一些电学的基本知识,而且有直接毁掉主板的概率,所以难度颇大,但是优点是:幸运的话你可以100%恢复你的 MacBook Pro。不过限于篇幅,这里这篇文章就只聊聊软件的方式。

运行 Apple 打开后盖已经是家常便饭

另外一点就是要提醒的是,不管哪种方式,都有破坏计算机系统,或者毁掉电脑的风险,如果不是万不得已或者对自己的能力有充分的信任,请不要轻易尝试,还是交给专业人员来维修更为靠谱!

软件解决方式

原理上来说软件解决主要的思路就是就是要禁用独立显卡,让系统启动的时候直接调用集成显卡,并且在 MacBook 运作的时候不去自主的切换独立显卡。
禁用过程分2个阶段,一个是在 EFI 启动(类似于 Windows 的 BIOS)的时候告诉系统直接使用集成显卡,另外一个阶段是把 macOS 系统里的 AMD 驱动程序全部删除掉,macOS 就不会去启用独立显卡。这样不管是启动 macOS 还是 运行 macOS 程序的时候,都不会切换到独立显卡。

EFI 禁用(修改 nvarm 参数)

下载 ArchLinux ISO

你需要有一台可用的计算机来制作 ArchLinux 的 USB 启动盘,ArchLinux 的下载地址。制作 USB 启动盘或者 CD 启动盘都是可以的,我这里用 USB 启动的方式,毕竟手头 U盘比客户光驱还是来的方便。

制作 USB 启动盘

英文好的可以移步这里
在 macOS 系统下首先你要确定你 USB 驱动器的盘符,打开应用程序里的”终端” /Applications/Utilities/Terminal 用如下的命令列出所有的设备:

diskutil list

你的 USB 设备会以 /dev/disk2 这样的形式列出来. 根据你的 U盘的名称和容量确定你的盘符名称,他的命名方式应该大致是 /dev/diskX.

USB 设备在 macOS 系统里一般会自动装载,在执行 dd 块写拷贝命令之前你必须在终端里卸载(卸载不等于推出)它。

diskutil unmountDisk /dev/diskX

现在拷贝镜像文件到 U盘,注意 dd 命令里有个 rdisk 意思是原始文件模式,为的是传输文件更快。

sudo dd if=path/to/arch.iso of=/dev/rdiskX bs=1m

传输完成之后 macOS 系统会提示 The disk you inserted was not readable by this computer. 选择 忽略 就好,现在这个 U盘已经是可以引导的了。

启动到 Linux 来修改 EFI 参数

把 U盘插入到 MacBook Pro,按住 按键启动电脑, 选择 “EFI boot” 启动方式, 在选中Arch Linux archiso x86_64 UEFI CD菜单的情况下,按下按键 “e” 来编辑启动参数,在启动命令的最后加入空格 nomodeset,然后按回车,如果没什么问题,Linux 就会开始启动了,需要一点时间,请耐心等待。

启动完成后输入如下命令:

cd /sys/firmware/efi/efivars

列出目录下所有文件

ls

你将会看到有 “gpu-power-prefs-…” 为前缀的文件名列出 (… 的地方是 UUID 的值).

test

顺利的话如果你发现列表里有类似 gpu-power-prefs-... 的值,用 rm 命令删除

rm gpu-power-prefs-…

也会发生权限不够的情况,如果 efivarfs 被装载成可读、可写权限,一般文件就可以正常被删除。如果运行删除命令报错提示:

operation not permitted

说明在当前状态下 efivarfs 被装载成可读权限,你需要重新装载为可读、可写权限才能删除它,运行下面的命令重新装载:

cd /
umount /sys/firmware/efi/efivars/
mount -t efivarfs rw /sys/firmware/efi/efivars/
cd /sys/firmware/efi/efivars/
rm gpu-power-prefs-…

如果这时候还是报错,你需要用 chattr 命令来消除文件的持久性,然后再删除它。

chattr -i "/sys/firmware/efi/efivars/gpu-power-prefs-…”
cd /sys/firmware/efi/efivars/
rm gpu-power-prefs-…

我的情况就是一直到最后一步,才删除了 gpu-power-prefs-… 这个顽固的文件。

如果找不到 “gpu-power-prefs-… ” 文件,不存在就没必要删掉它了,反正它也不存在,在有些年份的机器里就找不到这个文件。创建一个新的 “gpu-power-prefs-…”文件

printf "\x07\x00\x00\x00\x01\x00\x00\x00" > /sys/firmware/efi/efivars/gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9

锁定 “gpu-power-prefs-… ”文件,让它只能被超级用户修改,这样启动的时候你的设置就不会被 EFI 程序所修改。

chattr +i "/sys/firmware/efi/efivars/gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9"

推出 efivars 并重启,你必须切换到根目录才可以卸载 efivars

cd /
umount /sys/firmware/efi/efivars/

重启前,确认你的 EFI 变量已经修改成功并且写入了系统,你可以用之前的命令查看变量的设置情况,确认后,重启。

reboot

系统层面禁用(删除 AMD 驱动程序)

禁用 SIP (System Integrity Protection)

进入命令行恢复模式,启动时同时按住 +R+S

禁用 SIP,SIP 模式会锁定系统文件夹,开启状态无法移动系统目录的文件;SIP 模式的开启和关闭只能在恢复模式状态下运行,我曾经尝试过在 Single 模式里是无法执行这个命令的。

csrutil disable

重启

reboot

移动 AMD 显卡驱动文件

进入 Single 用户模式: 启动时候按住 +S

进行磁盘检测

fsck -fy 

装载 root 文件系统并获得 读写权限

mount -uw / 

创建一个目录用来移动和备份 AMD 驱动文件(一会儿要用到)

sudo mkdir /AMD_Kexts/ 

移动所有 AMD 驱动文件到刚才创建的目录里

sudo mv /System/Library/Extensions/AMD*.* /AMD_Kexts/ 

删除所有的驱动缓存

sudo rm -rf /System/Library/Caches/com.apple.kext.caches/ 

有时候 macOS 系统并不会重新生成缓存目录,所以这里我们手动创建缓存目录。

sudo mkdir /System/Library/Caches/com.apple.kext.caches/ 

更新驱动缓存文件的时间戳,这样系统会重新生成驱动缓存(没有 AMD 驱动缓存了)

sudo touch /System/Library/Extensions/ 

卸载分区,来确保你的修改都已经生效了。

sudo umount /

重新启动

sudo reboot

重新启用 SIP

如果启动正常,我们要尝试关闭 SIP 以保证系统文件的安全性,再次开启恢复模式,启动的时候按住 +R+S
在命令行里输入如下命令,重新开启 SIP 模式

csrutil enable

重启系统

reboot

修改 NARAM 参数

再次进入系统之后会发现刷新率特别低,任何一部操作造成的显示变化都会让机器运作好久,这时候先别管其他,先打开终端。路径是 Finder -> Applications -> Utilities -> Terminal,然后输入:

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

重新启动

sudo shutdown -r now

再次重启后你应该就可以看到熟悉的 macOS 的登录界面了,到这里软件修复的工作也基本完成了。你可以继续使用这台电脑再战些时日了。

软件修复之后的其他问题

无法调节背光亮度

合上笔记本无法关闭显示器背光,同时也无法调节亮度,笔记本的显示器会始终以最亮的状态(或者上一次正常显示的亮度)显示,这样对眼睛和对显示屏灯管本身也有伤害,推荐 Mac AppStore 里有个叫 Brightness Slider 下载地址

设置面板里没有调节亮度的功能 调节亮度的软件

无法使用外接显示器

网传这里有个例外,就是如果你在接了外界显示器的同时,开机屏幕亮起后迅速合上笔记本屏幕,就可以单独使用外接显示器(但是我没有成功过)。

重启后集成显卡驱动失效

有时候用外置移动硬盘启动系统后可能会造成驱动再次失效的问题需要重新在终端里输入:

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

重新启动

sudo shutdown -r now

参考