Hello,
I want to add virtual serial ports to a macOS VM (host = Sonoma, guest = Sonoma).
Here is what I tried so far:
option 1
I create a VZVirtioConsoleDeviceConfiguration
and I add a port to it, with a VZFileHandleSerialPortAttachment
connected to two pipes:
let consoleDeviceConfiguration = VZVirtioConsoleDeviceConfiguration() let guestPort = VZVirtioConsolePortConfiguration() guestPort.isConsole = false guestPort.name = "myserialport" let guestToHostPipe = Pipe() let hostToGuestPipe = Pipe() guestPort.attachment = VZFileHandleSerialPortAttachment( fileHandleForReading: hostToGuestPipe.fileHandleForReading, fileHandleForWriting: guestToHostPipe.fileHandleForWriting ) consoleDeviceConfiguration.ports[0] = guestPort // config is my VZVirtualMachineConfiguration config.consoleDevices = [consoleDeviceConfiguration]
Then after the VZVirtualMachine
is instantiated, I get the runtime VZVirtioConsoleDevice
for my device and I set my service as its delegate.
In the guest system, the device is created with the expected name (/dev/cu.myserialport)
When I open it (e.g. screen /dev/cu.myserialport 9600),
the consoleDevice(_:,didOpen:)
delegate method is called as expected. Then I start sending data to hostToGuestPipe.fileHandleForWriting
, but I get nothing in my guest system.
option 2
Instead of using config.consoleDevices,
I add a VZVirtioConsoleDeviceSerialPortConfiguration
to config.serialPorts
and I use the same scheme as above with a VZFileHandleSerialPortAttachment
and two pipes.
It works, but:
- I can't find a way to rename the devices
(/dev/cu.virtio,
/dev/cu.virtio1,
etc) - I can't detect when the endpoint is opened/closed.
Am I missing something?