|
USBIP C library 0.7.0
Virtual USB devices & host drivers over USB/IP
|
macOS has no in-box USB/IP client, and no vhci equivalent to install.
One experimental third-party client exists, but it only runs with System Integrity Protection turned off - so on a stock Mac the practical way to get a virtual device into the USB stack is a hardware client: a board that imports the device over WiFi and re-presents it on its own USB-OTG port, so the Mac it plugs into sees an ordinary USB device and binds its own in-box driver. Nothing is installed on the Mac, no kernel extension, no SIP change.
| Option | Works today | Cost |
|---|---|---|
| Hardware client (recommended) | yes | a $6 board; the Mac sees plain USB |
| carlossless/usbip-macos` | experimental | SIP must be disabled |
| Serve from macOS | yes | the other machine gets the device |
| Drive from code (Host driver) | yes | no USB stack involvement |
carlossless/usbip-macos is the client itself, written in Rust. It creates the virtual controller through Apple's IOUSBHostControllerInterface rather than a kext, and its author calls it "highly
experimental - just enough working to work my current usecases": expect gaps against the wire protocol this library implements, and test before relying on it. Build it with cargo, then attach by busid or by VID:PID:
-p/--tcp-port selects a non-default port; the process stays in the foreground for the lifetime of the device, and detaching means stopping it. Serve on 0.0.0.0 so the Mac can reach you (Going remote).
IOUSBHostControllerInterface is gated behind the com.apple.developer.usb.host-controller-interface entitlement, which Apple grants only on request. Without it the process must run as root on a Mac with System Integrity Protection turned off (csrutil disable from Recovery), which lowers the security posture of the whole machine - do that on a scratch Mac or a VM, not a daily driver. Prefer the Hardware client if you can.Whichever way the Mac imports, it can also go the other direction: the device libraries build and run there (libusbip-device.0.dylib), so a Mac can serve a device for a Linux or Windows machine to import over the network. And it can drive one with no client and no kernel support at all - the host API speaks USB/IP itself, and existing libusb programs reach a served device through the libusb-1.0 wrapper. Neither touches the macOS USB stack, so neither needs SIP disabled.