MacBookPro10,x

来自 ArchWiki

本文或章节不符合笔记本电脑页面指南

原因: 小作品 (在Talk:MacBookPro10,x中讨论)

本文或章节已过时。

原因: 上次内容更新是在 2017-10-07。某些问题可能在那之后已修复。(在Talk:MacBookPro10,x中讨论)

本页面涵盖以下 Apple 型号

  • MacbookPro10,1 MacBook Pro 15" Retina 2012 和 2013 年初
  • MacBookPro10,2 MacBook Pro 13" Retina 2012 和 2013 年初

安装

准备硬盘

假设您想与 OS X 双启动,您必须使用“磁盘工具”缩小其分区。您可以直接在此处创建 Linux 分区,也可以在 Linux 安装过程中稍后创建(使用 partedmkfs)。

获取无线固件

为了使 Wi-Fi 芯片组工作,您需要获取其固件。您可以从另一个启用 b43 的 Arch 系统复制它,使用 b43-fwcutter 从 Broadcom 的驱动程序中提取它,或者通过 b43-firmwareAUR 软件包获取固件。最后,您应该有一个名为 b43 的文件夹,其中包含许多 .fw 文件。

启动 Live 镜像

按住 option 键,然后按电源按钮。几秒钟后,您应该会看到 Apple 的启动加载器显示启动内置 OS X 驱动器或您插入的 USB 驱动器的选项。

使用箭头键选择 Live USB,然后按 Enter 键启动到 Live Arch Linux 环境中。

连接 Wi-Fi

将包含无线网卡固件的整个文件夹复制到 /usr/lib/firmware/

安装

注意: 如果您不想为 GRUB 设置单独的分区,而是更喜欢使用 rEFInd,请参阅 Mac 页面。

运行安装向导。当要求您对硬盘进行分区时,创建一个小的 HFS 分区。这是您在安装后放置独立 GRUB 软件包的地方。其余安装过程与往常基本相同。选择引导加载程序时,选择 GRUB 并安装它。不要担心任何错误;我们稍后将自行创建可启动的 EFI 镜像。

安装完成后,直接将 Wi-Fi 固件复制到已安装系统的 /tmp/install/usr/lib/firmware/

或者,安装 broadcom-wl-dkms 以改善 Wi-Fi。

引导加载程序

直接 EFI 启动

