19

I could not find any description of configuring dual boot of NixOS and Mac OS X on an (U)EFI MacBook. I am willing to experiment, but i would like to know at least that what i will try is supposed to work, and that there will be a chance to not have to reinstall OS X afterwards.

Can anybody tell me please the main steps or give a link to a page that describes the procedure?

What confuses me in particular is that the UEFI installation section of the NixOS manual says that i need to make an EFI System Partition that will be mounted at /boot; however, my disk already has an EFI System Partition as the first partition, and i am afraid there can be conflicts if i allow both Mac OS and NixOS to modify it. According to Wikipedia,

On Apple–Intel architecture Macintosh computers, the EFI partition is initially blank and not used for booting. However, the EFI partition is used as a staging area for firmware updates; specifically, it places a firmware flash utility (EFI binary) and data file (FD – "Firmware Device") in the directory EFI/APPLE/FIRMWARE which is then run when rebooting the system in "flash firmware" mode. If deleted, the system will still boot, and the boot manager will still allow users to choose whether to start a Boot Camp partition or the default Mac OS X, but firmware updates will fail.

I imagine this means that if i use the same EFI System Partition for NixOS, it may get modified if i make an Apple firmware update. It is also not clear what will happen if i create two EFI System Partitions. For example, there is a NixOS configuration option boot.loader.efi.efiSysMountPoint (where the EFI System Partition is mounted) with the default value "/boot", but how will it know which one to mount?

P.S. As a boot manager i was planning to use rEFInd, but any alternative suggestion is welcome.

16

This is an updated version of my initial answer, it should work for NixOS 15.09. It contains minor modifications compared to the initial version which i used to install NixOS 14.04 with some help from nix-dev mailing list.

