Menjalankan Jellyfin di dalam LXC container pada Proxmox adalah cara yang populer dan efisien untuk membangun media server self-hosted. Namun ada satu error yang sering membuat frustasi pengguna homelab, terutama setelah upgrade hardware atau reboot sistem: Task ERROR: Device /dev/dri/card0 does not exist.
Error ini menyebabkan hardware transcoding di Jellyfin berhenti bekerja sepenuhnya karena LXC container tidak dapat menemukan GPU yang sudah di-passthrough. Artikel ini menjelaskan akar penyebab dan dua solusi permanen yang bisa diterapkan langsung di Proxmox host.
Mengapa Error Ini Terjadi? #
Saat Proxmox host melakukan boot, kernel Linux secara otomatis memuat sejumlah driver. Salah satunya adalah SimpleDRM (simpledrm), driver display generik yang digunakan kernel sebagai fallback untuk menampilkan output di layar selama fase awal boot, sebelum driver GPU yang sesungguhnya siap.
Inilah masalahnya: SimpleDRM mendaftarkan dirinya sebagai perangkat DRI sebelum driver GPU utama (seperti i915 untuk Intel atau amdgpu untuk AMD) sempat diinisialisasi. Hal ini membuat penomoran /dev/dri/card* menjadi tidak deterministik antar reboot:
- Boot pertama: GPU asli terdaftar sebagai
/dev/dri/card0, SimpleDRM sebagaicard1 - Boot berikutnya: urutan bisa terbalik, GPU asli menjadi
/dev/dri/card1
Karena konfigurasi LXC di-hardcode untuk menggunakan card0, setiap kali GPU asli mendarat di card1, container gagal menemukan perangkat tersebut dan memunculkan error.
Kondisi ini juga bisa dipicu oleh mati lampu mendadak. Saat host kembali menyala dan reboot, urutan inisialisasi driver tidak dijamin sama, sehingga path perangkat GPU bisa kembali dengan nomor yang berbeda dari sebelum mati lampu.
Solusi 1: Nonaktifkan SimpleDRM via Parameter Boot Kernel #
Solusi paling bersih dan permanen adalah menonaktifkan SimpleDRM menggunakan parameter boot kernel initcall_blacklist. Ini mencegah simpledrm diinisialisasi sama sekali, sehingga driver GPU asli selalu mendaftar lebih dulu dan mendapatkan nomor perangkat yang konsisten.
Pertama, tentukan bootloader mana yang digunakan Proxmox host kamu:
# Cek GRUB atau systemd-boot
efibootmgr -v | grep -i 'grub\|systemd'
# atau
ls /boot/grub /boot/efi/EFI/proxmox 2>/dev/nullJika Menggunakan GRUB #
Edit file konfigurasi GRUB di Proxmox host:
vi /etc/default/grubCari baris GRUB_CMDLINE_LINUX dan tambahkan parameter berikut di akhir nilai yang sudah ada:
GRUB_CMDLINE_LINUX="... initcall_blacklist=simpledrm_platform_driver_init"Contoh sebelum dan sesudah:
# Sebelum
GRUB_CMDLINE_LINUX="quiet"
# Sesudah
GRUB_CMDLINE_LINUX="quiet initcall_blacklist=simpledrm_platform_driver_init"Kemudian terapkan perubahan dan regenerasi konfigurasi GRUB:
update-grubJika Menggunakan systemd-boot #
Edit file kernel cmdline:
vi /etc/kernel/cmdlineTambahkan parameter di akhir baris yang sudah ada:
root=... quiet initcall_blacklist=simpledrm_platform_driver_initKemudian regenerasi konfigurasi boot menggunakan tool bawaan Proxmox:
proxmox-boot-tool refreshReboot Proxmox Host #
Setelah menyimpan perubahan dan merefresh konfigurasi boot, lakukan reboot penuh pada Proxmox host:
rebootSetelah host kembali online, verifikasi bahwa GPU terdaftar secara konsisten di card0:
ls -la /dev/dri/Hasilnya seharusnya sudah stabil, dan GPU asli kamu akan selalu muncul sebagai card0 mulai sekarang.
Efek Samping yang Perlu Diketahui #
Ada satu trade-off dengan pendekatan ini: teks splash saat boot tidak akan muncul setelah memilih kernel di menu bootloader. Ini karena SimpleDRM bertanggung jawab untuk merender output teks di layar selama fase boot awal, sebelum driver GPU penuh aktif.
Proxmox host sendiri akan tetap berjalan normal sepenuhnya. Kamu selalu bisa meninjau log boot dengan:
dmesg | less
# atau
journalctl -bUntuk setup homelab, ini jarang menjadi masalah karena hampir tidak pernah perlu melihat layar boot secara langsung.
Solusi 2: Buat Symlink GPU Stabil via udev Rule #
Jika kamu tidak ingin mengubah parameter boot kernel, alternatif lainnya adalah membuat udev rule yang menghasilkan symlink permanen untuk GPU, terlepas dari nomor card yang diberikan kernel pada setiap boot.
Pertama, cek vendor ID GPU kamu:
cat /sys/class/drm/card*/device/vendorVendor ID yang umum:
- Intel:
0x8086 - AMD:
0x1002 - NVIDIA:
0x10de
Kemudian buat file udev rule:
nano /etc/udev/rules.d/99-gpu.rulesTambahkan baris berikut, ganti vendor ID sesuai dengan milikmu:
SUBSYSTEM=="drm", KERNEL=="card*", ATTR{device/vendor}=="0x8086", SYMLINK+="dri/gpu0"Reload dan terapkan rule:
udevadm control --reload-rules
udevadm trigger
ls /dev/dri/Seharusnya sekarang muncul symlink gpu0 di /dev/dri/. Update konfigurasi LXC untuk menggunakannya:
nano /etc/pve/lxc/<CTID>.confGanti semua referensi ke card0 atau card1 dengan gpu0, contohnya:
dev0: /dev/dri/gpu0,gid=44Dengan pendekatan ini, symlink selalu menunjuk ke GPU asli kamu terlepas dari apakah kernel memberikan nomor card0 atau card1 pada boot tersebut.
Solusi Mana yang Sebaiknya Digunakan? #
Kedua solusi menyelesaikan masalah yang sama dari sudut pandang yang berbeda.
Solusi 1 (nonaktifkan SimpleDRM) adalah solusi yang lebih menyeluruh. Ini menghilangkan akar penyebab sepenuhnya dengan memastikan driver GPU asli selalu diinisialisasi lebih dulu. Satu-satunya kekurangan adalah hilangnya teks splash saat boot, yang bisa diterima untuk sebagian besar server homelab headless.
Solusi 2 (udev symlink) tidak mengubah urutan inisialisasi driver, namun menyediakan path perangkat yang stabil yang selalu menunjuk ke GPU asli. Ini pilihan yang baik jika kamu tidak ingin menyentuh parameter boot kernel, atau jika kamu menjalankan beberapa GPU dan butuh kontrol lebih detail atas perangkat mana yang digunakan setiap service.
Verifikasi Hardware Transcoding di Jellyfin #
Setelah menerapkan salah satu solusi dan memulai ulang Jellyfin LXC container, pastikan tidak ada error saat startup. Kemudian verifikasi dari dalam container:
# Masuk ke LXC container
pct enter <CTID>
# Cek bahwa perangkat GPU tersedia
ls -la /dev/dri/
# Cek aksesibilitas GPU
vainfo # untuk Intel VA-API
# atau
radeontop # untuk AMDDi dashboard Jellyfin, masuk ke Dashboard > Playback > Transcoding dan konfirmasi bahwa hardware acceleration aktif tanpa pesan error.
Ringkasan #
Error Task ERROR: Device /dev/dri/card0 does not exist di Jellyfin LXC pada Proxmox bukan disebabkan oleh konfigurasi LXC yang salah. Penyebabnya adalah kernel Linux memuat SimpleDRM sebelum driver GPU asli, sehingga penomoran perangkat /dev/dri/card* menjadi tidak konsisten antar reboot. Ini bisa terjadi pada reboot biasa maupun setelah mati lampu mendadak.
Dua solusi permanen tersedia. Pertama adalah menambahkan initcall_blacklist=simpledrm_platform_driver_init ke parameter boot kernel, yang memastikan GPU asli selalu terdaftar sebagai card0. Kedua adalah membuat udev rule yang menghasilkan symlink stabil /dev/dri/gpu0 yang menunjuk ke GPU asli, lalu memperbarui konfigurasi LXC untuk merujuk ke symlink tersebut.
Solusi ini awalnya dibagikan oleh komunitas di GitHub issue ProxmoxVE community-scripts #6270 dan telah dikonfirmasi bekerja pada berbagai setup GPU (Intel, AMD) di Proxmox.