MacBook – SSD firmware upgrade requires iso on a pendrive: how to make that bootable

bootmacbook prousb

Goal is updating a NVMe SSD firmware on a Mac without optical drive via USB stick that should contain a minimal Linux, flasher and payload.

The instructions (PDF) for a firmware update utility say to use Unetbootin on MacOS to write an iso-file to a FAT32 formatted (erased) USB stick.

That works. No errors shown.

What then doesn't work is booting a MacBook Pro 2015 from that stick.

The external USB-drive never shows up in the boot menu.

What I tried:

  • erasing the sticks a few times with DiskUtility
  • partitioning the sticks to either MBR or GPT
  • 3 different sticks
  • different laptops (Mac & Windows)
  • writing the iso file with dd directly to the stick (and in another round using Balena etcher and universal usb installer)
  • different versions of DiskUtility (Sierra and Mojave)
  • Windows on-board tools on a PC for re-formatting the sticks
  • gparted and fdisk mkfs.vfat on a Linux machine
  • using a different iso (not matching the target device) from the vendor site (works without any issues according to instructions, but can't update my device…)
  • writing to customer support (answer: "iso looks good, should work, please try again")
  • booting a fresh virtual machine on a Mac host with just the needed iso attached. Frustratingly, that indeed boots as intended, but can't update the device either. Neither a Windows PC, nor a Linux laptop can boot the sticks I prepared.
  • searching net and especially Ask Different for solutions

The sticks just aren't recognised on any Mac laptop as 'bootable' once the procedure outlined in the manual is finished. All Laptops can boot from external drives (Thunderbolt & USB) and the boot manager updates without interaction once I plug those in.

Possible reasons :
– assuming that DiskUtility from 10.12 and 10.14 can't properly format the sticks?
– is latest version of Unetbootin acting up?
– is the iso for my device incomplete/damaged?

The last item here may be the culprit:

The firmware iso for a Samsung 970 EVO is just so much smaller than for a EVOplus:

  • NVMe SSD-970 EVO Plus Firmware ISO 2B2QEXM7 | 28 MB (works, unneeded)
  • NVMe SSD-970 EVO Firmware ISO 2B2QEXE7 | 17.4 MB (doesn't work, needed)

The EVO-iso is mountable directly in macOS and just contains

 bzImage  initrd  isolinux >
          isolinux.bin  isolinux.cfg  ldlinux.c32

The EVO-plus-iso is not mountable but when written to stick with Unetbootin it shows an EFI folder and GRUB files, etc… Since this one does boot and scans the computer for eligible devices, I am a bit stuck here.

None of these similar questions on AskDifferent offered a working solution:

Copy Crucial SSD Firmware Update ISO to Bootable USB

Is it possible to make a bootable USB stick for a Macbook Pro to do firmware update?

How to install a bootable ISO onto a single partition of a usb stick?

How to create USB Ubuntu boot disk in OS X so that it boots on *non-Apple* computer?

How to make and use an USB stick with GParted that will boot on a Mac?

How to create a Mac bootable gparted or Parted Magic thumb drive?

Since playing with around with DiskUtilities options it seems to be the case that it is a bit buggy. Switching around between various partitions and filetypes related to FAT/FAT32 results in DiskUtility not recognising its own products, with different options greyed out at different times. Looks to me as if some flag or structural anomaly that DiskUtility introduces keeps this from working, like I might have to really wipe down the stick. Alas, neither wipefs nor gparted did that successfully and I do not know what to look for here.

Best Answer

First find USB key disk number from diskutil list. This method will destroy everything on the disk you copy to so take care. Mine was /dev/disk3 and looked like this:

/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *32.0 GB    disk3
   1:                        EFI EFI                     209.7 MB   disk3s1
   2:       Microsoft Basic Data FAT32                   31.8 GB    disk3s2

Make sure no volumes are mounted, then use dd to copy the unmounted ISO file to your device (do not append a partition number, so do not use something like /dev/disk3s2).

This worked for me with the NVMe SSD-970 EVO Firmware ISO 2B2QEXE7 from here.

[hali@macOS] ~ $sudo dd bs=4m if=/Users/hali/Downloads/Samsung_SSD_970_EVO_2B2QEXE7.iso of=/dev/disk3
4+1 records in
4+1 records out
17825792 bytes transferred in 8.546376 secs (2085772 bytes/sec)
[hali@macOS] ~ $sync
[hali@macOS] ~ $

diskutil list now looks like this:

/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            Samsung                *32.0 GB    disk3

and in Disk Utility like this:

Disk Utility

Reboot holding and pick the yellow boot option on USB key called "Windows". It should load the firmware utility fine (it did for me on 2015 MBP).

Afterwards, as mentioned in Arch Wiki the ISO signature needs deleting.

Warning: This will irrevocably destroy all data on /dev/sdx. To restore the USB drive as an empty, usable storage device after using the Arch ISO image, the ISO 9660 filesystem signature needs to be removed by running wipefs --all /dev/sdx as root, before repartitioning and reformatting the USB drive.

As wipefs doesn't exist in macOS, this can be achieved by using gdisk to write a new gpt partition table. Simply reformatting in Disk Utility didn't work to recover use of the USB resulting in lots of "Operation not permitted" errors.