Skip to content

Commit

Permalink
Allow mounting NBD disks (#786)
Browse files Browse the repository at this point in the history
* Allow mounting NBD disks

Fixes #759

* Apply suggestions from code review

Co-authored-by: Nikolay Edigaryev <edigaryev@gmail.com>

* Removed unnecessary docs

---------

Co-authored-by: Nikolay Edigaryev <edigaryev@gmail.com>
  • Loading branch information
fkorotkov and edigaryev committed Apr 11, 2024
1 parent da8afa1 commit 99c91cb
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions Sources/tart/Commands/Run.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ struct Run: AsyncParsableCommand {
var vncExperimental: Bool = false

@Option(help: ArgumentHelp("""
Additional disk attachments with an optional read-only specifier\n(e.g. --disk=\"disk.bin\" --disk=\"ubuntu.iso:ro\" --disk=\"/dev/disk0\")
Additional disk attachments with an optional read-only specifier\n(e.g. --disk=\"disk.bin\" --disk=\"ubuntu.iso:ro\" --disk=\"/dev/disk0\" --disk=\"nbd://localhost:10809/myDisk\")
""", discussion: """
Can be either a disk image file or a block device like a local SSD on AWS EC2 Mac instances.
Can be either a disk image file, a block device like a local SSD on AWS EC2 Mac instances or a Network Block Device (NBD).
Learn how to create a disk image using Disk Utility here:
https://support.apple.com/en-gb/guide/disk-utility/dskutl11888/mac
Expand Down Expand Up @@ -429,6 +429,24 @@ struct Run: AsyncParsableCommand {
for rawDisk in expandedDiskPaths {
let diskReadOnly = rawDisk.hasSuffix(readOnlySuffix)
let diskPath = diskReadOnly ? String(rawDisk.prefix(rawDisk.count - readOnlySuffix.count)) : rawDisk

if (diskPath.starts(with: "nbd://")) {
guard #available(macOS 14, *) else {
throw UnsupportedOSError("attaching Network Block Devices", "are")
}
guard let nbdURL = URL(string: diskPath) else {
throw RuntimeError.VMConfigurationError("invalid NBD URL: \(diskPath)")
}
let nbdAttachment = try VZNetworkBlockDeviceStorageDeviceAttachment(
url: nbdURL,
timeout: 30,
isForcedReadOnly: diskReadOnly,
synchronizationMode: VZDiskSynchronizationMode.none
)
result.append(VZVirtioBlockDeviceConfiguration(attachment: nbdAttachment))
continue
}

let diskURL = URL(fileURLWithPath: diskPath)

// check if `diskPath` is a block device or a directory
Expand Down

0 comments on commit 99c91cb

Please sign in to comment.