Introduction
Installing Windows 10 alongside with Mac OS is pretty straightforward with Apple’s BootCamp. It will ask you how much space you want to allocate for each environment, ask you for a Windows 8 or 10 ISO or CD-ROM, and then start the process. Once finished, you can select which OS to boot by pressing “alt” when the boot chime sounds. But BootCamp doesn’t give you enough flexibility. What if you want to share data between the two operating systems, for instance? Windows can’t access Mac’s HFS+ file system and Apple’s implementation of NTFS drivers to access Windows file systems is so buggy, they only dare to give you read access. And what if you’d like to not just install a dual boot but triple or quadruple boot? Of course, you might overcome most challenges by simply using a virtual machine in VirtualBox, Parallels or VMWare Fusion. But there are some use cases where you need to be able to boot natively into an OS - and it’s not just gaming in Windows, e.g. scrolling of console output in Eclipse is only usable under Linux. Windows and OSX do too much soft scrolling and cause a growing lag between real output and display. Another advantage might be to use Docker natively in Linux instead of a VM.
I spent literally 2.5 days (that’s 36 hours) on the internet, and trying and testing to remedy all the quirks and problems. I’ve tried many things that in the end didn’t work out. To save you that time, I decided to write this guide. Please let me know if it worked or where you got stuck to make it more complete.
Overview
- Use BootCamp to install Windows
- Shrink the Windows partition
- Create additional partitions
- Install Linux via USB stick
- Fix the Windows boot process (error 0xc000000e)
- Install reFind
- Install ntfs-3g in OSX and Linux to access the shared data partition
- optional: Install & Configure VirtualBox to boot Windows/Linux from Raw disk in OSX
NOTE: The following procedure is not without risk. Do not follow it unless you know what you are doing and most of all: create a backup first ! I will not take any responsibility for loss of data or wrecked OS installations (incl. the original OSX).
Preparation
To make necessary changes to system files, you must disable the integrity checks of El Capitan
- Reboot your Mac and at the boot chime, press cmd-r to boot into the recovery image.
- Once loaded, in the top menu select Utilities->Terminal
- To disable the integrity protection, enter
csrutil disable
- Type
reboot
to reboot into standard OSX. You can check withcsrutil status
if it’s enabled or not.
Installation of Windows
Preconditions
- There should be only one partition on the disk for OSX - otherwise BootCamp will refuse to do its work.
- On a CD-less Mac, you’ll need the ISO images of Windows 8 or 10, not the CD. To download them without direct access to Microsofts Download center, use Windows ISO-Downloader and get e.g. Win10_1511_1_English_x64.iso)
Steps
- Start BootCamp (Applications/Utilities/Bootcamp Assistant)
- Specify the downloaded ISO and select the partition sizes. Here, only the OSX partition size will be final - let Windows take the rest (for now). I used 100GB for OSX.
- Let Bootcamp install Windows and restart as desired.
- Once it’s (almost) finished and logs you in to the desktop, don’t do anything else yet! Keep the automatically started BootCamp installer open but don’t proceed yet. If you do, you might not be able to shrink the Windows partition sufficiently, and you’ll have to start over. (ask me how I know…)
- Start the Windows partition manager (right click on your computer -> manage -> disk management -> right click on C: -> Shrink Volume. Now, enter the amount of MB to shrink the Windows Partition. I chose a value so the final size of the windows partition is 100GB.
- As it’s so convenient, you can use the Windows tool to create the remaining partitions. Don’t worry, although we already have 4 partitions, it’s a GPT partitioned disk (hopefully) which doesn’t have the limitation of 4 primary disks like a MBR disk. I added a 25GB partition for Ubunutu Linux and used the remaining 250GB for a shared NTFS Data partition (all 3 OS will use it to store Documents, Source Code, Java Applications, Music, Movies). If you want you can add a partition for Linux Swap space (I use a swapfile on the 25GB partition instead). DO NOT change anything on the first three partitions !!! The first one is the EFI partition required to boot the system. The second is the HFS+ partition which contains the OSX and the third is the OSX recovery partition (the one you boot into with cmd-r).
- Once the partitions are configured to your satisfaction, continue the BootCamp installer.
Postcondition
You have a dual boot system with partitions prepared for Linux and data sharing. You can switch between the OS by pressing the Alt key during boot.
Installation of Linux
Precondition
- You have prepped all partitions as described above.
- You have downloaded a 64bit variant of a Linux distribution (I chose Ubuntu Desktop). Make sure to use the 64-bit variant and not the one built for Macs. The Mac image doesn’t support EFI partitions yet. It will boot up in BIOS mode and write a MBR to the disk instead of the necessary EFI files on the first partition
- You also have a 2GB+ USB stick at hand which can/will be erased.
Steps
Load the Linux ISO image to the USB stick according to this guide
Reboot the Mac and press the Alt key during boot.
Select the USB stick in the boot selection menu (choose the EFI option).
When prompted, choose “Try ubuntu” and NOT “Install Ubuntu” - once the desktop has loaded, start “Install Linux” from there.
IMPORTANT: Once you arrive at the partitioning step, do NOT let Ubuntu repartition your disk. Choose “Do something else” - otherwise you really do something else (like pay a visit to the Mac store to re-install OSX + recovery image).
Check that the first partition is recognized as EFI boot partition (/dev/sda1).
Select the partition intended to install Linux (in my setup it was the /dev/sda5, 25GB) and click on “Change”. Format the disk as ext4 partition and assign it to “/”.
IMPORTANT: before you continue, select /dev/sda1 as target for the bootloader installation. This will add Linux' EFI bootloader to the existing collection.
Check again in the partition overview that only the partitions you want to install Linux on, or want to use as swap disk, have the “Format?” checkbox checked. If not, start over by clicking “revert”.
Let the installation finish (do not install updates during installation as the wifi probably won’t work yet). If you did not choose a swap partition, you might get a warning. Ignore it.
After the installation of Linux, Windows 10 will not boot anymore and stop with a blue screen error 0xd000000e. This is because the Linux installation creates a hybrid MBR which is completely unnecessary. Windows will not boot in EFI mode but in BIOS mode instead and crash.
Open a terminal and start
sudo gdisk /dev/sda
(if it’s not installed, reboot into Linux, try again or install withsudo apt-get install gdisk
)Type
p
to view the partition table to verify you’re working on the correct disk. If not, typeq
to quit without saving your changes and try again with another device.Type
x
to enter the experts' menu.Type
n
to create an empty protective MBR. Note that gdisk won’t confirm a change; it’ll just show you a new experts' prompt.Type
w
to save your changes. You’ll be asked to confirm this action. Do so.Reboot into Linux (if not done already)
Click on System Settings -> Display and set Scale for menu and title bars to 1.50
-
Optional: to fix small fonts of grub during boot, execute
sudo grub-mkfont -s 36 -o /boot/grub/DejaVuSansMono.pf2 /usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf
and add the following line at the end
sudo vi /etc/default/grub
:GRUB_FONT=/boot/grub/DejaVuSansMono.pf2
-
To fix freezes with SSD disks edit
/etc/default/grub
so the line with GRUB_CMD_LINUX reads:GRUB_CMDLINE_LINUX="libata.force=noncq"
then execute
sudo update-grub
-
Install and configure powertop:
sudo apt-get install powertop
and make it to start automatically: edit/etc/rc.local
and insert the line before the one that saysexit 0
powertop --auto-tune &
-
Fix keyboard layout (to fix some special characters):
sudo su - echo "options hid-apple iso_layout=0" > /etc/modprobe.d/hid-apple.conf
Postcondition
You have a Mac which can boot to OSX, Windows 10 and Linux by pressing the Alt key during boot.
Installation of reFind
Precondition
- You have installed one or more additional OS with the above procedure and are able to boot into them by pressing the Alt key during boot
- Your currently running OS is OSX
Steps
- Download the reFind installer (the binary zip file)
- In Finder, double-click on zip file
- Open a terminal, go to the unzipped refind folder
- execute
./refind-install
(this is the action which requires the integrity tool to be switched off)
Postcondition
During boot you will get a nice boot menu which automatically boots into the previously selected OS after a certain timeout.
Note: After Windows or Linux updates you might loose the reFind bootloader. If so, boot into OSX by pressing the Alt key during boot and re-install reFind. (you will have to temporarely disable integrity checks first, refer to “Preparation” and “Cleanup”).
Installation of ntfs-3g
To be able to access the shared data partition from all OS, you must install ntfs-3g on OSX and configure it in Linux.
Linux
- Linux already comes with ntfs-3g pre-installed.
- To make it mount the shared data during boot, add the following line to /etc/fstab (replace the partition number 6 with the correct one and the mount point with the one you like):
/dev/sda6 /data ntfs defaults,umask=007,gid=46 0 0
OSX
- Download and install OSXFUSE (it’s a pre-condition for ntfs-3g)
- Download and install Open Source ntfs-3g . Although this free edition doesn’t offer caching, it works fine and sufficiently fast. You might also choose the commercial edition maintained by Tuxera
- I did not follow the guidelines and did not create an entry in /etc/fstab. Instead, I did the following in a terminal which replaces the OSX original ntfs implementation with the ntfs-3g and the integration in OSX is seamless (new NTFS volumes are automatically mounted in r/w mode under /Volumes)
cd /sbin sudo mv mount.ntfs mount.ntfs.orig sudo ln -s /usr/local/sbin/mount_ntfs mount.ntfs
Installation of VMWare to boot the raw Windows / Linux partition in OSX (optional)
You can not only boot into Windows or Linux natively now, but also by using virtualization tools like Oracle’s VirtualBox to boot from the raw partition. But be careful NOT to suspend the OS in native mode and then boot via VirtualBox or vice versa. This will cause disk corruption as Windows/Linux will write data to the disk assuming a wrong status once you re-start the suspended image. –> As you can also read in the “Caveats” section, the best idea is to always shut-down Windows and Linux and never put it to sleep or hibernation (natively and virtualized). Only put OSX to sleep, nothing else.
Precondition
You have installed Windows and/or Linux accordingly.
Steps
- Download and install VirtualBox and its additions in OSX.
- Create a new Virtual Machine e.g. for Windows 10. Do not add a virtual disk yet.
- Open a Terminal and enter the following (replace the “4” in line 2 and 4 with the correct partition number):
- Open the settings of your virtual box, go to “Storage”, add an IDE controller with PIIX4 chip-set (as SATA won’t work yet) and add the just created win10.vmdk as disk to the configuration.
- After a reboot the permission to the devices are reset, so I created a small script to quickly boot into the Win 10 VM. Save it as “Windows 10.command” (replace “Windows 10” with the name you gave to the VM) :
- To make the terminated Terminal close automatically, go to it’s Preferences -> Profiles -> Shell -> When the shell exits: “Close if shell exited cleanly.”
- Make the script executable with chmod.
- Start the virtual machine. At first startup it will install some additional drivers.
- If you put the VM into full screen mode, you can easily switch between OSX and Windows by swiping two fingers over your mouse. Very nice ! :)
You may do the same for the Linux raw partition.
Postcondition
- You can boot not only natively into your operating systems but also virtualized while having OSX running as host OS.
- To access the shared data partition, add it as a shared folder in the VM configuration and mount it accordingly in the VM.
- You don’t need to worry about multiple mounting of the shared data partition (e.g. natively by OSX and by the VM). As you only gave access to the EFI and the OS partition, Windows or Linux will not be able to access the data partition directly from within the VM. But I would recommend to not access the windows OS partition mounted on /Volumes while the Windows VM is running.
Cleanup
Once everything works well and you’re happy, re-enable the integrity system check (CSR):
- Reboot, press cmd-r to boot into the recovery image
- Open a terminal and enter
csrutil enable
andreboot
Caveats
- Suspending the computer in Windows or Linux will cause the Mac to freeze –> it’s best to disable this in the respective power configuration tools.
- Bluetooth and the facetime camera don’t work properly yet. There are some beta drivers available but they might not work properly yet.
References
- https://www.hongkiat.com/blog/install-windows-on-mac
- https://www.makeuseof.com/tag/install-linux-macbook-pro
- https://www.makeuseof.com/tag/how-to-boot-a-linux-live-usb-stick-on-your-mac/
- https://www.rodsbooks.com/refind/
- https://superuser.com/questions/508026/windows-detects-gpt-disk-as-mbr-in-efi-boot
- https://help.ubuntu.com/community/MacBookPro12–1/Wily