As part of working on a project recently, I ran into an unexpected problem with ESXi-hosted Mac VMs. For these VMs, I was creating VMDK files from AutoDMG-generated disk images, using vfuse to convert the disk image into a VM with ESXi-compatible VMDK disk image files.
My workflow looked like this:
1. Create disk image using AutoDMG.
2. Use vfuse to create VMDK files using a command similar to the one shown below:
sudo vfuse -i /path/to/autodmg_created_disk_image_here --esx
3. Upload the VMDK files to a convenient location on my ESXi server
4. Set up a new VM, using copies of uploaded VMDK files for the VM boot disk.
5. Resize the new VM to the desired size using VMware’s vmkfstools utility.
6. Start up the VM.
After logging in, I ran the following command to enable macOS to recognize and use the unallocated space from the VM resizing:
diskutil resizeVolume / R
Normally, this command is able to do a live re-sizing of the boot partition to use all available unallocated space. However, this time the re-sizing process failed and the following error was displayed:
How to fix this? For more details, see below the jump.
My research on this problem turned up the following links:
- Unable to extend a partition using the guest Disk Utility after extending disk of a virtual machine running Mac OS X (2069255)
- Expand OS X virtual disk in esxi
Both posts confirmed that this was a known issue, but neither offered viable fixes for the problem I was seeing. After some discussion with Nick Cobb in the MacAdmins Slack, I noticed this section of the error message I had received:
Your partition map does not use the entire space of your whole-disk. You should use "diskutil repairDisk" and then repeat this command.
After some testing, the following command resolved the problem I was seeing:
diskutil repairDisk /dev/disk0
Once the diskutil repairDisk command had been run to fix the partition map, I verified that the following command could now resize the partition without problems:
diskutil resizeVolume / R
To automate the process, I wrote a script to run the repairDisk command. However, repairDisk asks for a Yes/No confirmation before running.
The answer in this specific situation is always going to be “yes”, so the yes command is piped into the command to automatically provide a “yes” answer to the confirmation dialog.