Running NixOS on MacBook Pro 2014

27 May, 2025
1099 words | 5 min to read | 3 hr, 18 min to write

In 2015 I got myself a brand new MacBook Pro Mid 2014. The beefiest configuration I could find on the market. This thing was a BEAST! Fast-forward to 2025 and it’s collecting dust, any update or installing any software is a pain. 80% of the brew packages aren’t working because of the expiry date of the laptop is long past due. I could actually install a new MacOS on it using OpenCore Legacy Patcher, but I decided to think different, and went a different route. NixOS, baby!

TL;DR

  • Built a custom NixOS ISO with Broadcom Wi-Fi support
  • Flashed it, booted with EFI, used GNOME installer
  • Partitioned manually with parted
  • Installed NixOS with GNOME environment (Plasma is also a great option, but I personally allergic to KDE since 2012)

Why?

Because even if I’m able to install Sequoia on this machine, it’d still be incredibly slow. See, systems rarely get less complex, which applies to operating systems too. Each new release of MacOS will add more background services, and UI overhead. I would be able to use new software, but it will be practically unusable for what I’m planning to use it for anyway. With NixOS I can make it as slim as possible and make it run smooth.

Second why?

Docker.

How?

So I want fully functional machine with working:

  • Wi-Fi
  • Bluetooth
  • Trackpad
  • Audio

I don’t really care about the camera. I only realised this while writing these words, I need to check if it’s working. If it’s not, not a big deal.

Building the ISO

First, I’ve built the NixOS ISO with proprietary Broadcom drivers for the wifi module using my NAS that runs N100, because as far as I know you can’t do it on MacOS.

It requires a few steps:

Install nix package manager

Just grab the command from the nixos website. For Linux:

sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install) --daemon

Clone nixos github repository

git clone --depth=1 --branch release-25.05 https://github.com/NixOS/nixpkgs.git
cd nixpkgs # don't forget to CD !

If you don’t need whole git history (and to compile an ISO image you don’t), you can do a shallow copy, hence --depth=1

Create a nix installer that includes Broadcom drivers

Edit nixos/mac-installer.nix and include Broadcom proprietary drivers. For this we need to add nixpkgs.config.allowUnfree = true;

{ config, pkgs, ... }:
{
imports = [ ./modules/installer/cd-dvd/installation-cd-graphical-gnome.nix ];
nixpkgs.config.allowUnfree = true;
hardware.enableAllFirmware = true;
boot.initrd.kernelModules = [ "wl" ];
boot.kernelModules = [ "wl" "kvm-intel" ];
boot.extraModulePackages = [ config.boot.kernelPackages.broadcom_sta ];
networking.networkmanager.enable = true;
environment.systemPackages = with pkgs; [
vim git wget curl
];
}

Build the ISO

Now all we need to do is to run the nix-build (installed as part of the nix package manager installation):

NIXPKGS_ALLOW_UNFREE=1 nix-build '<nixpkgs/nixos>' -A config.system.build.isoImage -I nixos-config=./nixos/mac-installer.nix

As soon as the process finishes (took less than 1 hour on N100) the ISO can be located inside the result directory:

ls -la result
lrwxrwxrwx 1 root root 100 May 26 07:50 result -> /nix/store/xqmqwlvjclmxlfzsprg35f7kg08awg0n-nixos-gnome-25.11pre805949.bdac72d387dc-x86_64-linux.iso

It’s only 2.4Gb, so virtually any USB stick (unless you still possess one from 2006) you have around will do.

Flashing the image and installing the NixOS

Flash the ISO onto a USB stick with dd:

I’m using block size of 4MB for better performance:

# dd if=result/iso/nixos-gnome-25.11pre805949.bdac72d387dc-x86_64-linux.iso of=/dev/sdX bs=4M status=progress oflag=sync
2524971008 bytes (2.5 GB, 2.4 GiB) copied, 180 s, 14.0 MB/s
606+1 records in
606+1 records out
2542665728 bytes (2.5 GB, 2.4 GiB) copied, 180.987 s, 14.0 MB/s
# eject /dev/sdX

Make you replace sdX with your device, - grab it from lsblk. Mine was /dev/sdd, but I didn’t want someone accidentally overwriting their primary HDD, so double-check yours.

Now, plug the the stick into a USB port of Mac, and (re)boot it, and while it’s booting hold the Alt/Option (⌥) key, select EFI boot, choose arrows and select the USB stick, and press Enter.

As soon as GNOME Live environment launches you can connect to Wi-Fi and use terminal to proceed the installation.

Make partitions

I used [parted](https://www.redhat.com/en/blog/partitions-parted) which comes with the system itself:

Double-check your disk device name with lsblk before proceeding — mine was /dev/sda, but yours, albeit unlikely, might be different. Using the wrong one will erase the wrong disk.

sudo parted /dev/sda
parted> mklabel gpt
parted> mkpart ESP fat32 1MiB 513MiB
parted> set 1 boot on
parted> mkpart primary ext4 513MiB 100%
parted> quit

Next up, we need to format the partitions.

Formatting partitions

sudo mkfs.fat -F32 /dev/sda1
sudo mkfs.ext4 /dev/sda2

sda1 is the EFI partition (around 512MB, FAT32, with boot flag). And sda2 is the root partition. I decided to go with only 1 partition for the system and documents, feel free to slice up your disk the way you want it.

As soon as the partitions are formatted, we need to mount them to proceed the installation.

Mounting partitions

mkdir -p /mnt/boot
mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot

Quite straightforward, I don’t think it requires any commentary. Let’s move on to generate the nix config and finish the installation

Config and installation

To generate initial config use this command:

nixos-generate-config --root /mnt

The config file will be generated into /mnt/etc/nixos/configuration.nix which you can then edit using editor of your choice. In my case it’s vim which I included in the ISO (scroll up to the ISO build stage).

My initial configuration included only bare bones things I needed. Unfortunately I don’t have a snapshot, but something like this would do (everything else can be installed/configured after the installation of the system on the hard drive):

{ config, pkgs, ... }:

{
  nixpkgs.config.allowUnfree = true;

  networking.hostName = "thinkdifferent"; # Because I'm a dork

  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  time.timeZone = "Australia/Sydney";

  users.users.nemoden = { # before I was coffeeaddict I was know by this tag :)
    isNormalUser = true;
    extraGroups = [ "wheel" "networkmanager" "input" ];
    shell = pkgs.fish;
  };

  environment.systemPackages = with pkgs; [
    git vim curl wget htop
  ];

  services.xserver.enable = true;
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;

  networking.networkmanager.enable = true;

  services.libinput.enable = true;

  security.sudo.enable = true;
  security.sudo.wheelNeedsPassword = false;

  system.stateVersion = "25.05";
}

If everything looks good in your configuration.nix, you’re ready to go. Just run this and you are golden running NixOS on your relic:

nixos-install

reboot and enjoy your mac’s new life.