Linux on mid-2017 MacBookPro

Linux on mid-2017 MacBookPro

Please refer to the latest version

Link to the latest version https://nixaid.com/linux-on-macbookpro/ for Ubuntu 20.04.


Last updated on 03 October 2021.

Intro

This article describes how to install Ubuntu Linux on your MacBookPro.

Hardware

Apple MacBook Pro "Core i7 2.9 15" Touch/Mid-2017 with AMD Radeon Pro 560

Target OS/Distro

Linux <=4.15, >=4.20 or >=5.0 on Ubuntu 18.04/19.04

Not working but can be worked around

- Audio input & output

I am using a USB Wi-Fi adapter TP-LINK TL-WN722N for $15 and for audio any bluetooth headphones/speakers is working fine.

Update: It appears that setting ccode and regrev to 0 in the firmware partially fixes the WiFi, see https://bugzilla.kernel.org/show_bug.cgi?id=193121#c25 (See Update 6 below!)

Update 2: As many have been asking, here is a ready ISO with Ubuntu 18.04 for MacBook (Linux 5.0.0-15), touchbar and keyboard are working.

(See Update 7 below - I've added new links there.)

Update 3 If you are experiencing a "black screen on boot" issue with the Linux kernels v4.18, v4.19 then try booting with amdgpu.dc=0 kernel argument.

Update 4 The "black screen" issue was related to this commit https://github.com/torvalds/linux/commit/e03fd3f300f6184c1264186a4c815e93bf658abb
Having it reverted has solved the issue. https://github.com/Dunedan/mbp-2016-linux/issues/73#issuecomment-422397681

Update 5 I've updated the ISO with the latest Ubuntu version, SW, drivers.
Article has been updated to target Ubuntu 18.04.2 with the Linux kernel 5.0.0-15.

Update 6 Finally, there is a way of having your MBP's Broadcom wifi adapter working! All that needs to be done is placing the right brcmfmac43602-pcie.txt file into a /lib/firmware/brcm/ directory. Then, reloading the brcmfmac driver. You can find the brcmfmac43602-pcie.txt file here https://bugzilla.kernel.org/show_bug.cgi?id=193121#c52 Make sure you set the macaddr in the brcmfmac43602-pcie.txt file to the same value that brcmfmac43602-pcie.bin has inside or you can see it using this command ip address show dev wlp3s0

Update 7 (30 Dec 2019) I've updated the ISO with the latest Ubuntu version, SW, drivers.
Article has been updated to target Ubuntu 18.04.3 with the Linux kernel 5.3.0-24 (the kernel is coming from the future Ubuntu Focal 20.04 LTS distro).

I added MacBookPro15,4 line to the /etc/udev/hwdb.d/61-evdev-local.hwdb file of this image as an attempt to see whether the touchpad will start working in new MacBookPro 2019 https://github.com/cb22/macbook12-spi-driver/issues/77

The /lib/firmware/brcm/brcmfmac43602-pcie.txt file from https://bugzilla.kernel.org/show_bug.cgi?id=193121#c52 was added to the image so that WiFi will be working out of a box.

Download 2.8G: removed, find the latest version here https://nixaid.com/linux-on-macbookpro/
SHA256:
a77086a4aadbfd5b29e86232a9e24aba
0f3a963af064e3c961adae8e9f8d2682


Preparing the disk

Partition for your Linux installation

You would need 10 GB minimum or 25 GB recommended space for the Ubuntu 18.04 installation.

All you need to do is to reduce your Macintosh HD partition from macOS by using Disk Utility. The freed space will be used by the Ubuntu Linux installer.

Remastering Ubuntu distro

I used another laptop running Ubuntu to apply the steps described in this section.

There are two drivers which you need to add to your Linux in order to avoid the unnecessary hassle with connecting external USB keyboard/mouse/stick as most of the howto's suggest.

By creating your own remastered Ubuntu Linux distribution, you will have a handy recovery tool you can use at any time.

Get Ubuntu

You can download it from its official website https://www.ubuntu.com/download/desktop

Extract the image

You need to extract the Ubuntu image before you can start remastering it.

cd ~/Downloads
sudo mkdir /mnt/iso
sudo mount ubuntu-18.04.3-desktop-amd64.iso /mnt/iso
mkdir customiso
rsync -a --exclude=casper/filesystem.squashfs /mnt/iso/ customiso/
sudo unsquashfs /mnt/iso/casper/filesystem.squashfs
sudo umount /mnt/iso

Chroot to the image

Once the image is extracted, you will need to continue remastering it from inside. To do so, you will need to use chroot.

sudo mount --bind /dev squashfs-root/dev/
sudo chroot squashfs-root/
PS1="(chroot) $PS1"
LC_ALL=C
HOME=/root
export PS1 HOME LC_ALL

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts

Update the image

It is a good idea to keep the software updated.

mv /etc/resolv.conf /etc/resolv.conf.bak
echo 'nameserver 8.8.8.8' | tee /etc/resolv.conf

apt-get update
apt-get upgrade
apt-get dist-upgrade
apt-get autoremove

apt-get -f install

HWE

Since MacBookPro mid-2017 is a pretty new hardware, it makes sense to ensure you are running it on the newest Linux kernel (except for v4.18,v4.19 due to a "black screen" bug) and the display server (Xorg).

In Ubuntu you can use the LTS Enablement Stack which is achieved simply by running the following command:

I've excluded the linux-generic-hwe-18.04 since it brings v4.18 kernel with the "black screen" bug.

apt-get install --install-recommends xserver-xorg-hwe-18.04 xwayland-hwe-18.04

Use Linux kernel 5.3 from Ubuntu Focal release

Since there is a black screen issue
with the Linux kernels between v4.18-rc1 and v4.20-rc4.
We will install newer Linux v5.3 from Ubuntu Focal 20.04 LTS.

For this, we will use APT Pinning.

cat > /etc/apt/apt.conf.d/01lock-release << EOF
APT::Default-Release "bionic";
EOF

cat > /etc/apt/sources.list.d/focal.list << EOF
deb http://archive.ubuntu.com/ubuntu/ focal main restricted
deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted
deb http://security.ubuntu.com/ubuntu/ focal-security main restricted
EOF

cat > /etc/apt/preferences.d/01-focal-whitelist << EOF
# By default let's block everything from Focal.
Package: *
Pin: release a=focal
Pin-Priority: -1

# Whitelist those packages which you want to take from Focal.
# Test: apt-cache policy | grep -E 'linux-(image|headers|cloud-tools|tools)-generic'

Package: linux-image-generic linux-headers-generic linux-cloud-tools-generic linux-tools-generic linux-image-unsigned* linux-buildinfo* linux-modules* linux-libc-dev*
Pin: release a=focal*
Pin-Priority: 990
EOF

Install Linux 5.3 from Focal release

apt-get update
apt-get install linux-image-generic linux-headers-generic linux-libc-dev

Cleanup old kernels

apt-get remove linux-*-5.0.0-*
apt-get autoremove

DKMS: Keyboard, touchpad and touchbar

To avoid hassle with plugging the external keyboard/mouse, you can already build in the keyboard, touchpad and touchbar drivers.

Note though, that Linux kernels higher than 4.15 have their touchbar driver refactored,
you can find upgrading notes here

For the Linux kernels before 4.16, please use this legacy driver branch

Before kernel 4.16

Do not follow this if you are using Linux kernel higher than 4.16.

apt-get install git dkms

cd ~
echo -e "\n# macbook12-spi-drivers\napplespi\nappletb\nspi_pxa2xx_platform\nintel_lpss_pci" >> /etc/initramfs-tools/modules

git clone https://github.com/roadrunner2/macbook12-spi-driver.git
cd ./macbook12-spi-driver
git checkout touchbar-driver-monolithic
dkms add .
dkms install -m applespi -v 0.1 -k 4.13.0-36-generic

# lsinitramfs /boot/initrd.img-4.13.0-36-generic | grep -iE "appletb|applespi"
lib/modules/4.13.0-36-generic/updates/dkms/appletb.ko
lib/modules/4.13.0-36-generic/updates/dkms/applespi.ko

If you want the F-keys to be always on by default and the Fn button for switching from F-keys to special keys, then use the following command:

echo 'options appletb fnmode=2' | sudo tee /etc/modprobe.d/appletb.conf
update-initramfs -u -k 4.13.0-36-generic

After Linux kernel 4.15

Do not follow this if you are using Linux kernel lower than 4.16.

apt-get install git dkms

cd ~
echo -e "\n# macbook12-spi-drivers\napplespi\napple_ib_tb\nspi_pxa2xx_platform\nintel_lpss_pci" >> /etc/initramfs-tools/modules

git clone https://github.com/roadrunner2/macbook12-spi-driver.git
cd ./macbook12-spi-driver
git checkout touchbar-driver-hid-driver
dkms add .
dkms install -m applespi -v 0.1 -k 5.3.0-24-generic

# lsinitramfs /boot/initrd.img-5.3.0-24-generic | grep -i "dkms/apple"
lib/modules/5.3.0-24-generic/updates/dkms/apple-ibridge.ko
lib/modules/5.3.0-24-generic/updates/dkms/apple-ib-tb.ko
lib/modules/5.3.0-24-generic/updates/dkms/applespi.ko

If you want the F-keys to be always on by default and the Fn button for switching from F-keys to special keys, then use the following command:

echo 'options apple_ib_tb fnmode=2' | sudo tee /etc/modprobe.d/apple_ib_tb.conf
update-initramfs -u -k 5.3.0-24-generic

Common

This section is common to wheher you are using legacy monolithic driver or not.

You can also swap fn and a control keys:

echo 'options applespi fnremap=1' | tee /etc/modprobe.d/applespi.conf
update-initramfs -u -k 5.3.0-24-generic

Or remap it to any other key:

# modinfo applespi | grep -w fnremap
parm:           fnremap:Remap fn key ([0] = no-remap; 1 = left-ctrl, 2 = left-shift, 3 = left-alt, 4 = left-meta, 6 = right-shift, 7 = right-alt, 8 = right-meta) (uint)

Touchpad configuration

Next, you need to set the proper dpi for the touchpad:

cat > /etc/udev/hwdb.d/61-evdev-local.hwdb << 'EOF'
# MacBook8,1 (2015), MacBook9,1 (2016), MacBook10,1 (2017)
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBook8,1:*
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBook9,1:*
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBook10,1:*
 EVDEV_ABS_00=::95
 EVDEV_ABS_01=::90
 EVDEV_ABS_35=::95
 EVDEV_ABS_36=::90

# MacBookPro13,* (Late 2016), MacBookPro14,* (Mid 2017)
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBookPro13,1:*
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBookPro13,2:*
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBookPro14,1:*
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBookPro14,2:*
 EVDEV_ABS_00=::96
 EVDEV_ABS_01=::94
 EVDEV_ABS_35=::96
 EVDEV_ABS_36=::94

evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBookPro13,3:*
evdev:name:Apple SPI Touchpad:dmi:*:svnAppleInc.:pnMacBookPro14,3:*
 EVDEV_ABS_00=::96
 EVDEV_ABS_01=::95
 EVDEV_ABS_35=::96
 EVDEV_ABS_36=::95
EOF
cat > /etc/udev/hwdb.d/61-libinput-local.hwdb << 'EOF'
libinput:name:*Apple SPI Touchpad*:dmi:*
 LIBINPUT_MODEL_APPLE_TOUCHPAD=1
 LIBINPUT_ATTR_KEYBOARD_INTEGRATION=internal
 LIBINPUT_ATTR_TOUCH_SIZE_RANGE=200:150
 LIBINPUT_ATTR_PALM_SIZE_THRESHOLD=1200
EOF

DKMS: USB WiFi TP-LINK TL-WN722N

FROM UPDATE 6: You can skip this section! There is a way to get your MBP's wifi adapter working (see Update 6 in the beginning of this article)

TP-Link TL-WN722N v2 support has been added to the Linux kernel starting v4.13-rc2 https://github.com/torvalds/linux/commit/5a1d4c5dd4eb2f1f8a9b30e61762f3b3b564df70
So you can skip this section entirely if you happened to be using a recent kernel.

In order to enable the external TP-LINK TL-WN722N USB WiFi adapter, you need to make sure the Ubuntu image has the necessary driver.

apt-get install git dkms

cd ~
echo -e "\n# TP-LINK TL-WN722N\n8188eu" >> /etc/initramfs-tools/modules

git clone https://github.com/lwfinger/rtl8188eu.git
dkms add ./rtl8188eu
dkms install 8188eu/1.0 -k 5.0.0-15-generic
update-initramfs -u -k 5.0.0-15-generic

# lsinitramfs /boot/initrd.img-5.0.0-15-generic | grep -i 8188eu
lib/modules/5.0.0-15-generic/updates/dkms/8188eu.ko

Exit chroot environment

Exit the chroot environment when you are done modifying the Ubuntu image.

mv /etc/resolv.conf.bak /etc/resolv.conf
umount /dev/pts
umount /sys
umount /proc
exit
sudo umount squashfs-root/dev/

Update the kernel

To ensure the remastered Ubuntu boots the latest Linux kernel which you have installed in the chrooted system.

sudo cp squashfs-root/boot/vmlinuz-5.3.0-24-generic customiso/casper/vmlinuz
sudo cp squashfs-root/boot/initrd.img-5.3.0-24-generic customiso/casper/initrd

Build remastered Ubuntu image

The following steps are to build the remastered Ubuntu image.
When running xorriso, keep in mind the order of arguments is important.

sudo rm customiso/casper/filesystem.squashfs
sudo mksquashfs squashfs-root customiso/casper/filesystem.squashfs

cd customiso
sudo rm md5sum.txt
sudo find -type f -print0 | xargs -0 sudo md5sum | grep -Ev "./md5sum.txt|./isolinux/" | sudo tee md5sum.txt
cd ..

sudo apt -y install xorriso isolinux

rm ubuntu4mac.iso
sudo xorriso -as mkisofs \
  -r -V "UBUNTU4MAC" -R -l -o ubuntu4mac.iso \
  -c isolinux/boot.cat -b isolinux/isolinux.bin \
  -no-emul-boot -boot-load-size 4 -boot-info-table \
  -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
  -eltorito-alt-boot \
  -e boot/grub/efi.img \
  -no-emul-boot -isohybrid-gpt-basdat customiso/

sudo chown $(id -u):$(id -g) ubuntu4mac.iso

Test the new image

Make sure your remastered image boots, before writing the it to your USB stick.

Out of the following methods, you would likely only need UEFI -> USB.

Install the UEFI firmware and qemu for running virtual machines:

sudo apt-get -y install ovmf qemu-system-x86

Legacy (BIOS)

CDROM: qemu-system-x86_64 -enable-kvm -m 1G -k en-us -cdrom ubuntu4mac.iso
USB: qemu-system-x86_64 -enable-kvm -m 1G -k en-us -device nec-usb-xhci,id=xhci -drive if=none,id=stick,file=ubuntu4mac.iso,format=raw -device usb-storage,bus=xhci.0,drive=stick

UEFI

CDROM: qemu-system-x86_64 -enable-kvm -m 1G -k en-us -bios /usr/share/ovmf/OVMF.fd -cdrom ubuntu4mac.iso
USB: qemu-system-x86_64 -enable-kvm -m 1G -k en-us -bios /usr/share/ovmf/OVMF.fd -device nec-usb-xhci,id=xhci -drive if=none,id=stick,file=ubuntu4mac.iso,format=raw -device usb-storage,bus=xhci.0,drive=stick


Installing the Linux

Boot your MacBookPro from your newly remastered Ubuntu - ubuntu4mac.iso
and create the following partitions:

/dev/nvme0n1p4 EFI 1024 MB
/dev/nvme0n1p5 /boot ext4 1024 MB
/dev/nvme0n1p6 physical volume for encryption (all free space)
on top of /dev/mapper/nvme0n1p6_crypt set ext4 and / as a mountpoint

Make sure you have set /dev/nvme0n1p5 as a "Device for boot loader installation".

Include your DKMS modules

Repeat the steps from the DKMS: Keyboard, touchpad and touchbar and DKMS: USB WiFi TP-LINK TL-WN722N sections, but only in the /target mountpoint, so you will have to be chrooted. To chroot into the /target, see the commands below under Chrooting to your system section.

Get the Ubuntu EFI files back to their place

When the Ubuntu Linux installation finishes, do not restart your MacBookPro yet.

The Ubuntu installer mounted /dev/nvme0n1p1 instead of /dev/nvme0n1p4 as an EFI partition and put Ubuntu EFI files in there.
To fix this, apply the following steps.

Move Ubuntu EFI files to a correct partition

mount /dev/mapper/nvme0n1p6_crypt /target
mount /dev/nvme0n1p5 /target/boot/
mount /dev/nvme0n1p4 /target/boot/efi/

mkdir /mnt/p1
mount /dev/nvme0n1p1 /mnt/p1
mkdir /target/boot/efi/EFI
rsync -avHx --progress /mnt/p1/EFI/ubuntu /target/boot/efi/EFI/
rm -rf /mnt/p1/EFI/ubuntu
umount /mnt/p1

Tell the future system to use a proper EFI partition

Get UUID of your EFI partition by running blkid /dev/nvme0n1p4 and set it in the /target/etc/fstab file for the /boot/efi mountpoint.

Set proper EFI boot record

Without this record your MacBookPro will not boot into the installed Ubuntu Linux.

efibootmgr -v
efibootmgr -v -c -d /dev/nvme0n1 -p 4 -L ubuntu -l '\EFI\ubuntu\shimx64.efi'

Boot your Linux

Now you can reboot your system without the remastered Ubuntu image.
In order to boot back into macOS, just hold "option" button while your laptop is booting and select "Macintosh HD".


Recovery

Having the remastered Ubuntu Linux USB stick handy, you can boot off it, mount your partitions where Ubuntu is installed, chroot into it and fix the issues.

Mounting your system

cryptsetup luksOpen /dev/nvme0n1p6 nvme0n1p6_crypt
mkdir /target
mount /dev/mapper/nvme0n1p6_crypt /target
mount --bind /dev /target/dev/
mount /dev/nvme0n1p5 /target/boot/
mount /dev/nvme0n1p4 /target/boot/efi/

Chrooting to your system

chroot /target
PS1="(chroot) $PS1"
LC_ALL=C
HOME=/root
export PS1 HOME LC_ALL

mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devpts none /dev/pts
mount -t efivarfs efivarfs /sys/firmware/efi/efivars

Now you can fix things like EFI boot records, changing Linux kernel, updating drivers and so on.

Exitting chroot

umount /sys/firmware/efi/efivars
umount /dev/pts
umount /sys
umount /proc
exit

Unmounting your system

umount /target/dev
umount /target/boot/efi
umount /target/boot/
umount /target/
sync
cryptsetup luksClose nvme0n1p6_crypt

Extra hints

Swap command and option keys

Once you have logged-in under your user in the Gnome/Unity session, run the following command to permanently swap command and option keys:

$ gsettings set org.gnome.desktop.input-sources xkb-options "['altwin:swap_alt_win']"

Windows in QEMU/KVM

You can download Windows 10 for free and install/use it in QEMU/KVM.
https://www.microsoft.com/software-download/windows10

Steam in Docker

As a great surprise for some, you can play games in Linux on your MacBookPro using AMD Radeon Pro 560.
For that you can either install Steam on your own or use my Steam image which is much simpler https://hub.docker.com/r/andrey01/steam/

Grub to show options

This is important as one day you may get a Linux kernel that won't boot due to some problem. To prevent this, make sure you are able to choose the kernel when your MBP starts.
To do this, remove the GRUB_HIDDEN_TIMEOUT* lines from the /etc/default/grub file and make sure GRUB_TIMEOUT is set to some reasonable value, e.g. 5 (without quotes).
Then regenerate grub config by running sudo grub-mkconfig -o /boot/grub/grub.cfg command.
This will allow you to see the grub loader options on boot and let you pick a different kernel in case if the last one was having troubles to boot/or any other troubles.

Grub to show macOS High Sierra option

Add the following code to /etc/grub.d/40_custom file:

menuentry "macOS High Sierra (hfsplus)" {
  insmod hfsplus
  search --set=root --file /System/Library/CoreServices/boot.efi
  chainloader /System/Library/CoreServices/boot.efi
}

Then regenerate grub config by running sudo grub-mkconfig -o /boot/grub/grub.cfg command.

After that you do not need to hold the "option" button to load macOS when restarting your MBP.

When upgrading a Linux kernel

Make sure your kernel drivers have been compiled each time you are getting a Linux kernel upgrade. For that, run dkms status command and see whether the module has installed status there.

Troubleshooting

macOS got update and GRUB is not booting anymore

One day you may find yourself in a situation when only macOS is booting, while GRUB boot loader is being completely skipped.

Do not worry, you can set your Linux boot option back from macOS itself.

You can do this by using the bootoption tool

  1. Install Xcode from the App Store.
  2. Install bootoption:
brew upgrade
brew tap vulgo/repo
brew install bootoption
  1. List your UEFI boot preferences:
$ bootoption list
BootCurrent: Boot0080
BootNext: Not set
Timeout: Not set
--: Boot0081 Mac OS X
--: Boot0082
1: Boot0080 Mac OS X
2: Boot0000 ubuntu

You can also see more info for each option:

$ bootoption info Boot0000
Name: Boot0000
Description: ubuntu
Device path: \MEDIA_HARDDRIVE_DP\MEDIA_FILEPATH_DP
Partition UUID: REDACTED
Loader path: \EFI\ubuntu\shimx64.efi

$ bootoption info Boot0080
Name: Boot0080
Description: Mac OS X
Device path: \ACPI_DP\HW_PCI_DP\HW_PCI_DP\MSG_SASEX_DP\MEDIA_HARDDRIVE_DP
Partition UUID: REDACTED
  1. Set ubuntu to be 1st in your boot order:
$ sudo bootoption order 2 to 1
Error: Service unavailable (69)

If you get this error, do not worry, this is due to the SIP (System Integrity Protection). All you need is just to disable it (you can enable it later):

1. Restart the computer, while booting hold down Command-R to boot into recovery mode.
2. Once booted, navigate to the "Utilities > Terminal" in the top menu bar.
3. Enter csrutil disable in the terminal window and hit the return key.
4. Restart the machine and System Integrity Protection will now be disabled.

After that the commands will work as expected:

$ sudo bootoption order 2 to 1
$ bootoption list
BootCurrent: Boot0080
BootNext: Not set
Timeout: Not set
--: Boot0081 Mac OS X
--: Boot0082
1: Boot0000 ubuntu
2: Boot0080 Mac OS X

You can also use sudo bootoption set --bootnext 0000 command for one-time boot.


References

- Linux On MBP Late 2016
- MBP 2016 Linux

If you found this useful, please consider making a donation!

Donations

  • BTC: bc1qvelutkakstymn244km9kgdd80kdyqnx3wahjcv

Alternative ways to make a donation are in the About section https://nixaid.com/about/