TL;DR
If Disk Utility fails to clone an APFS container, giving "APFS inverter failed" as error message, a work-around solution is to copy the partition with the "dd" command into a same-sized partition, then fix the cloned container's UUIDs.
About cloning (copying) entire Mac volumes
Usually, when you want to clone a Mac volume, you'd use Disk Utility's Restore operation. It performs a sector-by-sector copy (while skipping unused sector . The alternative would be to perform a file-by-file copy, as it's done by 3rd party tools like Carbon Copy Cloner.A clone operation by copying individual files has several disadvantages over a sector copy:
- It's much slower.
- If you're using Finder Alias files, these may not work any more afterwards (that's because they rely on each file's unique ID, and those IDs change when copying files over to the destination).
- More programs may request re-activation (re-registration).
However, when I recently tried to make an identical copy of my macOS Mojave system from my MacBook Air (2015), copying it to an external SSD, I ran into problems:
After the copy and verification operation was already apparently finished, an additional inverter process needs to be run on cloned APFS volumes. While I do understand that that's necessary when I copy only a single volume out of an APFS container, or copy the volume into a target APFS container without replacing it entirely, but even if I try to clone the entire container, with erasing the target, it still wants to run an inversion process - and that makes no sense to me.
Now, the error that I kept seeing is: APFS inverter failed to invert the volume
And I'm not the only one, see here and here.
And I'm not the only one, see here and here.
I tried many things, including First Aid and removal of all snapshots, and running the cmdline tool "asr", which showed me more detailed error messages. Still, no success. I keep getting variations of the same issue.
What I'm showing now is a way to clone a complete APFS container (with all contained volumes) the way it should work.
How to clone an APFS container
Note: This may not work with encrypted volumes. Or it might. I have not tried.
We simply copy the entire partition (which contains the APFS container) sector by sector. (Small disadvantage over Disk Utility's Restore operation: This will also copy unused sectors, so it'll take a bit longer.)
Afterwards, we need to change the UUIDs of the cloned container and its volumes, or the Mac (and especially Disk Utility) may get confused when both the original and the cloned volumes are present on the same Mac.
Perform the sector copy operation
In case you want to copy your bootable macOS system, you will have to first start up from a different macOS system. If you have no other external disk or partition with another macOS system, simply start up from the Recover system.
When ready, connect the target disk, then start Terminal.app.
Get an overview of our disk names by entering (and always pressing Return afterwards):
Now unmount all volumes of our source container. In Terminal, enter:
When ready, connect the target disk, then start Terminal.app.
Get an overview of our disk names by entering (and always pressing Return afterwards):
Here's a sample output of my Mac that has four partitions, two of which use HFS+ ("AirElCap", "AirData") and the other two use APFS ("AirMojave", "AirHighSierra"):diskutil list
I plan to clone "AirMojave", so the disk identifier would be disk1, because that is the container for that volume. In your case it may be a different identifier. I will write the commands below using diskS for the source container and diskTsP for the target partition./dev/disk0 (internal):#: TYPE NAME SIZE IDENTIFIER0: GUID_partition_scheme 121.3 GB disk01: EFI EFI 314.6 MB disk0s12: Apple_APFS Container disk1 40.9 GB disk0s23: Apple_HFS AirElCap 20.1 GB disk0s34: Apple_Boot Boot OS X 134.2 MB disk0s45: Apple_APFS Container disk2 39.8 GB disk0s56: Apple_HFS AirData 19.9 GB disk0s6/dev/disk1 (synthesized):#: TYPE NAME SIZE IDENTIFIER0: APFS Container Scheme - +40.9 GB disk1Physical Store disk0s21: APFS Volume AirMojave 20.7 GB disk1s12: APFS Volume Preboot 47.1 MB disk1s23: APFS Volume Recovery 512.7 MB disk1s34: APFS Volume VM 2.1 GB disk1s4/dev/disk2 (synthesized):#: TYPE NAME SIZE IDENTIFIER0: APFS Container Scheme - +39.8 GB disk2Physical Store disk0s51: APFS Volume AirHighSierra 23.2 GB disk2s12: APFS Volume Preboot 20.9 MB disk2s23: APFS Volume Recovery 519.0 MB disk2s34: APFS Volume VM 3.2 GB disk2s4
Now unmount all volumes of our source container. In Terminal, enter:
If this does not succeed, then you either have programs or files open on one of the volumes or you're trying to unmount the boot volume (in that case, you should have restarted into a different system as explained above). Do not continue if the mount was not successful or you're likely to end up with a corrupted clone.diskutil unmountDisk diskS
diskutil apfs list diskS
+-- Container disk2 5099518D-36C0-47CC-B034-0CDA52C51CE8====================================================APFS Container Reference: disk2Size (Capacity Ceiling): 39838416896 B (39.8 GB)Capacity In Use By Volumes: 27042205696 B (27.0 GB)Capacity Not Allocated: 12796211200 B (12.8 GB)
sudo diskutil resizeVolume diskTsP sizeIn place of size, use the number that's show after "Size (Capacity Ceiling):".
This is the command that will perform the copying:diskutil unmount diskTsP
sudo dd bs=1m if=/dev/diskS of=/dev/diskTsP
(See also Adrian's comment below, suggesting to use "rdisk" instead of "disk" for higher speed.)
While dd is doing its work, it won't show any progress on its own. And it can take hours, even days. To check where it's at, type ctrl-T in the Terminal window. That will print a line showing its current progress.Fix the UUIDs
Enter in Terminal:
To check whether the UUIDs have been changed successfully, enter in Terminal:
To mount it:
To show it in Finder:
You'll likely not get any response from this command, telling you success or failure.sudo /System/Library/Filesystems/apfs.fs/Contents/Resources/apfs.util -s /dev/diskT
To check whether the UUIDs have been changed successfully, enter in Terminal:
In the output, find your source and target disks, and compare the UUIDs of their container and container volumes. They should all be different. If the UUIDs of source and target volumes show the same code, then the fix did not work. Try again.diskutil apfs list
Make the system volume bootable
The last step is to make the cloned volume bootable again (in case it was before). For that, you need to mount the Preboot volume, then rename the single folder inside, which contains the old UUID, into the new UUID of the main volume.To mount it:
(X stands for the partition number containing the "Preboot" volume)diskutil mount diskTsX
To show it in Finder:
Now you should see a Finder window with a folder named after the UUID of the original volume you copied. Rename that folder into the new UUID. To verify that you used the correct UUID, open System Preferences, Startup Disk, select the cloned bootable volume and click the Restart button. If it says that it can't bless it, you got it wrong. Otherwise, the system should now restart, meaning the UUID was correctly set to a bootable volume.open /Volumes/Preboot