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.
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.
cfgutilto restore that IPSW.
~ % cfgutil restore -I ~/Downloads/UniversalMac_12.1_21C5021h_Restore.ipsw objc: 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: 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.