Sample CodemacOSReviewed 2026-07-21View on Apple Developer

Running GUI Linux in a virtual machine on a Mac

At a glance

Item Summary
Purpose Install and run GUI Linux in a virtual machine using the Virtualization framework.
App architecture A Swift sample centered on AppDelegate, with direct use of Virtualization.
Main patterns Delegate or data-source callbacks
Project style 1 scanned source file(s) across Swift, organized around ranked entry, type, and file boundaries.

Project structure

Source bundle/
├── GUILinuxVirtualMachineSampleApp/
│   ├── AppDelegate.swift
│   ├── Base.lproj/
│   │   └── MainMenu.xib
│   ├── GUILinuxVirtualMachineSampleApp.entitlements
│   └── Info.plist
├── Configuration/
│   └── SampleCode.xcconfig
└── GUILinuxVirtualMachineSampleApp.xcodeproj/
    ├── .xcodesamplecode.plist
    └── project.pbxproj

Structure observations

  • Architecturally prominent files are ranked from entry points and role-named declarations; resource-only paths are omitted.
  • Primary languages: Swift.
  • The verified tree contains 6 project/configuration file(s) and 1 source declaration(s).

Overall architecture

Reference code

GUILinuxVirtualMachineSampleApp/AppDelegate.swift:15 — architecture anchor

@main
class AppDelegate: NSObject, NSApplicationDelegate, VZVirtualMachineDelegate {
    // ...
}

Interpretation

The arrows summarize the source-visible entry, role-named types or folders, and framework direction; when nodes come from structural folders, the sequence is a high-level interpretation rather than proof that every adjacent node calls the next. Ownership is claimed only where the next section cites a stored property or assignment. The diagram is intentionally limited to the dominant path into Virtualization.

Ownership and state

Ownership evidence

GUILinuxVirtualMachineSampleApp/AppDelegate.swift:10 — stored dependency or nearest verified ownership anchor

let vmBundlePath = NSHomeDirectory() + "/GUI Linux VM.bundle/"
Owner Object or state Relationship Mutation authority
AppDelegate NSHomeDirectory (vmBundlePath) creates and retains Initialized by the owner; the binding is immutable
AppDelegate NSWindow (window) stores or receives App/module collaborators
AppDelegate VZVirtualMachineView (virtualMachineView) holds a non-owning reference The referenced object’s lifecycle is owned elsewhere
AppDelegate VZVirtualMachine (virtualMachine) stores or receives Owning lexical scope

Composition arrows indicate a source-visible construction expression or locally owned value state; aggregation means the owner stores or receives a dependency without proving exclusive lifetime ownership.

Class and protocol design

GUILinuxVirtualMachineSampleApp/AppDelegate.swift:16 — representative type boundary

class AppDelegate: NSObject, NSApplicationDelegate, VZVirtualMachineDelegate {
    // ...
}
Type Responsibility Depends on or conforms to
AppDelegate Receives callback-driven events NSObject, NSApplicationDelegate, VZVirtualMachineDelegate

No local protocol conformance is claimed as protocol-oriented design; external framework conformances are listed only as dependencies.

Access control

Symbol Access Verified effect Likely rationale
virtualMachine (GUILinuxVirtualMachineSampleApp/AppDelegate.swift:22) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: keep state mutation or dependency lifetime inside the owning implementation.
installerISOPath (GUILinuxVirtualMachineSampleApp/AppDelegate.swift:24) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: keep state mutation or dependency lifetime inside the owning implementation.
needsInstall (GUILinuxVirtualMachineSampleApp/AppDelegate.swift:26) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: keep state mutation or dependency lifetime inside the owning implementation.
createVMBundle (GUILinuxVirtualMachineSampleApp/AppDelegate.swift:32) private Use is restricted to the lexical declaration and same-file extensions allowed by Swift. Inference: hide an implementation step that is not part of the collaboration surface.

Reference code

GUILinuxVirtualMachineSampleApp/AppDelegate.swift:22 — representative boundary

    private var virtualMachine: VZVirtualMachine!

    private var installerISOPath: URL?

    private var needsInstall = true

Swift declarations without a modifier are internal; explicit private, fileprivate, private(set), public, or open entries above are interpreted by language semantics. Objective-C/C samples instead rely on header and implementation boundaries, which are not equivalent to Swift lexical privacy.

Logic ownership and placement

Logic Owning type or file Placement rationale
Receives callback-driven events AppDelegate The source’s Delegate suffix makes this role explicit.

Design patterns

Pattern Source evidence Purpose or tradeoff
Delegate or data-source callbacks GUILinuxVirtualMachineSampleApp/AppDelegate.swift:16 Callback protocols invert event delivery back into the sample’s owner.

Naming conventions

  • Types: Delegate: AppDelegate.
  • Protocols: no local protocol declaration in the scanned source.
  • Methods: createVMBundle, createMainDiskImage, createBlockDeviceConfiguration, computeCPUCount, computeMemorySize, createAndSaveMachineIdentifier, retrieveMachineIdentifier, createEFIVariableStore.
  • Files: GUILinuxVirtualMachineSampleApp/AppDelegate.swift.

Architecture takeaways

  • AppDelegate is the main source-visible entry or composition anchor for this sample.
  • Framework work reaches Virtualization through a deliberately small high-level chain; the detailed API graph remains inside the cited implementation files.
  • Stored-property evidence identifies lifecycle collaboration; it does not by itself prove exclusive object ownership.
  • Access-control conclusions separate verified language visibility from the likely design rationale.
  • The source does not justify labeling the design protocol-oriented.

Source map

Source file Relevant symbols
GUILinuxVirtualMachineSampleApp/AppDelegate.swift AppDelegate