N150 iGPU Passthrough

This is not a real solution imho but rather dangerous:



For more informations see also: https://pve.proxmox.com/wiki/Linux_Container#_security_considerations

There might be cases where you would need to run a container as privileged because otherwise it won't work, this however is none of them since somebody else already managed to solve this problem with a unprivileged container:
I appreciate to reply and understand the risk. I was having challenges on a previous unprivileged install and it's my first time using jellyfin so wanted to try getting it working to see how I like jellyfin before trouble shooting. I believe my issues were setting selections and not upgrading the kernal.

I plan to convert it to unprivileged this weekend
 
  • Like
Reactions: Johannes S
I appreciate to reply and understand the risk. I was having challenges on a previous unprivileged install and it's my first time using jellyfin so wanted to try getting it working to see how I like jellyfin before trouble shooting. I believe my issues were setting selections and not upgrading the kernal.

I plan to convert it to unprivileged this weekend
How'd that go? Unprivileged is more secure but can be a real hassle with some software
 
Hello everyone,
no luck on my side, is someone able to help ? just bought the Soyo M4 Pro...

Thanks a lot.
I just got my soyo m2 plus this morning and couldn't even get pve installed. Returning because even though I'm sure I'll figure it out, the fan noise is awful and doesn't give me confidence in the cooling capacity. Did you have to do anything special to get pve to install and boot? Installing messed up the EFI badly I think.

Anyway, N150 should need less cooling so I'm hopeful for my gmktek coming tomorrow morning.
 
Absolute newbie here (1 month of using proxmox) and this is my first post to proxmox forum as well.

I've been trying to get hardware acceleration up and running for days and seem to have made progress so thought I would add my two cents here. I have spent days going in circles with chatGPT on this one.

Using a GMKTEC G3 Plus (N150)
Created a virtual machine:
1761034871021.png

and installed ubuntu server (Ubuntu 25.10 (GNU/Linux 6.17.0-5-generic x86_64)) on my proxmox as a VM.

Step 1: Confirm Your GPU and Host Setup
On your Proxmox host, run:
lspci | grep -i vga

you should see something like:
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]

Check the kernel module:
lsmod | grep i915
and the device nodes:
ls -l /dev/dri

You should see /dev/dri/card0 and /dev/dri/renderD128.

Step 2: Enable IOMMU on the Host
Edit your GRUB configuration:
nano /etc/default/grub

Find the line:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
modify it to
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"


Step 3: Verify IOMMU
After reboot, confirm it’s enabled:
dmesg | grep -e DMAR -e IOMMU
You should see lines like:
DMAR: IOMMU enabled

Step 4: Add GPU to the VM
In the Proxmox Web UI:
Select your Ubuntu VM.
Go to Hardware → Add → PCI Device.
Choose your GPU (Intel Corporation Alder Lake-N ...).
Tick all:
All Functions
Primary GPU (optional)
ROM-Bar (usually fine)\
PCI-Express
Click Add, then Start the VM.

1761034881198.png
PCI Device now is present

Step 5: Check GPU Inside the VM
SSH into your Ubuntu 25.10 VM, then run:
lspci | grep -i vga
You should see the Intel GPU listed.
ls /dev/dri
You should see card0 and renderD128.

Step 6: Install Intel Drivers and VAAPI Support
sudo apt update
sudo apt install -y intel-media-va-driver-non-free vainfo vdpauinfo

Step 7: Give your user permission to access the GPU
On VM run:
sudo usermod -aG video,render [B][YOURUSERNAME][/B]
e.g
sudo usermod -aG video,render joseph

then reboot the VM and check
groups
it should show render.

Step 8: I never got here before
After that, try:
vainfo --display drm --device /dev/dri/renderD128
Expect something like:
1761035944903.png

Step 9: Jellyfin Docker
I then used this as my docker-compose:
YAML:
services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    network_mode: bridge

    # GPU passthrough
    devices:
      - /dev/dri:/dev/dri

    # Match host's render GID (992)
    group_add:
      - "992"

    # Run as your user (UID 1000)
    user: "1000:1000"

    volumes:
      - /srv/jellyfin/config:/config
      - /srv/jellyfin/cache:/cache
      - /mnt/media:/media

    environment:
      - TZ=Asia/Kuala_Lumpur
      - PUID=1000
      - PGID=1000
      - JELLYFIN_PublishedServerUrl=http://192.168.20.54  # change to your VM IP

    ports:
      - 8096:8096
      - 8920:8920

I can't seem to get intel_gpu_top working which chatGPT says is normal for passed through devices like this?
I get this in Jellyfin playing a 4k video in browser from main pc
1761035672553.png

and I get this in htop
1761035729864.png

1761035770799.png
With tone mapping enabled.

This is the farthest I've got in the past week I've been trying to do this. Previously I always got stuck at this section 8.

Is anyone able to confirm that this means hardware transcoding is working?

I'm surprised it is running at around 40% cpu but maybe I was expecting too much?

Hope this is helpful to anyone else in a similar position.
 
Last edited:
  • Like
Reactions: skal