Hello,
This is yet another post explaining how to set up Coral USB on a LXC container. This is based on my findings after fighting this for days and following tutorials that didn’t end up working for my case.
A few notes
- This tutorial will show how to run Frigate “natively” (i.e. without Docker) in an unprivileged LXC container. To be honest, running it inside Docker may be easier, but I find this way more interesting for learning purposes.
- I won’t cover Home Assistant integration because I assume you have that already working.
- This will work after a reboot, where the USB device id can change.
Creating the container
I just used Proxmox VE Helper-Scripts to create the initial container setup. Don’t worry too much about the configuration options, because we’ll going to change them later. Just run the script and you should have a container ready and running, but with CPU detection.
Install Coral USB in the host system
Basically follow this until you have it working.
Prepare the host system
There are a few changes you have to make in the host system.
-
Create a group with id 10000. By default LXC containers run with uid/gid 10000/10000. Coral USB will not work with the default permissions. Run:
groupadd -g 100000 lxc-frigate-root
-
Configure
udev
. By default Coral setup will create/etc/udev/rules.d/71-edgetpu.rules
, change it so it looks like this (the important part is to add theGROUP
:SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a6e", ATTRS{idProduct}=="089a", MODE="0664", GROUP="lxc-frigate-root" SUBSYSTEMS=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="9302", MODE="0664", GROUP="lxc-frigate-root"
-
Restart
udev
:udevadm control --reload-rules && udevadm trigger
-
Verify it is working. First find the bus and device ID of your Coral USB:
lsusb Bus 002 Device 005: ID 18d1:9302 Google Inc.
-
Check the permissions for that file in the
/dev
filesystem:ls -la /dev/bus/usb/002/005 crw-rw-r-- 1 root lxc-frigate-root 189, 132 Jul 23 12:09 /dev/bus/usb/002/005
It should belong to group
lxc-frigate-root
.
Prepare the container
-
Edit the container config (usually in
/etc/pve/lxc/<id>.conf
) to add these lines (adjust the path to match your USB bus):lxc.mount.entry: /dev/bus/usb dev/bus/usb none bind,create=dir lxc.cgroup2.devices.allow: c 189:* rwm
-
Configure frigate to use Coral USB detector. You can use the UI or edit the file
/config/config.yaml
:detectors: coral: type: edgetpu device: usb
Verify it works
-
Start the container with
pct start <id>
-
Open a shell to it with
pct enter <id>
-
Check the USB permissions:
ls -la /dev/bus/usb/002/005 crw-rw-r-- 1 nobody root 189, 132 Jul 23 12:25 /dev/bus/usb/002/005
Note that device
005
was mounted, and it belongs to grouproot
. If it belongs tonogroup
, then you had the group mapping wrong.Do not use
lsusb
to verify it works.lsusb
will list all USB devices of the host (even when run inside the container), even if they are not properly mounted in the container. -
Start frigate and check the logs:
[2024-07-23 12:19:09] frigate.detectors.plugins.edgetpu_tfl INFO : Attempting to load TPU as usb [2024-07-23 12:19:12] frigate.detectors.plugins.edgetpu_tfl INFO : TPU found
And I think that’s it. I hope you find it useful. Please do let me know if there is a mistake or missing info, I’ll add it.