DFU restore Apple Silicon Macs with macvdmtool
What is macvdmtool?
It is a tool from the AsahiLinux project that lets you put an Apple Silicon Mac in DFU mode with a simple set of terminal commands.
Note: macvdmtool requires that you have two Apple silicon machines on hand. One acts as the “host” machine which initiates the “target” machine to perform a restore.
Setting up and using macvdmtool
-
Install Xcode and the Xcode commandline tools.
-
Install Apple Configurator 2 from the Mac App Store.
-
Clone macvdmtool
git clone https://github.com/AsahiLinux/macvdmtool.git
-
Change into the macvdmtool directory and compile the tool
~ % cd macvdmtool && make cc -o macvdmtool main.o -framework CoreFoundation -framework IOKit -lc++ macvdmtool %
-
(Optional) Copy macvdmtool to somewhere that is in the default path.
macvdmtool % sudo cp macvdmtool /usr/local/bin Password: macvdmtool %
-
Launch Apple Configuration 2 and install the “Automation Tools”.
-
Connect the host and target Macs together via an official Apple USB-C charging cable. The cable must be plugged into the DFU port on both ends.
- On the M1 Macbook Air, the DFU port is the usb-c port closest to the screen.
- On the M1 Pro, the DFU port is the usb-c port closest to the Magsafe connector.
-
Put the target mac in DFU mode.
~ % sudo macvdmtool dfu Mac type: J313AP Looking for HPM devices... Found: IOService:/AppleARMPE/arm-io@10F00000/AppleT810xIO/i2c0@35010000/AppleS5L8940XI2CController/hpmBusManager@6B/AppleHPMBusController/hpm0/AppleHPMARM Connection: Source Status: APP Unlocking... OK Entering DBMa mode... Status: DBMa Rebooting target into DFU mode... OK Exiting DBMa mode... OK ~ %
-
Confirm the device is in DFU mode by launching Apple Configurator 2. It should look like this.
-
Grab the IPSW you want to restore from Mr. Macintosh’s database.
-
Use
cfgutil
to restore that IPSW.~ % cfgutil restore -I ~/Downloads/UniversalMac_12.1_21C5021h_Restore.ipsw objc[53015]: Class AMSupportURLConnectionDelegate is implemented in both /usr/lib/libauthinstall.dylib (0x1da64c9e8) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x104d782c8). One of the two will be used. Which one is undefined. objc[53015]: Class AMSupportURLSession is implemented in both /usr/lib/libauthinstall.dylib (0x1da64ca38) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x104d78318). One of the two will be used. Which one is undefined. cfgutil: restore: target OS is 12.1 Waiting for the device [1/2] [*******************************************] 100% Step 2 of 2: Installing System [2/2] [**********************************>] 99%
At this point you’ll see an Apple logo and a loading bar on the target mac.
After a few minutes, the Mac will reboot and launch the standard Setup Assistant experience.
That’s it! Enjoy.
Future automation enhancements
- Once Apple adds 12.X IPSWs to the com_apple_macOSIPSW.xml feed, I could write a script to download the latest IPSW and then execute macvdmtool and cfgutil.
- Autopkg recipe to download latest IPSW and package it with Munki. This could be useful to distribute IPSWs to technicians.
Have a question, clarification, or comment?
File an issue or PR (pull request) against my blog at https://github.com/discentem/blog-content or reach out via MacAdmins Slack.
Further Readings on DFU
See Mr. Macintosh’s excellent blog post on DFU restores for more information.