Skip to content

Add macOS disk resize support#678

Open
balcsida wants to merge 17 commits into
insidegui:mainfrom
balcsida:feat/macos-disk-resize-compact
Open

Add macOS disk resize support#678
balcsida wants to merge 17 commits into
insidegui:mainfrom
balcsida:feat/macos-disk-resize-compact

Conversation

@balcsida
Copy link
Copy Markdown

@balcsida balcsida commented May 23, 2026

What the resize feature does is that when a guest VM starts the next time, before the guest OS boots, VirtualBuddy inspects the guest disk image by temporarily attaching it on the host with hdiutil and reading the partition layout. If it finds an APFS-on-GPT layout, it treats it as a macOS guest disk and checks for locked APFS volumes / FileVault first:

  • If the disk is encrypted, the resize is blocked. I couldn't find a reliable way to resize FileVault-protected APFS offline, even after trying the recovery key in multiple formats. I may revisit this later.
  • If the disk is not encrypted, the disk image is expanded to the requested size. Then diskutil expands the GPT layout and the APFS container to match. If APFS does not pick up the new ceiling on the first pass, which sometimes happens, the resizer applies a small shrink-and-grow nudge to force APFS to recompute the available space.

@balcsida balcsida force-pushed the feat/macos-disk-resize-compact branch 2 times, most recently from f5ac0a5 to 2cfd5fe Compare May 23, 2026 21:28
@balcsida balcsida mentioned this pull request May 23, 2026
@balcsida balcsida force-pushed the feat/macos-disk-resize-compact branch from 2cfd5fe to 5e9a160 Compare May 23, 2026 21:45
Copy link
Copy Markdown
Owner

@insidegui insidegui left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added some comments about the code, mostly just nitpicks.

I couldn't test it yet though, as I couldn't figure out how to access the disk resizing feature. At first I thought the resizing arrow icon was a button, but it's just an indicator, and the ellipsis button that gives access to the disk settings remains disabled for the boot disk, even when it indicates that it's resizable.

Image

Comment thread VirtualCore/Source/Models/Configuration/ConfigurationModels.swift
Comment thread VirtualCore/Source/Models/Configuration/ConfigurationModels.swift
Comment thread VirtualCore/Source/Models/VBVirtualMachine+Metadata.swift Outdated
Comment thread VirtualCore/Source/Virtualization/VMController.swift Outdated
Comment thread VirtualCore/Source/Virtualization/VMController.swift Outdated
Comment thread VirtualUI/Source/VM Configuration/Sections/Storage/ManagedDiskImageEditor.swift Outdated
Comment thread VirtualUI/Source/VM Configuration/Sections/Storage/ManagedDiskImageEditor.swift Outdated
Comment thread VirtualUI/Source/VM Configuration/Sections/Storage/ManagedDiskImageEditor.swift Outdated
@balcsida
Copy link
Copy Markdown
Author

Strange, it works for me:

Cap.2026-05-25.at.22.11.41.mp4

@insidegui
Copy link
Copy Markdown
Owner

Strange, it works for me

I think it didn't work for me because that VM had an ASIF boot disk image.

This can be done later, but we should probably move the disk image format option into the managed disk image editor UI, with information about the differences in resizability between the two formats.

Currently that is a global setting in the app:

image

There are significant tradeoffs between the choices, so informing the user about those tradeoffs would help them decide 😄

@insidegui
Copy link
Copy Markdown
Owner

One more nitpick. The resizable indicator should probably use a secondary foreground style. Using the accent color makes it look like a button.

image

@balcsida balcsida requested a review from insidegui May 26, 2026 21:46
@balcsida
Copy link
Copy Markdown
Author

Thanks for the feedback @insidegui !
How does it look now?

@insidegui
Copy link
Copy Markdown
Owner

I think I found a bug.

It's trying to resize every VM I boot up, even if I haven't changed the boot disk size.

In one case, I saw an Expanding Boot to 128 GB (1/1).... message, but 128 GB has always been the size of the disk for that VM. Then after that I get the Unlock FileVault to Finish Resizing message.

I think the checkAndResizeDiskImages method needs to be hardened so that there's no possibility that it will ever attempt to touch any disk image unless the user has explicitly chosen to resize the disk, otherwise this adds an appreciable amount of friction every time the user clicks the button to start a VM.

My suggestion would be to add a flag to the VM metadata indicating that there are disk resizes pending, then bail early in checkAndResizeDiskImages unless that flag is present.

Other than that, I tested resizing a virtual machine using an ASIF disk image from 64GB to 128GB and it worked flawlessly 👌🏻

@balcsida
Copy link
Copy Markdown
Author

Interesting... let me check that

@balcsida balcsida force-pushed the feat/macos-disk-resize-compact branch from 0c2bdc6 to 6b78500 Compare May 28, 2026 17:03
@balcsida
Copy link
Copy Markdown
Author

I was able to fix it and improved the disk resize UX a little bit as well

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants