Antergos/Arch Linux on MacBook Pro 11,4
By on December 9, 2017
I’ve been wanting to run a Linux distro on my MacBook Pro for about 6 years now. About a year ago I decided to give it another go and had a lot of success. After doing some research on the topic I came to the conclusion that Arch Linux is the most promising distro, at least in terms documentation for MacBook Pros. To make the installation easier I decided to go with Antergos for the installation process. This post will cover replacing macOS on your MacBook Pro 11,4. After following this post you will only have Antergos installed on your system.
Pre-installation
The first thing you should do is make a bootable clone of your internal SSD to an external hard drive. For this you can boot into recovery mode (hold Command+R on startup) and use Disk Utility’s “Restore” feature. Make sure you have the correct source and destination selected, that is, ensure you don’t erase your internal drive before making a backup. Making the backup may take a while– for me it took approximately two hours for 190GB to an old hard drive over Firewire 800. I would recommend verifying that you are able to boot from the external drive, just to be on the safe side. Another prerequisite is either having a thunderbolt to ethernet adapter or downloading and copying the wifi driver to a USB stick. I have not done the latter and cannot offer guidance on it.
With at least a bootable backup in place, let’s get to installing Arch Linux. First you should boot into macOS and turn the volume all the way down. This will disable the startup sound, which will no longer be possible once Antergos is installed. Now download an Antergos ISO and copy it to a USB drive. I would recommend getting the full live image, which still fits on a 2GB flash drive. You can find instructions on how to create a bootable USB flash drive from the Antergos website. Once the USB drive is ready, reboot from macOS (again, make sure your volume is off) and hold down the left alt/option key to see a list of EFI devices you can boot from. Select the USB drive and wait for the installer to load.
First post-installation steps
The main installation process for Antergos is as straightforward as it is
for Ubuntu and macOS. Once you have completed the installation you should visit
the Arch Linux wiki for MBP 11,4, which is what I used to
get things up and running initially. First install yaourt
by
running sudo pacman -S yaourt
. yaourt
allows you to install community
packages, which greatly increases the number of available packages but
comes with the risk of installing malicious packages (from my experience, this
risk is extremely low). The first thing I installed was the wifi driver.
However, I believe it has now been integrated into the kernel. In case I’m
incorrect you can install the driver by running yaourt -S broadcom-wl-dkms
and rebooting. Next I installed the webcam driver
by running yaourt -S bcwc-pcie-dkms
and again rebooted. Then I installed
the modified Linux kernel for MacBooks, which you can install
in one of two ways. Pre-built binaries are downloadable from pacman by
adding the following to /etc/pacman.conf
:
1
2
3
[linux-macbook]
SigLevel = Optional TrustAll
Server = http://libpcap.net/repo/linux-macbook
and running sudo pacman -Sy linux-macbook
. Alternatively, you can build
the kernel yourself (warning, this can take over an hour) by running
yaourt -S linux-macbook
.
Once the linux-macbook
kernel is compiled you need to modify GRUB (the
menu that lets you select the OS and kernel upon boot) to boot
using the patched kernel by default. I found that the easiest way to get
that to work was to append:
1
2
3
4
# To be able to boot the linux-macbook kernel by default we disable submenu
# We also changed GRUB_DEFAULT=2 because this is the entry corresponding
# to linux-macbook kernel (counting starts at 0).
GRUB_DISABLE_SUBMENU=y
to /etc/default/grub
. This removes the normal submenu hierarchy in GRUB.
I then set the default menu item by specifying GRUB_DEFAULT=2
in
/etc/default/grub
. The reason for the number 2
is that the linux-macbook
kernel was the third entry from the top when I booted into GRUB without the
submenu. Finally, while we are editing GRUB we should add acpi-osi=
to line 4,
which starts with GRUB_CMDLINE_LINUX_DEFAULT=
. Make sure to add acpi-osi=
inside the quotation marks. To update GRUB run
sudo grub-mkconfig -o /boot/grub/grub.cfg
.
Now reboot your machine and make sure you’ve booted with the linux-macbook
kernel by running uname -r
in a terminal. As of this writing I get the output
4.12.14-1-macbook
.
Note (07-22-2018): As of the Linux kernel version 4.17 adding acpi-osi=
to
the kernel parameters breaks the battery detection. See
here
for a discussion. You can simply omit this step now.
Staying asleep
The next thing to get working properly is sleep. In addition to requiring the patched Linux kernel, I also had to disable wakeup from USB 3.0, which would cause repeated waking of my MacBook after closing the lid. I will discuss a summarized version of this blog post.
First create a new systemd unit by creating the file
/etc/systemd/system/mbp_fix_sleep.service
and add the following to it:
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Fix sleep on MBP
[Service]
Type=oneshot
ExecStart=/bin/bash -c "echo XHC1 > /proc/acpi/wakeup"
RemainAfterExit=true
StandardOutput=journal
[Install]
WantedBy=multi-user.target
then run systemctl daemon-reload && systemctl enable mbp_fix_sleep
to
enable at boot and systemctl start mbp_fix_sleep
to have it take
effect immediately. You should now be able to close the lid and have your
MacBook remain asleep. If you have trouble, try rebooting, and making sure
that when you run less /proc/acpi/wakeup
that XHC1
is disabled. If you
continue to have trouble you can try disabling lid sleep/wake by replacing
the ExecStart
line above with
1
ExecStart=/bin/bash -c "echo XHC1 > /proc/acpi/wakeup && echo LID0 > /proc/acpi/wakeup"
Rerun the systemctl
commands above, and see if things now work. If sleep
still does not work unfortunately I cannot offer more advice since the
above worked for me.
HiDPI with second display
I like to use a dual-monitor setup on occasion, which is currently not supported by X11, so you need to change to running Wayland. A word of caution, Wayland is still under heavy development, but has proven to stable and very usable for me. I haven’t encountered any issues. As far as I’m aware even LibreOffice should now be working under Wayland. The biggest obstacle I’ve faced is that if you want to do custom key remapping you’ll need to use xkb directly instead of something else like xmodmap. However, I’ll have a list at the end of this section of issues and solutions I’ve encountered.
To get Wayland working you must switch from using lightdm to gdm. To install
gdm run sudo pacman -Sy gdm
. Next we need to disable lightdm and enable gdm.
To do this run sudo systemctl disable lightdm && sudo systemctl enable gdm
and reboot. To verify that you are running Wayland run
echo $XDG_SESSION_TYPE
. If Wayland is running you’ll see wayland
and if X11 is running you’ll see x11
.
Issues and Solutions
- GParted GUI not working: from here run
xhost +SI:localuser:root && sudo gpartedbin
- Screen sharing in Chrome does not work with non-Chrome windows. This is because of a security vulnerability that is used for screen sharing under X11 being absent in Wayland. PipeWire is designed to solve this problem but I have not yet tried it.
- The custom keyboard shortcut method is described below.
Disable red audio light
Disable the red light by running:
1
sudo echo 1 > /sys/module/snd_hda_intel/parameters/power_save
as root. To have this be run at startup automatically create the file
/etc/systemd/system/mbp_spdif.service
with the contents:
1
2
3
4
5
6
7
8
9
[Unit]
Description=Disable S/PDIF red light in audio jack
[Service]
Type=oneshot
ExecStart=/bin/bash -c "echo 1 > /sys/module/snd_hda_intel/parameters/power_save"
[Install]
WantedBy=multi-user.target
then run systemctl daemon-reload && systemctl enable mbp_spdif
to enable at
boot and systemctl start mbp_spdif
to have it take effect immediately.
This is necessary because the sound card is not in power save mode
by default (see here). Note that the light does come
back on when playing audio, even if it’s through the built-in speakers and not
the audio jack.
Bluetooth Headset
If you are having trouble with bluetooth headsets or headphones, give this page a read.
Parallel yaourt builds
You can speed up the build process of packages by building in parallel. To
enable building in parallel edit /etc/makepkg.conf
by searching for
MAKEFLAGS
and if the line is commented out then uncomment it. The make flag
-jNumberOfCores
is how you control on how many cores to build. I have
8 hyperthreads and find that -j6
allows me to continue working uninterrupted
while building packages.
Emacs shortcuts everywhere
To get Emacs shortcuts everywhere follow the instructions from the Arch Linux wiki here. First add the following:
1
2
[Settings]
gtk-key-theme-name = Emacs
to the file ~/.config/gtk-3.0/settings.ini
. Then run
1
gsettings set org.gnome.desktop.interface gtk-key-theme "Emacs"
Reduce title bar size
To reduce the size of the title bar edit ~/.config/gtk-3.0/gtk.css
adding
1
2
3
4
5
6
7
8
9
10
11
12
window.ssd headerbar.titlebar {
padding-top: 3px;
padding-bottom: 3px;
min-height: 0;
font-size: 0.7em;
}
window.ssd headerbar.titlebar button.titlebutton {
padding: 0px;
min-height: 0;
min-width: 0;
}
Custom keyboard shortcuts
Custom keyboard shortcuts can be added using AutoKey
. To install run
yaourt -S autokey-py3
. Once installed open up AutoKey, which will live in the
system tray. You can open the main window from the system tray icon. Let’s map
C-m
to enter
, like any sane person would want to. To do this open
My Phrases
and add a new phrase. In the white text box you should have only
<enter>
. Next, set the Hotkey:
below to <ctrl>+m
. You will also want to
add AutoKey
as a startup application by adding it to
Tweak Tool
->Startup Applications
. While AutoKey
isn’t supported on
Wayland, I have observed that C-m
works as return if I switch caps lock
to something other than “Disabled” and then back to “Disabled” in
Tweak Tool
->Keyboard & Mouse
->Additional Layout Options
.
Gnome extensions
I use the following Gnome extensions:
- AlternateTab
- Caffeine (had troubles under Wayland for a while, haven’t retried)
- Dask to Dock
- Removable Drive Menu
- Remove Drop Arrows
- TopIcons Plus
- User themes
Gnome appearance
I use the following appearance configuration:
- Global Dark Theme
- GTK+: Adwaita-dark
- Icons: Numix
- Shell theme: Lexis
Scientific Computing on Arch Linux
Since many scientific libraries either have some fortran code or call fortran
code that’s in a library we need to install gfortran
. This is done by running
sudo pacman -S gfortran
. If you also would like to use the clang compiler for
C and C++ you can install it and extras like Clang-Tidy and
ClangFormat by running sudo pacman -S clang
and
sudo pacman -S clang-tools-extra
. You can install libc++ from AUR using
yaourt -S libc++ && yaourt -S libc++abi
. You may have to add the missing
gpg key to your trusted list using gpg --recv-keys <the-key>
. You should then
be able to link libc++ instead of stdlibc++.
Now that we have the basics set up that we need for compiling code we can worry
about how to actually manage different installations of libraries for different
compilers. I personally really like what Spack has done, which allows
you to easily install use modules. In order to use modules we need to first
install lmod using yaourt -S lmod
. You’ll then need to add
1
2
# Load LMod for modules support
. /etc/profile.d/modules.sh
to your ~/.bashrc
file. You are now ready to follow the installation
instructions for Spack, which as of this writing required cloning
the GitHub repository. To “install” it for use everywhere add the following
to your ~/.bashrc
file
1
2
3
4
# Add Spack bin path
export PATH=$PATH:/path/to/spack/bin
# Source Spack env
. /path/to/spack/share/spack/setup-env.sh
replacing /path/to
with the path to where you cloned Spack.
You can now use Spack to manage (nearly) all of your scientific package needs.
For example, installing OpenBLAS and GSL was really simple. I suggest reading
the Spack documentation to learn more.
Installing packages
I found it very easy to install a variety of applications that I use. For
example, I use Slack for work and installing it was as easy as
running yaourt -S slack-desktop
(though I’ve switched to using
Franz). Another application I use frequently is
Spotify, which I was able to install using yaourt -S spotify
.
I’ve also had no trouble using Zsh and oh-my-zsh
instead of bash. You can
search the Arch Linux user repository (AUR) online to see if the
packages you need are available.
Summary
In this post I went over how to setup Arch Linux/Antergos on a MacBook Pro 11,4, though I expect models close to that will be similar. I’ve been using this setup for about one year now and am really happy with it. I have absolutely no desire to switch back to macOS. I find that for the type of work I do that the Linux environment is simply a much better fit. Thanks for reading and I hope you found the post useful!