In the following procedure we will create a Microsoft Windows bootable USB flash drive in macOS, from scratch with command line. Root privileges are required.
Note: This works only with BIOS or UEFI CSM (supports old BIOS style booting). Not compatible with native UEFI.
Test environment: macOS 10.13.1
Requirements: syslinux 4.03 and port of syslinux 4.03 to macOS
Warning: All the data on the USB flash drive will be destroyed without warning! Make sure you selected the correct drive or you will destroy a wrong disk!
1. Identify the USB flash drive, in my example the device is /dev/disk2.
diskutil list
/dev/disk0 (internal, physical): /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *121.3 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_APFS Container disk1 121.1 GB disk0s2 /dev/disk1 (synthesized): #: TYPE NAME SIZE IDENTIFIER 0: APFS Container Scheme - +121.1 GB disk1 Physical Store disk0s2 1: APFS Volume SSD 128GB 34.8 GB disk1s1 2: APFS Volume Preboot 18.5 MB disk1s2 3: APFS Volume Recovery 520.8 MB disk1s3 4: APFS Volume VM 1.1 GB disk1s4/dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *15.5 GB disk2 1: DOS_FAT_32 WINDOWS 15.5 GB disk2s1
2. Erase the /dev/disk2, create one big partition /dev/disk2s1 and format as FAT32 with the label “WINDOWS”. All data on /dev/disk2 will be destroyed!
diskutil partitionDisk /dev/disk2 1 MBR FAT32 WINDOWS R
Started partitioning on disk2
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk2s1 as MS-DOS (FAT32) with name WINDOWS
512 bytes per physical sector
/dev/rdisk2s1: 30248048 sectors in 1890503 FAT32 clusters (8192 bytes/cluster)
bps=512 spc=16 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=2 drv=0x80 bsec=30277630 bspf=14770 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished partitioning on disk2
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *15.5 GB disk2
1: DOS_FAT_32 WINDOWS 15.5 GB disk2s1
3. Set bootable flag on, start fdisk and enter the commands with red text.
fdisk -e /dev/disk2
fdisk: 1> flag 1
Partition 1 marked active.
fdisk:*1> write
Device could not be accessed exclusively.
A reboot will be needed for changes to take effect. OK? [n] y
Writing MBR at offset 0.
fdisk: 1> exit
4. Download and unpack syslinux 4.03 source code.
curl https://www.oueta.com/wp-content/uploads/2018/10/syslinux-4.03.tar.gz -o syslinux-4.03.tar.gz
tar -zxvf syslinux-4.03.tar.gz
5. Download syslinux macOS port and make it executable.
curl https://www.oueta.com/wp-content/uploads/2018/10/syslinux-mac.tar.gz -o syslinux-mac.tar.gz
tar -zxvf syslinux-mac.tar.gz
chmod +x syslinux
6. Unmount and write the bootstrap code (mbr.bin) to the MBR of /dev/disk2.
diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
dd if=syslinux-4.03/mbr/mbr.bin of=/dev/disk2 bs=440 count=1
1+0 records in 1+0 records out 440 bytes transferred in 0.000908 secs (484509 bytes/sec)
7. Install syslinux, this will alter the boot sector and copy ldlinux.sys into the root directory.
./syslinux -i /dev/disk2s1
syslinux for Mac OS X; created by Geza Kovacs for UNetbootin unetbootin.sf.net "/dev/disk2s1" unmounted successfully. /dev/disk2s1 DOS_FAT_32 /Volumes/WINDOWS mountpoint is /Volumes/WINDOWS checkpoint1 checkpoint1.5 checkpoint1.6 /Volumes/WINDOWS/ldlinux.sys ldlinuxname checkpoint2 checkpoint3 "/dev/disk2s1" unmounted successfully. checkpoint4 checkpoint5 checkpoint6 checkpoint7 checkpoint8 /dev/disk2s1 DOS_FAT_32 /Volumes/WINDOWS
8. Copy syslinux BIOS modules and create syslinux.cfg.
mkdir /Volumes/WINDOWS/syslinux
cp syslinux-4.03/com32/modules/*.c32 /Volumes/WINDOWS/syslinux
9. Create with a text editor /Volumes/WINDOWS/syslinux/syslinux.cfg and add the following:
default boot LABEL boot MENU LABEL boot COM32 chain.c32 APPEND fs ntldr=/bootmgr
10. Mount the Microsoft Windows ISO image, please replace /example/windows.iso with the path of your Microsoft Windows image.
hdiutil mount /example/windows.iso -mountpoint /Volumes/WINSETUP
11. Copy the Windows installation files to the USB flash drive, it might take a few minutes.
cp -Rv /Volumes/WINSETUP/ /Volumes/WINDOWS/
12. Unmount the USB flash drive.
diskutil unmountDisk /dev/disk2
Update: In case that you are encountering the error “zsh: bad CPU type in executable: ./syslinux” most probably you need to use the 64 bit version of syslinux, you can download it from github the tip is belonging to Thanh. Thanks!
Sorry, but that doesn’t work.
The USB key isn’t bootable after all theses commands.
Do you get some errors? Can you attach a log?
Please delete this post. It doesn’t work at all and I am tired of all these non working guides that wastes my time.
Hi Henrik,
Sorry for your disappointment, can you be more specific?
Hi le-snake and Henrik,
You were right there was some errors in this tutorial, I corrected them.
1. Because the link for syslinux-4.03.tar.gz now it’s redirected, the curl command was not working because I did not used the -L parameter to follow the redirect, now I uploaded the files to oueta.com.
2. Bootable flag was not set, I added step three.
3. There was also an error on step eight, I removed the -e parameter from the echo.
4. Make sure you try to boot with legacy BIOS or UEFI CSM (supports old BIOS style booting).
Please let me know if you still have problems, thanks.
Thank you for this. This *almost* works. However, I had to edit /Volumes/WINDOWS/syslinux/syslinux.cfg and replace literal \n’s with line breaks lest you get a “Could not find kernel image” error.
Nevertheless, these are the most complete instructions for creating a Windows bootable USB key from a Mac.
Thank you for your feedback, I corrected the echo command and added the text, which needs to be added to syslinux.cfg.
Thank you all.
Hey thanks for taking the time to make the guide. This worked perfectly for me except I’m using a windows 10 iso that includes a file that is larger than 4gb. When I tried to follow the guide using the exfat filesystem, I got the error “invalid media signature (not a FAT filesystem?)” when running ./syslinux
Hi, unfortunately syslinux does not support exfat.
I am also trying to install Windows 10 iso and hitting the same error. How were you able to proceed with installing Win10 using the above steps?
This did not work for me, attempting to create a bootable Win 8.1 install. Yeilds “Error Non-System disk or disk error” from HP Z600 Bios
That trick still works…. thanks.
That is a really wonderful guide. Thank-you very much. It worked perfectly.
Now I suppose I need to read more about Syslinux. I tried to use a FreeDOS image for the OS, but the bootloader fails. I was hoping to make a bootable USB for updating firmware.
It would also be amazing if this could work with both native UEFI and also BIOS / BIOS CSM. It takes me a while to figure out whether the machine I am working on supports one or the other. The goal: a truly universal USB boot that would also tell you which boot method it was using.
Thanks for the feedback
Hi.
This command doesn’t work in MacOs Catalina (v.10.15.7)
./syslinux -i /dev/disk2s1
says:
zsh: bad CPU type in executable: ./syslinux
I get the same error message in MacOs Big Sur (version 11.4) 🙁
Try this one, it works for me: https://github.com/gkovacs/syslinux-mac/blob/master/mac/syslinux
Everything works like a charm but I’m getting an error while copying the files
cp: /Volumes/WINDOWS/sources/install.wim: File too large
Wow, thank you so much! It is really workable solution.
@Joan You can use wimlib to split install.wim in chunks (< 4GB each) like:
# brew install wimlib
# wimlib-imagex split /Volumes/WINDOWS/sources/install.wim /Volumes//sources/install.swm 3800
Hi @iamartko, you are welcome, thank you also for your feedback.