Initial setup

  1. MacBook 5,1 (2008) with Mac OS 10.9 and hard drive partitioned as follows:

    a) 200MB EFI System Partition labelled "EFI".

    b) Two partitions used by Mac OS (10.9).

    c) Two empty ext4 partitions labelled "nixos" and "home", and a Linux Swap partition labelled "swap".

    I used the following tools:

    • GPT fdisk (from under Mac OS),

    • mkfs.ext4 (from under NixOS on a bootable USB drive),

    • mkswap.

    Here is my partition table as printed by gdisk:

    Number  Start (sector)    End (sector)  Size       Code  Name
       1              40          409639   200.0 MiB   EF00  EFI System Partition
       2          409640       104603575   49.7 GiB    AF00  Untitled
       3       104865720       261418767   74.7 GiB    AF00  Untitled
       4       261680912       287071535   12.1 GiB    8302  home
       5       287071536       307888927   9.9 GiB     8300  nixos
       7       307888928       312581774   2.2 GiB     8200  swap
    
  2. Cable Ethernet Internet connection.

  3. A USB drive formatted as FAT with MBR and labelled NIXOS_ISO, with a copy (dragged and dropped) of the content of the NixOS 15.09 64-bit ISO image (Live CD or Minimal).

    • The label of the USB drive must be NIXOS_ISO (i tried with FLASH once, it didn't work).

    • It seems that NixOS 15.09 ISO images cannot be mounted under Mac OS. If the image cannot be mounted, it is enough to extract its contents. I could extract the contents of the ISO image with Keka file archiver.

Installation

  1. Boot from the USB drive by holding down the Alt/Option key when rebooting and by selecting the USB EFI Boot. Log in as "root" (without password). Make sure the Internet connection is working. Internet connection is necessary for the installation.

  2. Execute

    swapon /dev/disk/by-label/swap
    mount /dev/disk/by-label/nixos /mnt
    mkdir /mnt/boot
    mkdir /mnt/home
    mount /dev/disk/by-label/EFI  /mnt/boot
    mount /dev/disk/by-label/home /mnt/home
    nixos-generate-config --root /mnt
    
  3. Add

    nixpkgs.config.allowUnfree = true;
    

    in the generated /mnt/etc/nixos/configuration.nix file.

  4. Execute

    nixos-install
    
  5. Reboot:

    reboot
    

Booting

(This was my experience with 14.04.)

After rebooting, the computer booted into NixOS. I rebooted again, holding this time the Alt/Option key. The boot menu showed two identically looking "EFI Boot" items. It turned out that one of them is Mac OS, and the other is NixOS. (Strange -- before the one with Mac OS was named after the Mac OS partition.) Ok.

I mounted and inspected the content of the EFI system partition out of curiosity:

§ tree /Volumes/EFI/
.
├── EFI
│   ├── APPLE
│   │   ├── EXTENSIONS
│   │   │   └── Firmware.scap
│   │   └── FIRMWARE
│   │       └── MB51_007D_03B_LOCKED.scap
│   ├── Boot
│   │   └── BOOTX64.EFI
│   ├── gummiboot
│   │   └── gummibootx64.efi
│   └── nixos
│       ├── 5683z247xmsrh4lyr2hgpxwlb9gg5wyl-linux-3.12.20-bzImage.efi
│       └── mmjxbf6vwp5mwb384yfd6c8vkhd19gx8-initrd-initrd.efi
└── loader
    ├── entries
    │   └── nixos-generation-1.conf
    └── loader.conf

Everything there but /EFI/APPLE and its content has been created by NixOS installation.

Making Mac OS default again

(This was my experience with 14.04.)

To make Mac OS default again and to make the corresponding item in the Option-key boot menu named after the Mac OS partition, it was enough to go to System Preferences... > Startup Disk under Mac OS and select the partition with Mac OS. Strangely, it required entering the admin password twice, and the partition was still not shown as selected, but otherwise it worked.

Other instructions

  • To always see gummiboot menu, it is enough to set boot.loader.gummiboot.timeout in configuration.nix.

  • To configure properly my nVidia graphics card, i ended up using the open-source nouveau driver:

    services.xserver.videoDrivers = [ "nouveau" ];
    

    I have no complaints about it. If i use the proprietary "nvidia" instead, text consoles do not work.

    Update for NixOS 16.09. I observed that on my machine with NixOS 16.09, the option services.xserver.videoDrivers is not needed in configuration.nix for everything to work well, and that in fact it noticeably degrades the graphical performance according to a few tests i did with glmark2 OpenGL benchmark. I also observed that selecting "nvidia" breaks graphical mode but leaves text consoles, contrary to what i observed with Nix OS 14.04. This all looks a bit strange to me, but this is what i observed, so i removed this option from my configuration.nix.

  • To load the applesmc module (for the sudden motion sensor, for example) it was suggested to me to add the following to configuration.nix:

    boot.kernelModules = [ "applesmc" ];
    

Remarks and observations

The only "problem" with NixOS on my MacBook that i have observed so far is that running NixOS my laptop usually gets 5-10 °C hotter than under Mac OS 10.9. This might be a usual problem for Linux on a Mac.

Links to alternative installation instructions

  • Thanks @Alexey for the nice writeup! I have only one doubt. It's ambiguous if you ended up using the pre-existing EFI partition (created by Apple) or if you created an additional one. I tried the latter, but the installation is failing with "...file system is not a valid EFI", so I suspect I need to just use the Mac's EFI partition. Do you confirm? Thanks! – Alfredo Di Napoli Oct 22 '14 at 7:37
  • Alfredo, you are right, i didn't explain how i got the initial setup. I already had Apple EFI System Partition, which, i believe, all computers like mine have pre-installed. I will be surprised, however, if it matters how that partition is created. Are you sure you have set the correct partition code EF00? I used gdisk to manage my new partitions. I have made an edit to show my partition table. – Alexey Oct 23 '14 at 9:42
  • Hi @Alexey, thanks for the reply. In the meantime I was bold enough to simply reuse the pre-installed EFI partition that, apparently, is how we should proceed. It's probably possible to create two partitions (and I have indeed used EF00 for the one I created), but eventually reusing Apple preinstalled just worked. I'm typing from NixOS as we speak :) – Alfredo Di Napoli Oct 24 '14 at 10:15
  • I believe i've read somewhere that it is not recommended or somehow not supported to have more than one EFI System Partition. – Alexey Oct 24 '14 at 10:18
  • Good luck with debugging NixOS on MacBook :). If you do not have SSD and figure out how to configure the sudden motion sensor, let me know, please. (I have just added a remark about this to my answer.) I also seem to have difficulty with configuring the CPU frequency: even with powersave governor it gets quite hot for no apparent reason. – Alexey Oct 24 '14 at 10:30
2

Some additional tips:

If you want to get your backlight working and prevent your laptop from spontaneously resuming while the lid is closed, you can use something like the following in your configuration.nix:

  # Enable the backlight control on rMBP 
  # Disable USB-based wakeup
  # see: https://wiki.archlinux.org/index.php/MacBookPro11,x
  powerManagement.powerUpCommands = ''
    if [[ "$(cat /sys/class/dmi/id/product_name)" == "MacBookPro11,3" ]]; then
      ${pkgs.pciutils}/bin/setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0

      if cat /proc/acpi/wakeup | grep XHC1 | grep -q enabled; then
        echo XHC1 > /proc/acpi/wakeup
      fi
    fi
  '';

Depending on your MacBook version, you might need to tweak the above commands, so please don't blindly copy-and-paste.

1

There are some slightly updated instructions in the master branch of the repository: installing-uefi.xml

  • Whilst this may theoretically answer the question, it would be preferable to include the essential parts of the answer here, and provide the link for reference. – DanteTheEgregore Aug 13 '14 at 14:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.