I recently got a new mac mini and wanted to run Windows in Bootcamp, with same Windows running in Parallels - something I've been doing for a long time on my previous mac - with the one extra catch that now it's installed to an external SSD connected via the Thunderbolt 3 port. It was a struggle, but I got it working. Since it was such a pain, I thought I'd share what I learned here.
Problem 1 - Windows install fails within Bootcamp assistant.
Bootcamp Assistant was more than happy to let me choose the external SSD as a target. It partitions the disk, reboots into it, and launches the Windows installer. But the Windows installer fails complaining that it can't install to the partition.
I was able to work around this problem by.
At this point, I had a functional install of Windows on the external disk. One quirk - it doesn't show up as an option under System Settings -> Startup Disk. But if I hold down option at boot time, I can select it and it will boot fine. Also I can option-click the windows partition, and it will "stick" and boot into Windows by default. Within Windows, under the boot camp settings, I am able to select startup disk normally with both OSX and Windows options.
Problem 2 - Unable to create Bootcamp-based Parallels VM
Probably related to the external disk not showing up as a Startup Disk option, Parallels doesn't even show me the option of creating a Bootcamp-based VM.
I was able to work around by manually creating a VM, and then adding the bootcamp partition later. However, that path also had problems of its own.
Problem 3 - Unable to add Bootcamp disk to existing Parallels VM via UI.
In the Parallels UI, I enter settings for my VM and click '+' to add a Hard disk. If I select "Bootcamp" as the type, it gives a selector with one option. However when I click 'next', I get an error. On the other hand, I can add the external disk as a raw disk, but I found it wouldn't boot from it.
I was able to work around this by using the command line tool to add the bootcamp disk. I ran:
/Applications/Parallels\ Desktop.app/Contents/MacOS/prlctl set "Windows 10 (Bootcamp)" --device-add hdd --device /dev/disk0s3 --iface nvme --passthr yes
In my case, the external SSD shows up as disk0, and as mentioned above, the partition with Windows is partition 3 - thus /dev/disk0s3. It may show up differently for others. You can check the disk ID using
diskutil list
When I add via the command line, it shows up as a hard disk in the VM settings and the OS icon changes to the Boot camp icon, so I believe it is added correctly for Bootcamp (also confirmed because ultimately, it does work.) If I try to add the whole disk, /dev/disk0, I get the same error on the command line as what is given when I attempt it in the UI. But for some reason, adding the specific partition, /dev/disk0s3, does work.
Problem 4 - VM doesn't boot
With the VM created, I still found that it wouldn't boot from the hard drive. I get the error "Skipping EFI hard drive" and it treats the drive as not bootable.
I was able to work around this by recreating the EFI partition on the disk (the one I had to delete to get windows to install correctly.) I did this from an ordinary Windows VM, but you could probably do the same by booting directly into Windows using bootcamp.
To recreate it, I ran cmd.exe as Admin. Inside cmd, I ran diskpart, and gave it these commands
# (select the correct disk, the external SSD)
list disk
select disk 0
list part
# (delete raw partition and recreate EFI partition)
select part 1
create partition EFI
format quick fs=fat32
assign letter=v
exit
Now I have the partition and it shows up as v:, but it still needs to be filled with the right files to actually work. Do that by running
bcdboot e:\windows /s v: /f UEFI
(since I was booted in a VM the windows directory for the bootcamp partition showed up as e:. If you booted directly into the bootcamp windows it would probably be c: - make sure you use the path to the actual physical disk you want to boot from.)
Having done this I was able to boot from the bootcamp partition on external disk from Parallels. One minor thing I noticed is, at boot I had an option to choose between one of two boot partitions, where only the first option actually worked. (I believe the second option attempted to reference the partition in the VM that I used to create the EFI partition.) If this occurs, you can remove the extra option by using
bcdedit
to list the options that are in the menu, and
bcdedit /delete {uid-of-extraneous-option}
to remove the entry that doesn't work.
In the end, I think anyone would agree that's a pretty painful path to a working setup. But it does work now! It's also using a Radeon VII eGPU, which had it's own complications, but that's a separate story.
Problem 1 - Windows install fails within Bootcamp assistant.
Bootcamp Assistant was more than happy to let me choose the external SSD as a target. It partitions the disk, reboots into it, and launches the Windows installer. But the Windows installer fails complaining that it can't install to the partition.
I was able to work around this problem by.
- Creating a Windows Install / Recovery USB
- Starting in Bootcamp, but when it rebooted to go to the automated windows installer, hold down 'option' to get the boot selector, and choose the Windows Install / Recovery USB instead.
- After booting into the Windows USB, I started a recovery and launched the cmd shell. I used diskpart to remove the EFI and NTFS partitions that were created by Bootcamp (partitions 1 & 3 on the disk in my case.) Bootcamp also creates a WinInstall partition; I left that one alone.
- With the partitions removed, I launched setup from the WinInstall partition, and proceeded with a normal Windows install. I selected the largest empty area on the disk (former home of Partition 3) as the install location. This completed successfully. Windows also created an unformatted, raw partition in the former home of Partition 1, which was the EFI partition created by Bootcamp. This will become important later.
At this point, I had a functional install of Windows on the external disk. One quirk - it doesn't show up as an option under System Settings -> Startup Disk. But if I hold down option at boot time, I can select it and it will boot fine. Also I can option-click the windows partition, and it will "stick" and boot into Windows by default. Within Windows, under the boot camp settings, I am able to select startup disk normally with both OSX and Windows options.
Problem 2 - Unable to create Bootcamp-based Parallels VM
Probably related to the external disk not showing up as a Startup Disk option, Parallels doesn't even show me the option of creating a Bootcamp-based VM.
I was able to work around by manually creating a VM, and then adding the bootcamp partition later. However, that path also had problems of its own.
Problem 3 - Unable to add Bootcamp disk to existing Parallels VM via UI.
In the Parallels UI, I enter settings for my VM and click '+' to add a Hard disk. If I select "Bootcamp" as the type, it gives a selector with one option. However when I click 'next', I get an error. On the other hand, I can add the external disk as a raw disk, but I found it wouldn't boot from it.
I was able to work around this by using the command line tool to add the bootcamp disk. I ran:
/Applications/Parallels\ Desktop.app/Contents/MacOS/prlctl set "Windows 10 (Bootcamp)" --device-add hdd --device /dev/disk0s3 --iface nvme --passthr yes
In my case, the external SSD shows up as disk0, and as mentioned above, the partition with Windows is partition 3 - thus /dev/disk0s3. It may show up differently for others. You can check the disk ID using
diskutil list
When I add via the command line, it shows up as a hard disk in the VM settings and the OS icon changes to the Boot camp icon, so I believe it is added correctly for Bootcamp (also confirmed because ultimately, it does work.) If I try to add the whole disk, /dev/disk0, I get the same error on the command line as what is given when I attempt it in the UI. But for some reason, adding the specific partition, /dev/disk0s3, does work.
Problem 4 - VM doesn't boot
With the VM created, I still found that it wouldn't boot from the hard drive. I get the error "Skipping EFI hard drive" and it treats the drive as not bootable.
I was able to work around this by recreating the EFI partition on the disk (the one I had to delete to get windows to install correctly.) I did this from an ordinary Windows VM, but you could probably do the same by booting directly into Windows using bootcamp.
To recreate it, I ran cmd.exe as Admin. Inside cmd, I ran diskpart, and gave it these commands
# (select the correct disk, the external SSD)
list disk
select disk 0
list part
# (delete raw partition and recreate EFI partition)
select part 1
create partition EFI
format quick fs=fat32
assign letter=v
exit
Now I have the partition and it shows up as v:, but it still needs to be filled with the right files to actually work. Do that by running
bcdboot e:\windows /s v: /f UEFI
(since I was booted in a VM the windows directory for the bootcamp partition showed up as e:. If you booted directly into the bootcamp windows it would probably be c: - make sure you use the path to the actual physical disk you want to boot from.)
Having done this I was able to boot from the bootcamp partition on external disk from Parallels. One minor thing I noticed is, at boot I had an option to choose between one of two boot partitions, where only the first option actually worked. (I believe the second option attempted to reference the partition in the VM that I used to create the EFI partition.) If this occurs, you can remove the extra option by using
bcdedit
to list the options that are in the menu, and
bcdedit /delete {uid-of-extraneous-option}
to remove the entry that doesn't work.
In the end, I think anyone would agree that's a pretty painful path to a working setup. But it does work now! It's also using a Radeon VII eGPU, which had it's own complications, but that's a separate story.