From da02e6eebe891befec7fae263b76b04c57f948d5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 27 Jun 2026 17:33:09 +0000 Subject: [PATCH 1/2] Add USB 3.0 PCIe card passthrough step for VM 100 VL805/VIA card at 82:00.0 passed to VM 100 (services) as PCIe device. Coral TPU uses built-in server USB ports for VM 101 (Frigate). Co-Authored-By: Claude Sonnet 4.6 --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 7eef0fa..0ac23a7 100644 --- a/README.md +++ b/README.md @@ -2302,6 +2302,41 @@ Click **Add**. --- +### Step 11.4b — Add USB 3.0 PCIe card to VM 100 + +Still in VM 100's **Hardware** tab. Click **Add** → **PCI Device**. + +First, identify the card's PCI address on the Proxmox host: + +```bash +lspci | grep -i usb +# Look for the PCIe card — e.g.: +# 82:00.0 USB controller: VIA Technologies, Inc. VL805/806 xHCI USB 3.0 Controller (rev 01) +``` + +In the dialog: + +| Field | Value | +|-------|-------| +| Raw Device | selected | +| Device | 0000:82:00.0 (your address from lspci) | +| All Functions | checked | +| PCI-Express | checked | +| ROM-Bar | checked | +| Primary GPU | unchecked | + +Click **Add**. + +All ports on the USB card are now owned by VM 100. The Coral TPU for VM 101 +(Frigate) uses one of the server's built-in rear USB ports instead — it only +needs USB 3.0 speed and works on any port. + +> **VL805/VIA cards** are single-function (one PCI address), so All Functions +> has no effect but does no harm. ASMedia and other multi-function cards +> benefit from it more. + +--- + ### Step 11.5 — Add Coral USB to VM 101 In the left panel, click **101** → **Hardware** tab. From 5f10e2210b693f1745087350247dfd8e8e915cf7 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 27 Jun 2026 17:37:00 +0000 Subject: [PATCH 2/2] Document udev port-binding for two identical USB optical drives Drives on VL805 card get stable /dev/optical-drive1 and /dev/optical-drive2 symlinks via port-based udev rules. Explains why vendor/device ID binding fails for identical drives. Co-Authored-By: Claude Sonnet 4.6 --- README.md | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0ac23a7..0839b49 100644 --- a/README.md +++ b/README.md @@ -2429,20 +2429,42 @@ qm set -usb0 host=2-1 # bus-port notation from lsusb -t **USB optical drives:** -Pass a USB optical drive to VM 100 (Services) for ripping with MakeMKV or -HandBrake. Use **Method B (by port)** rather than by vendor/device ID — some -optical drives briefly re-enumerate when a disc spins up, which can cause the -device to drop and reconnect if bound by ID. +Two USB optical drives connect to the VL805 PCIe card (already passed to VM 100 +as a PCI device in Step 11.4b). The drives appear inside VM 100 as `/dev/sr0` +and `/dev/sr1` — but boot order can swap which is which. + +**Fix: udev port-binding rules inside VM 100.** +Always plug drive 1 into the outermost port and drive 2 into the next port in. +Label the cables. Then create stable symlinks based on port path: ```bash -# Find the port your drive is on: -lsusb -t -# Then pass it to VM 100: -qm set 100 -usb2 host=- # e.g. host=2-3 +# Inside VM 100 — plug both drives in, then find their port paths +udevadm info /dev/sr0 | grep ID_PATH +udevadm info /dev/sr1 | grep ID_PATH + +# Example output: +# E: ID_PATH=pci-0000:01:00.0-usb-0:1:1.0-scsi-0:0:0:0 ← outermost port +# E: ID_PATH=pci-0000:01:00.0-usb-0:2:1.0-scsi-0:0:0:0 ← next port in + +# Create the udev rule (replace ID_PATH values with yours from above) +sudo tee /etc/udev/rules.d/99-optical.rules << 'EOF' +ENV{ID_PATH}=="pci-0000:01:00.0-usb-0:1:1.0*", SYMLINK+="optical-drive1" +ENV{ID_PATH}=="pci-0000:01:00.0-usb-0:2:1.0*", SYMLINK+="optical-drive2" +EOF + +sudo udevadm control --reload-rules && sudo udevadm trigger + +# Verify +ls -la /dev/optical-drive* +# Should show: optical-drive1 -> sr0 and optical-drive2 -> sr1 ``` -Inside VM 100 the drive appears as `/dev/sr0`. MakeMKV and HandBrake will -find it automatically. +Use `/dev/optical-drive1` and `/dev/optical-drive2` in MakeMKV and HandBrake +instead of `/dev/sr0` — these names survive reboots and port re-enumeration. + +> **Why not bind by vendor/device ID?** Identical drives share the same vendor +> and device ID so udev can't tell them apart. Port binding is the only reliable +> method for two identical drives. ---