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
Enter ‘help’ for information
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!