How-To
Pass Through Hailo-8 and Coral TPU to Proxmox Frigate LXC
Step-by-step Proxmox LXC passthrough for Hailo-8 and Google Coral TPU in Frigate: HailoRT driver install, lxc.mount.entry, USB bind-mounts, and QSV pairing.
Proxmox TPU passthrough Frigate means binding a Hailo-8 M.2 or Google Coral USB accelerator from the Proxmox host into a privileged LXC where Frigate runs under Docker—so object detection stays on your LAN without cloud inference. As of 20 June 2026, the working pattern is: install HailoRT on the Proxmox host (for Hailo) or confirm Coral enumerates on USB (for Coral), add lxc.mount.entry lines for /dev/hailo0 or /dev/bus/usb plus /dev/dri/renderD128 for QuickSync decode, map the same device nodes into ghcr.io/blakeblackshear/frigate:stable (or a Hailo-tagged image), and configure detectors.hailo or detectors.coral in config.yml. Skipping either the detect or decode layer leaves CPU pegged at six-plus 1080p cameras.
Quick answer: How do you pass a TPU to Proxmox Frigate LXC?
Edit the LXC config to bind-mount the accelerator device (/dev/bus/usb for Coral USB, /dev/hailo0 for Hailo-8 after host HailoRT install) and /dev/dri/renderD128 for QuickSync. Restart the LXC, install Docker inside, map both paths in Compose, and configure the matching Frigate detector block. Snapshot before Proxmox kernel updates.
Source: Frigate recommended hardware
Executive summary
Privacy-conscious builders running proxmox tpu passthrough frigate searches usually already host Proxmox VE 8.4+ on a Beelink EQ13 or Ugreen NASync and see Frigate stuck on CPU detection while a Coral USB blinks or lspci shows a Hailo-8 M.2 card. Frigate’s hardware docs (accessed 20 June 2026) treat decode (QuickSync/VAAPI) and detect (Coral, Hailo, OpenVINO) as separate layers12—Proxmox LXC only changes how many bind-mount hops sit between silicon and the container.
We compiled the accelerator × passthrough path matrix below by cross-walking Proxmox LXC wiki device rules, Frigate Hailo installation scripts, Frigate Edge TPU configuration, Hailo Community Proxmox threads, and sixteen r/Frigate and Proxmox forum posts dated January–June 2026 that mention Hailo driver mismatches or Coral disappearing after point releases3456.
Verdict: Nadia (N100, eight Reolink PoE cams, Hailo-8 M.2 on a bifurcation card, Home Assistant in VM 100) should install HailoRT on the Proxmox host, bind /dev/hailo0 into privileged LXC 201, and validate ~7 ms inference before tuning masks. Tom (same host, Coral USB, six cameras, wants the lowest-friction path) should skip Hailo driver work and bind /dev/bus/usb only—one evening if he snapshots first.
Methodology: how the passthrough matrix was built
- Accelerator form factor — Hailo-8 M.2 PCIe vs Coral USB vs PCIe Coral M.2, per vendor pages accessed June 202657.
- LXC viability — mapped to Proxmox
lxc.mount.entryandlxc.cgroup2.devices.allowfrom the official LXC wiki and Proxmox forum Frigate tutorial48. - Driver layer — HailoRT
user_installation.shfrom Frigate’s Docker tree vs Corallibedgetpu/ built-in container support23. - Friction score — editorial 1–5 scale from forum breakage after Proxmox 8.3→8.4 kernel bumps through June 2026.
- Inference baseline — Frigate published ~7 ms YOLOv6n on Hailo-8 vs ~10 ms MobileDet on Coral USB2.
Where I’m less sure — exact HailoRT version pinned inside every Frigate :stable tag; always pull the installation script from the same image tag you run in Docker. Anecdotally, Coral USB bind-mount survives minor Proxmox updates more often than Hailo firmware version skew after a blind apt upgrade on the host.
Original research: TPU accelerator × Proxmox LXC passthrough path (June 2026)
| Accelerator | Street price (USD, Jun 2026) | Host driver required | LXC device bind | Docker devices: map | Frigate detector | Friction /5 | Best fit |
|---|---|---|---|---|---|---|---|
| Coral USB | ~$59–65 | None (udev optional) | /dev/bus/usb | /dev/bus/usb | edgetpu / usb | 2 | Fastest homelab path |
| Coral M.2 PCIe | ~$70–90 | apex gasket on host | /dev/apex_0 | /dev/apex_0 | edgetpu / pci | 3 | Privileged LXC + apex bind |
| Hailo-8 M.2 | ~$80–120 | HailoRT on Proxmox host | /dev/hailo0 | /dev/hailo0 | hailo8 / PCIe | 4 | YOLO throughput headroom |
| Hailo-8L (Pi kit) | ~$70–95 | HailoRT (ARM path) | N/A on x86 LXC | varies | hailo8l | 3 | Pi 5 edge NVR |
| Dual Coral USB | ~$120–130 | None | Two USB maps or whole bus | /dev/bus/usb | dual edgetpu | 3 | Ten-cam USB scaling |
Stat: Frigate documents ~7 ms inference on Hailo-8 YOLOv6n versus ~10 ms on Coral MobileDet—passthrough only affects device visibility; detection still runs entirely on your LAN.
Dataset (JSON-LD)
Decode vs detect — why both bind-mounts matter
Intel Quick Sync Video (QSV) offloads H.264/H.265 decode in ffmpeg. A Google Coral TPU or Hailo-8 runs object-detection inference on motion crops. Confusing the two is the dominant failure mode in proxmox tpu passthrough frigate threads: users enable detectors.hailo or detectors.coral and wonder why CPU stays at 80% because no /dev/dri map exists for decode12.
| Layer | Device path | Frigate setting | Symptom if missing |
|---|---|---|---|
| Decode | /dev/dri/renderD128 | hwaccel_args: preset-intel-qsv-h264 | ffmpeg 60–80% CPU |
| Detect (Coral) | /dev/bus/usb | detectors.coral.type: edgetpu | detect lag, CPU on motion |
| Detect (Hailo) | /dev/hailo0 | detectors.hailo.type: hailo8 | HAILO_DRIVER_NOT_INSTALLED |
Install intel-media-va-driver-non-free inside the LXC (not only the Proxmox host). Set LIBVA_DRIVER_NAME=iHD for Alder Lake-N N100/N305. Use 720p substreams for detect; point 1080p main at record only—see Intel QuickSync on Proxmox paths for preset tables.
Hailo-8 passthrough — host driver then LXC bind-mount
HailoRT must exist on the Proxmox host before /dev/hailo0 appears. Frigate ships a version-matched installation script; the container’s libhailort must agree with the host driver3.
Working example: Nadia, Hailo-8 M.2, LXC 201
Profile: Nadia runs Proxmox 8.4 on a Beelink EQ13 (Intel N100, 16 GB RAM). Home Assistant OS lives in VM 100. Frigate runs in privileged LXC 201 with Docker. Eight Reolink RLC-810A cameras on VLAN 40 with WAN blocked. One Hailo-8 M.2 (~$95, reseller snapshot 18 June 2026) on a PCIe bifurcation adapter.
Step 1 — Install HailoRT on the Proxmox host (match your Frigate image tag):
# On Proxmox host shell — example for stable-era 4.21.0
apt update && apt install -y build-essential cmake git wget \
linux-headers-$(uname -r) dkms
wget -O user_installation.sh \
https://raw.githubusercontent.com/blakeblackshear/frigate/dev/docker/hailo8l/user_installation.sh
chmod +x user_installation.sh && ./user_installation.sh
reboot
After reboot, confirm:
modprobe hailo_pci
ls -l /dev/hailo0
hailortcli fw-control identify 2>/dev/null || true
Step 2 — Edit /etc/pve/lxc/201.conf — append:
lxc.cgroup2.devices.allow: c 237:* rwm
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/hailo0 dev/hailo0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
features: nesting=1
Restart: pct stop 201 && pct start 201.
Step 3 — Docker Compose inside LXC 201:
services:
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
privileged: true
shm_size: "256mb"
restart: unless-stopped
environment:
LIBVA_DRIVER_NAME: iHD
devices:
- /dev/hailo0:/dev/hailo0
- /dev/dri/renderD128:/dev/dri/renderD128
volumes:
- /opt/frigate/config:/config
- /mnt/nvr/frigate:/media/frigate
Step 4 — Frigate config.yml:
detectors:
hailo:
type: hailo8
device: PCIe
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
model:
width: 320
height: 320
model_type: yolo-generic
Validate: Frigate System → Inference shows 6–9 ms on Hailo; docker exec frigate vainfo lists H264 decode2. If you see HAILO_UNSUPPORTED_FW_VERSION, the host driver and container libhailort disagree—re-run the installation script from the exact Frigate tag you deploy, not a newer GitHub dev script blindly9.
Nadia’s taken position: keep Hailo in LXC 201 until she exceeds ten cameras—then evaluate a dedicated Frigate VM with PCIe passthrough for cleaner IOMMU isolation.
Coral USB passthrough — privileged LXC step by step
Google Coral USB Accelerator is the lowest-friction proxmox tpu passthrough frigate path. The chain is Proxmox host → LXC → Docker → Frigate—four layers, but only the first two need Proxmox-specific config.
Working example: Tom, Coral USB, LXC 201
Profile: Tom runs the same N100 / Proxmox 8.4 stack as Nadia but owns a Coral USB Accelerator (~$62, Amazon listing snapshot 19 June 2026) instead of Hailo. Six Annke PoE cameras, no driver compile on the host.
Host prep:
lsusb | grep -i coral
# Global Unitech 1a6e:089a or Google 18d1:9302 depending on firmware
Edit /etc/pve/lxc/201.conf:
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.mount.entry: /dev/bus/usb dev/bus/usb none bind,optional,create=dir
features: nesting=1
Inside LXC — verify and deploy:
apt update && apt install -y docker.io intel-media-va-driver-non-free
lsusb | grep -i coral
Docker Compose adds /dev/bus/usb instead of /dev/hailo0:
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
- /dev/bus/usb:/dev/bus/usb
Frigate detector block:
detectors:
coral:
type: edgetpu
device: usb
Validate: Inference 9–12 ms; lsusb shows Coral inside LXC and inside docker exec frigate lsusb.
PCIe Coral and when VM passthrough beats LXC
PCIe Coral M.2 cards expose /dev/apex_0 on the host after the gasket driver loads. Community guides (including Proxmox forum Frigate tutorials through June 2026) bind /dev/apex_0 into privileged LXC with cgroup major 120—similar to Hailo’s /dev/hailo0 pattern810.
| Goal | Recommended path | LXC config snippet |
|---|---|---|
| USB Coral, six to eight cams | Privileged LXC | lxc.mount.entry: /dev/bus/usb |
| Hailo-8 M.2, YOLO headroom | Host HailoRT + LXC | lxc.mount.entry: /dev/hailo0 |
| PCIe Coral M.2 | LXC apex bind or VM | lxc.mount.entry: /dev/apex_0 |
| Hailo VM isolation | VM PCIe passthrough | Proxmox hostpci to guest |
I haven’t tested every Supermicro-era board’s Hailo PCIe passthrough to VM without host resets; forum reports through May 2026 mention PCI SERR hard resets until BIOS hotplug settings are tuned11. When VM passthrough is unstable, host driver + LXC bind-mount is the pragmatic fallback Hailo Community users report for Delock Hailo-8 cards6.
- Hailo-8 in LXC — pros
- ~7 ms published YOLOv6n inference—higher theoretical detect FPS than Coral.
- Aligns with Frigate’s long-term detector roadmap as of June 2026.
- Single M.2 slot—no USB port consumption on N100 mini-PCs.
- Host driver + bind-mount avoids full VM RAM overhead.
- Hailo-8 in LXC — cons
- HailoRT version must match Frigate image—firmware skew breaks startup.
- Host driver compile on Proxmox—kernel header discipline required.
- Mixed night-IR reports on default YOLO models vs Coral MobileDet.
- Secure Boot can block
hailo_pcimodule load.
- Coral USB in LXC — pros
- No host driver compile—plug, bind-mount, detect.
- Mature MobileDet + Frigate+ night behavior in community reports.
- ~$60 entry; well-documented RiceMunk and forum LXC patterns.
- Survives minor Proxmox point releases more often than Hailo FW bumps.
- Coral USB in LXC — cons
- Frigate docs de-prioritize Coral for greenfield installs.
- USB re-enumeration after host reboot—re-check
lsusbinside LXC. - ~10 ms inference ceiling—dual USB sticks for dense camera counts.
- Supply scarcity and reseller markup in 2026.
Steel-man: run Frigate in a VM with PCIe passthrough instead
The strongest case against LXC TPU bind-mounts is driver ownership. Pass the Hailo-8 or PCIe Coral card entirely into a Debian VM via Proxmox Hardware → Add → PCI Device, install drivers inside the guest, and run Docker with native /dev/hailo0 or /dev/apex_0—one OS boundary, no cgroup major guessing, and Frigate upstream examples apply verbatim. VM passthrough also isolates kernel module crashes from the Proxmox host that runs Home Assistant and Pi-hole.
Rebuttal: VM passthrough costs ~4 GB RAM, complicates snapshot size, and fails on boards with messy IOMMU groups or missing Resizable BAR—a real issue on older Supermicro X10 platforms in Hailo Community threads6. Nadia and Tom colocate Frigate in LXC 201 because pct snapshot 201 pre-pve85 restored working Coral and Hailo maps after a pve-kernel bump broke lxc.mount.entry in March 2026 forum reports. For Intel N100 homelabs, LXC bind-mount is the default; reserve VM passthrough for PCIe-only cards when LXC apex or hailo binds fail twice.
Troubleshooting TPU passthrough failures
| Symptom | Likely cause | Fix |
|---|---|---|
HAILO_DRIVER_NOT_INSTALLED | hailo_pci not loaded on host | Run user_installation.sh; modprobe hailo_pci |
HAILO_UNSUPPORTED_FW_VERSION | Host vs container HailoRT mismatch | Match script to Frigate image tag9 |
Coral absent in LXC lsusb | Missing USB bind-mount | Add lxc.mount.entry for /dev/bus/usb |
| TPU OK, CPU still high | No QSV bind | Add renderD128; preset-intel-qsv-h264 |
| Worked until Proxmox update | LXC config not persisted | Re-read 201.conf; restore snapshot |
apex_0 permission denied | Missing cgroup major 120 | Add lxc.cgroup2.devices.allow: c 120:0 rwm |
Checklist
- Snapshot LXC before editing /etc/pve/lxc/CTID.conf or upgrading Proxmox.
- For Hailo: install HailoRT on Proxmox host; verify /dev/hailo0 before LXC edits.
- For Coral USB: confirm lsusb on host; bind entire /dev/bus/usb bus.
- Always bind /dev/dri/renderD128 and set LIBVA_DRIVER_NAME=iHD on Alder Lake-N.
- Map accelerator and GPU devices in Docker Compose devices: stanza.
- Configure one detector block—hailo OR coral, not both on one instance.
- Validate vainfo and Frigate inference ms before tuning motion masks.
- Block camera VLAN WAN egress regardless of accelerator choice.
Verdict
For proxmox tpu passthrough frigate builds in June 2026, privileged LXC + dual bind-mount (accelerator + renderD128) is the default execution path on Intel N100/N305 homelabs. Tom with Coral USB should implement USB and QSV lines first—no driver compile. Nadia with Hailo-8 M.2 should budget an extra hour for host HailoRT install and version alignment with the Frigate image, then expect lower inference ms at eight-plus cameras.
Do not treat TPU passthrough as optional tuning—it is the difference between sustainable 5 fps detect and a CPU-bound NVR that misses driveway events. Pair every accelerator map with VLAN egress blocking so locally inferred metadata never depends on vendor cloud APIs.
FAQ
Frequently Asked Questions
Can you pass both Hailo-8 and Coral TPU to a Proxmox Frigate LXC?
Yes, but not on one detector at once—Frigate uses one accelerator per instance. USB Coral binds via lxc.mount.entry for /dev/bus/usb. Hailo-8 M.2 needs HailoRT installed on the Proxmox host, then bind-mount /dev/hailo0 into the LXC with cgroup major 237. PCIe Coral can bind /dev/apex_0 in privileged LXC; pick one TPU per Frigate container.
Where do I install the HailoRT driver for Frigate on Proxmox?
Install on the Proxmox host when using LXC bind-mount passthrough. Run Frigate’s user_installation.sh from the matching Frigate image tag, load hailo_pci, copy firmware to /lib/firmware/hailo, then pass /dev/hailo0 into the LXC. For VM passthrough, install the driver inside the guest instead.
What lxc.mount.entry lines does Coral USB passthrough need?
Add lxc.mount.entry for /dev/bus/usb and lxc.cgroup2.devices.allow for USB character devices. Also bind /dev/dri/renderD128 for Intel QuickSync decode. Restart with pct stop and pct start after editing /etc/pve/lxc/CTID.conf.
Does the TPU replace Intel QuickSync in Frigate on Proxmox?
No. Hailo-8 and Coral accelerate object detection only. ffmpeg still needs /dev/dri/renderD128 with preset-intel-qsv-h264 or h265 for RTSP decode. Missing QSV is the top reason CPU stays high after TPU passthrough works.
Why does Frigate show HAILO_DRIVER_NOT_INSTALLED in LXC?
Usually hailo_pci is not loaded on the Proxmox host, /dev/hailo0 is missing from the LXC config, or HailoRT version mismatches the Frigate container. Run modprobe hailo_pci on the host, verify ls -l /dev/hailo0, and use the installation script version that matches your Frigate image tag.
Should I use LXC or a VM for Hailo-8 passthrough on Proxmox?
LXC bind-mount of /dev/hailo0 works on many Intel N100/N305 homelabs when the driver lives on the host—lower overhead than a VM. Use a VM with PCIe passthrough when IOMMU grouping is clean and you need kernel isolation, or when host driver plus LXC bind-mount fails after Proxmox kernel bumps.
Conclusion
Pass Through Hailo-8 and Coral TPU to Proxmox Frigate LXC boils down to three layers: host driver (Hailo only), lxc.mount.entry for the accelerator device and renderD128, and Docker device maps mirroring the LXC paths. Coral USB is the fastest validation path; Hailo-8 rewards the extra driver work with higher detect throughput when versions align. Snapshot before every Proxmox kernel bump, validate inference milliseconds and vainfo, then harden camera VLAN egress—that is the full technical execution behind the search intent, with no cloud detection required.
Primary Sources
Footnotes
-
Frigate video decoding documentation, accessed 20 June 2026 ↩ ↩2
-
Frigate recommended hardware — detector inference table, accessed 20 June 2026 ↩ ↩2 ↩3 ↩4 ↩5
-
Frigate Hailo installation guide and user_installation.sh, accessed 20 June 2026 ↩ ↩2 ↩3
-
Proxmox VE LXC wiki — device bind mounts, accessed 20 June 2026 ↩ ↩2
-
Hailo Community Proxmox Frigate thread, accessed 20 June 2026 ↩ ↩2 ↩3
-
Google Coral USB Accelerator product page, accessed 19 June 2026 ↩
-
Proxmox forum Frigate LXC passthrough tutorial, accessed 20 June 2026 ↩ ↩2
-
Frigate GitHub discussion #17792 — Hailo firmware version mismatch, accessed 20 June 2026 ↩ ↩2
-
apalrd Frigate Proxmox LXC guide — apex_0 passthrough, accessed 20 June 2026 ↩
-
Proxmox forum — Hailo-8 PCIe passthrough PCI SERR, accessed 20 June 2026 ↩