截至 2013 年 8 月,rEFInd 可以自动检测 Arch 内核,从而无需将内核复制到 EFI 系统分区。只需 安装 refind 并在 refind.conf 中启用 scan_all_linux_kernelsalso_scan_dirs 选项(有关说明,请参阅 Arch 启动过程#引导加载程序)。

GRUB

另一种解决方案是安装 GRUB。编辑 /tmp/install/boot/grub/grub.cfg 并编辑启动项以加载 Linux mainline 而不是正常的内核。还要再次将 noapic 附加到内核行。

现在 cd 进入 /tmp/install/ 并通过调用创建 GRUB 镜像

grub-mkstandalone -o grub-standalone-x86_64.efi -d usr/lib/grub/x86_64-efi -O x86_64-efi -C xz boot/grub/grub.cfg

这将创建名为 grub-standalone-x86_64.efi 的文件,其中包含 GRUB 和配置文件。重要的是 cd 进入正确的目录,以便它拾取配置文件并将其放置在镜像中的正确位置。将此文件复制到您之前创建的 HFS 分区。此方法的缺点是,每当您想更改 GRUB 配置时,都需要重复此步骤。

重启机器并启动到 OS X。HFS 分区应已挂载,GRUB 独立镜像应在其中。按照此页面上的步骤创建 Apple 启动加载器拾取 GRUB 所需的文件:https://mjg59.dreamwidth.org/7468.html。创建文件后,在分区上的 GRUB 镜像上使用 bless。如果您想自动启动到 Arch,请附加 --setBoot

再次重启后,您应该能够通过在启动时按住 alt 按钮来选择您安装的 Arch Linux,如果您在 blessing 时没有使用 --setBoot

Wi-Fi

Macbook Pro 10,x 配备 Broadcom BCM4331 无线芯片组。

有两种主要选项可在 Arch Linux 中使此芯片组工作

b43-firmwareAUR 软件包包含用于该芯片组的开源、反向工程固件。

broadcom-wlbroadcom-wl-dkms 软件包附带用于该芯片组的专有、受限许可证驱动程序。

有关更多信息,请参阅 Broadcom 无线

显卡

注意: 为了插入外接显示器,您需要启用 NVIDIA 显卡,因为 HDMI 和 thunderbolt 输出硬连线为使用 NVIDIA 显卡。

通用注意事项

笔记本电脑配备 nVidia 和 Intel 芯片。由于此设备配备 Retina (HiDPI) 显示屏,因此对于某些桌面环境,在高分辨率下,内容可能会非常小:请参阅 HiDPI

Nouveau 背光

如果您正在使用开源 Nouveau 驱动程序并且活动的 GPU 是 Nvidia 显卡,则可以通过将值回显到文件来调整背光级别

# echo 500 > /sys/class/backlight/gmux_backlight/brightness

要将背光调到最大级别

# echo $(cat /sys/class/backlight/gmux_backlight/max_brightness) > /sys/class/backlight/gmux_backlight/brightness

NVIDIA 背光

如果您正在使用专有的 nvidia 驱动程序,请注意背光调整无法开箱即用。

要启用背光控制

# setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0

使用 gpu-switch 切换显卡

如果您正在使用开源的 xf86-video-nouveauxf86-video-intel 驱动程序,则可以使用 gpu-switchAUR 在 Arch Linux 内部 切换显示输出到独立或集成 intel GPU。

安装

您可以从 AUR 安装 gpu-switchAUR

然后,以 root 身份运行脚本即可。

用法

命令开关为 -i,用于切换到集成显卡,-d 用于切换到独立 GPU。为了使更改生效,您需要重启。

切换到 Intel 集成显卡并关闭 Nvidia 独立显卡

要切换到 intel 显卡并关闭独立 GPU

$ /path/to/gpu-switch -i

然后重启。

使用 vgaswitcheroo 关闭独立 GPU

# echo OFF > /sys/kernel/debug/vgaswitcheroo/switch

这将需要一两秒钟才能完成。

然后,检查独立 GPU 是否仍然开启

$ cat /sys/kernel/debug/vgaswitcheroo/switch
0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Off:0000:01:00.0
2:DIS-Audio: :Off:0000:01:00.1

如果您选择仅安装 Arch Linux 并且无法访问仅限 OS X 的工具 iGPU,这将非常有用。

在启动时保持独立显卡关闭

如果您想在启动时保持独立 GPU 关闭,请参阅 systemd-vgaswitcheroo-unitsAUR

b43-firmware 下的图形伪影

在使用集成显卡和 b43-firmware 软件包时,您可能会遇到中度到重度的图形伪影,这些伪影似乎与无线网络流量相关。(断开连接 -> 无伪影,已连接 -> 周期性伪影,大数据传输 -> 严重的伪影/无法使用)这可以通过删除/黑名单 b43-firmwareAUR 并使用 broadcom-wlbroadcom-wl-dkms 来解决。

启用 Vsync

要防止屏幕撕裂,请参阅 Intel 显卡#Tearing

问题

  • 在 15 英寸版本上使用 vgaswitcheroo 在 iGPU / dGPU 之间切换将导致黑屏。系统仍在运行,可以安全重启。
    • dGPU/nouveau 在启动时处于活动状态。截至 3.10.3-1,切换到 iGPU/intel 的唯一已知方法是通过 MacOS 上的 gfxCardStatus v2.2.1 强制执行此操作(更高版本的 gfxCardStatus *不* 工作。)此设置将在重启后保留。要恢复它,您必须重启进入 MacOS *两次* 和/或重置 SMC(关机并同时按下 shift+control+alt+power。再次按下电源以启动。)
    • 强制 iGPU/intel 的另一种方法是在 grub.cfg 中的一个 menuentry 中添加以下命令,
      outb 0x7c2 1
      outb 0x7d4 0x28
      outb 0x7c2 2
      outb 0x7d4 0x10
      outb 0x7c2 2
      outb 0x7d4 0x40
      
      # Power down dGPU (will not work)
      #outb 0x7c2 1
      #outb 0x7d4 0x50
      #outb 0x7c2 0
      #outb 0x7d4 0x50
      

      屏幕将保持空白,直到 intel 驱动程序完全加载。请注意,dGPU 不会断电(添加上面的代码将阻止系统启动)。解决方法是在系统完全启动后编译并运行以下程序(需要 sudo)。

      #include <stdio.h>
      #include <sys/io.h>
      
      #define GMUX_PORT_SWITCH_DISPLAY	0x10
      #define GMUX_PORT_SWITCH_DDC		0x28
      #define GMUX_PORT_SWITCH_EXTERNAL	0x40
      #define GMUX_PORT_DISCRETE_POWER	0x50
      #define GMUX_PORT_VALUE			0xc2
      #define GMUX_PORT_READ			0xd0
      #define GMUX_PORT_WRITE			0xd4
      
      #define GMUX_IOSTART		0x700
      
      typedef unsigned char u8;
      
      enum discrete_state {STATE_ON, STATE_OFF};
      enum gpu_id {IGD, DIS};
      
      static void index_write8(int port, u8 val)
      {
      	outb(val, GMUX_IOSTART + GMUX_PORT_VALUE);
      	outb((port & 0xff), GMUX_IOSTART + GMUX_PORT_WRITE);
      }
      
      static u8 index_read8(int port)
      {
      	u8 val;
      	outb((port & 0xff), GMUX_IOSTART + GMUX_PORT_READ);
      	val = inb(GMUX_IOSTART + GMUX_PORT_VALUE);
      
      	return val;
      }
      
      static void set_discrete_state(enum discrete_state state)
      {
      	if (state == STATE_ON) {	// switch on dGPU
      		index_write8(GMUX_PORT_DISCRETE_POWER, 1);
      		index_write8(GMUX_PORT_DISCRETE_POWER, 3);
      	} else {			// switch off dGPU
      		index_write8(GMUX_PORT_DISCRETE_POWER, 1);
      		index_write8(GMUX_PORT_DISCRETE_POWER, 0);
      	}
      }
      
      static u8 get_discrete_state()
      {
      	return index_read8(GMUX_PORT_DISCRETE_POWER);
      }
      
      static void switchto(enum gpu_id id)
      {
      	if (id == IGD) {	// switch to iGPU
      		index_write8(GMUX_PORT_SWITCH_DDC, 1);
      		index_write8(GMUX_PORT_SWITCH_DISPLAY, 2);
      		index_write8(GMUX_PORT_SWITCH_EXTERNAL, 2);
      	} else {		// switch to dGPU
      		index_write8(GMUX_PORT_SWITCH_DDC, 2);
      		index_write8(GMUX_PORT_SWITCH_DISPLAY, 3);
      		index_write8(GMUX_PORT_SWITCH_EXTERNAL, 3);
      	}
      }
      
      int main(int argc, char **argv)
      {
      	if (iopl(3) < 0) {
      		perror("No IO permissions");
      		return 1;
      	}
      
      	//switchto(IGD);
      	set_discrete_state(STATE_OFF);
      	//printf("Discrete state: 0x%X\n", get_discrete_state());
      
      	return 0;
      }

      有关更多信息,请阅读 linux 内核树内的 apple-gmux 驱动程序。

    • 如果 dGPU 通过 vgaswitcheroo 手动断电,则 "rmmod nouveau" 将崩溃。一旦发生这种情况,将无法干净地关机/重启。新的补丁(8 月 2 日)有望在未来解决此问题。(注意:要进入此故障状态,您必须使用 gfxCardStatus 强制 iGPU,然后显式使用 vgaswitcheroo。这相当不常见。)
    • dGPU / iGPU 问题不会影响仅具有 intel 适配器的 13 英寸 rmbp。简单得多!
  • Nvidia 驱动程序 319.32 无法开箱即用地挂起/恢复或控制背光。
    • Nouveau 和 intel 工作正常。
  • 如果您在使用 Nvidia 驱动程序时遇到问题,请尝试使用模拟 BIOS 启动而不是 EFI 启动。

音频

在 MacBookPro10,2 上,您可能需要使用 'snd_hda_intel' 驱动程序,并带有 'mbp101' 型号选项。此型号选项位于 modprobe 配置中;例如,将以下内容添加到 /etc/modprobe.d/alsa-base.conf (论坛帖子)

 options snd-hda-intel model=mbp101

请注意,此型号选项在在线提供的型号列表中未记录,但它工作得非常好。(在您执行此操作之前,声音通过 HDMI 似乎很好,但内置扬声器和内置麦克风可能无法正常工作。)

注意: 截至 2013 年 9 月 的报告表明,不再需要此型号选项,并且应该自动工作;但截至 2017 年 10 月,麦克风(但不是扬声器)似乎仍然需要它。

有关其他麦克风故障排除技巧,请参阅 高级 Linux 音频架构/故障排除#麦克风

触摸板

虽然 xf86-input-synaptics 可以工作,但触摸板的集成按钮可能会导致问题。使用 xf86-input-mtrack-gitAUR 驱动程序,并进行调整配置应该会获得更好的最终结果

以下配置使用单指触摸为左键,双指为中键,三指为右键

Section "InputClass"
    MatchIsTouchpad "on"
    Identifier      "Touchpads"
    Driver          "mtrack"
    Option          "Sensitivity" "0.65"
    Option          "IgnoreThumb" "true"
    Option          "IgnorePalm" "true"
    Option          "TapButton1" "1"  
    Option          "TapButton2" "3"
    Option          "TapButton3" "2"
    Option          "ClickFinger1" "1"
    Option          "ClickFinger2" "3"
    Option          "ClickFinger3" "2"
    Option          "BottomEdge" "25"
EndSection

要使用自然滚动,还要在此部分内添加以下内容

    Option          "ScrollDownButton"  "4"
    Option          "ScrollUpButton"    "5"
    Option          "ScrollLeftButton"  "7"
    Option          "ScrollRightButton" "6"

有关更多配置,请查看 xf86-input-mtrack-gitAUR 的文档。

要在打字时禁用触控板,请安装 dispad-gitAUR 实用程序。

存储卡 (SDHCI/SDX) 读卡器

内核 (4.7.x) 中当前存在一个错误,其中内部 SD 卡读卡器超时。

作为一种解决方法,您将需要重新加载 sdhci 内核模块,如:https://bugzilla.kernel.org/show_bug.cgi?id=73241#c55

# rmmod sdhci-pci sdhci
# modprobe sdhci debug_quirks2=4
# modprobe sdhci-pci

参见