{"id":23160682,"url":"https://github.com/sbarbett/igpu-passthrough","last_synced_at":"2026-01-15T23:02:46.662Z","repository":{"id":268469785,"uuid":"877094727","full_name":"sbarbett/igpu-passthrough","owner":"sbarbett","description":"Steps to set up Intel QSV passthrough on a Proxmox LXC and Docker ","archived":false,"fork":false,"pushed_at":"2024-12-16T23:56:35.000Z","size":461,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-04T19:23:13.699Z","etag":null,"topics":["intel-qsv","jellyfin","proxmox-ve","sysadmin-tasks"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sbarbett.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-23T04:36:33.000Z","updated_at":"2024-12-16T23:56:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"7384b175-1045-4be5-bae9-c9a39c8b6ac0","html_url":"https://github.com/sbarbett/igpu-passthrough","commit_stats":null,"previous_names":["sbarbett/igpu-passthrough"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sbarbett/igpu-passthrough","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sbarbett%2Figpu-passthrough","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sbarbett%2Figpu-passthrough/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sbarbett%2Figpu-passthrough/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sbarbett%2Figpu-passthrough/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sbarbett","download_url":"https://codeload.github.com/sbarbett/igpu-passthrough/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sbarbett%2Figpu-passthrough/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28473974,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T22:27:41.514Z","status":"ssl_error","status_checked_at":"2026-01-15T21:54:47.910Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["intel-qsv","jellyfin","proxmox-ve","sysadmin-tasks"],"created_at":"2024-12-17T23:11:49.923Z","updated_at":"2026-01-15T23:02:46.643Z","avatar_url":"https://github.com/sbarbett.png","language":null,"readme":"# igpu-passthrough\n\nIntel processors have a video transcoding feaure called [Intel Quick Sync Video](https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video). This is a dedicated hardware core for processing video files. It has integrated logic for handling various video codecs and converting them for use on different types of clients. This is notably convenient for Jellyfin, which has inbuilt settings that will make use of this feature.\n\n## Device Driver\n\nMost Linux systems _should_ automatically detect this driver, I imagine, but my only anecdotal experience is through Debian. It's will show up under `/dev/dri`.\n\n```sh\ndemo@pve:~$ ls -l /dev/dri\ntotal 0\ndrwxr-xr-x 2 root root         80 Oct 20 09:37 by-path\ncrw-rw---- 1 root video  226,   0 Oct 20 09:37 card0\ncrw-rw---- 1 root render 226, 128 Oct 20 09:37 renderD128\ndemo@pve:~$ getent group video\nvideo:x:44:\ndemo@pve:~$ getent group render\nrender:x:104:\n```\n\n## Passthrough to LXC\n\nOn Proxmox you can pass this driver through to your LXC by adding it to the LXC configuration file under `/etc/pve/lxc/xxx.conf` where `xxx` is the ID of your container.\n\n```sh\ndev0: /dev/dri/card0,gid=44,uid=0\ndev1: /dev/dri/renderD128,gid=105,uid=0\n```\n\nRestart the LXC using `pct`.\n\n```sh\nsudo pct stop xxx\nsudo pct start xxx\n```\n\nThe device should now show up when you ssh into your container.\n\n```sh\ndemo@jellyfin:~$ ls /dev\nconsole  dri  full       initctl  mqueue  ptmx  random  stderr  stdout  tty1  urandom\ncore     fd   hugepages  log      null    pts   shm     stdin   tty     tty2  zero\ndemo@jellyfin:~$ ls /dev/dri\ncard0  renderD128\n```\n\n## Passthrough to Docker\n\nSince I have Jellyfin running inside Docker on my LXC, the driver needs to be passed through to this container as well. In my Docker compose file I added the following under `devices`.\n\n```yaml\nservices:\n  jellyfin:\n    image: jellyfin/jellyfin:latest\n    container_name: jellyfin\n    network_mode: \"host\"\n    devices:\n      - '/dev/dri:/dev/dri'\n```\n\nYou can now see the device inside of the container.\n\n```sh\ndemo@jellyfin:~/jellyfin$ sudo docker exec -it jellyfin /bin/bash\nroot@jellyfin:/# ls /dev\ncore  dri  fd  full  mqueue  null  ptmx  pts  random  shm  stderr  stdin  stdout  tty  urandom  zero\nroot@jellyfin:/# \n```\n\n## Jellyfin Settings\n\nIntel Quick Sync (\"QSV\") is enabled in Jellyfin by going to the administrative dashboard then clicking on **Playback** and selecting the **Transcoding** sub-menu.\n\n![Jellyfin transcoding interface](./img/ss1.png)\n\n12th gen or higher Intel CPUs will support all of the codecs listed here.\n\n![Encoding options](./img/ss3.png)\n\nI enabled hardware encoding for HVEC and AV1. AV1 was needed for my Tvheadend stream. 11th gen CPUs do not support AV1 encoding.\n\n![Trickplay options](./img/ss4.png)\n\nToggle on these options under **Trickplay**, it's for thumbnail generation.\n\n## Monitoring\n\nYou can install `intel-gpu-top` on your Jellyfin LXC and watch its performance and to confirm that the iGPU is being used for transcoding.\n\n![intel-gpu-top and htop](./img/ss2.png)\n\n_Note:_ In order for `intel-gpu-top` to work inside the LXC you need to set the kernel paranoia level to 0 on the host.\n\n```sh\nsudo sysctl kernel.perf_event_paranoid=0\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsbarbett%2Figpu-passthrough","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsbarbett%2Figpu-passthrough","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsbarbett%2Figpu-passthrough/lists"}