From 5db3c3c74c40602d3333ffb223ebeb98c8a996d0 Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Sun, 8 Mar 2026 14:42:18 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20create=20/dev/nvidia*=20nodes=20in=20bee?= =?UTF-8?q?-nvidia=20=E2=80=94=20mdev=20has=20no=20NVIDIA=20rules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Alpine uses mdev which has no rules for NVIDIA devices. Without /dev/nvidiactl and /dev/nvidia{0-7}, nvidia-smi returns NVML_ERROR_LIBRARY_NOT_FOUND (exit 12) even though kernel modules are loaded and libraries are present. Fix: after insmod, read major numbers from /proc/devices and mknod the required character devices (/dev/nvidiactl, /dev/nvidia{0-7}, /dev/nvidia-uvm). Add /dev/nvidia* node checks to smoketest for earlier failure detection. Co-Authored-By: Claude Sonnet 4.6 --- iso/builder/smoketest.sh | 10 ++++++++++ iso/overlay/etc/init.d/bee-nvidia | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/iso/builder/smoketest.sh b/iso/builder/smoketest.sh index b3e0e57..028e6f0 100644 --- a/iso/builder/smoketest.sh +++ b/iso/builder/smoketest.sh @@ -62,6 +62,16 @@ for mod in nvidia nvidia_modeset nvidia_uvm; do fi done +echo "" +echo "-- NVIDIA device nodes --" +for dev in nvidiactl nvidia0 nvidia-uvm; do + if [ -e "/dev/$dev" ]; then + ok "/dev/$dev exists" + else + fail "/dev/$dev missing — nvidia-smi will return NVML_ERROR_LIBRARY_NOT_FOUND" + fi +done + echo "" echo "-- nvidia-smi --" if PATH="/usr/local/bin:$PATH" command -v nvidia-smi >/dev/null 2>&1; then diff --git a/iso/overlay/etc/init.d/bee-nvidia b/iso/overlay/etc/init.d/bee-nvidia index e6381d9..9f129ae 100755 --- a/iso/overlay/etc/init.d/bee-nvidia +++ b/iso/overlay/etc/init.d/bee-nvidia @@ -47,5 +47,26 @@ start() { fi done + # Create /dev/nvidia* device nodes — mdev on Alpine does not have NVIDIA rules, + # so the kernel hotplug events are not handled and nodes are never created. + # Without /dev/nvidiactl nvidia-smi returns NVML_ERROR_LIBRARY_NOT_FOUND (exit 12). + nvidia_major=$(grep -m1 ' nvidiactl$' /proc/devices 2>/dev/null | awk '{print $1}') + if [ -n "$nvidia_major" ]; then + mknod -m 666 /dev/nvidiactl c "$nvidia_major" 255 2>/dev/null || true + for i in 0 1 2 3 4 5 6 7; do + mknod -m 666 "/dev/nvidia$i" c "$nvidia_major" "$i" 2>/dev/null || true + done + einfo "created /dev/nvidiactl and /dev/nvidia{0-7} (major $nvidia_major)" + else + ewarn "/dev/nvidiactl: nvidia not in /proc/devices — no GPU hardware?" + fi + + uvm_major=$(grep -m1 ' nvidia-uvm$' /proc/devices 2>/dev/null | awk '{print $1}') + if [ -n "$uvm_major" ]; then + mknod -m 666 /dev/nvidia-uvm c "$uvm_major" 0 2>/dev/null || true + mknod -m 666 /dev/nvidia-uvm-tools c "$uvm_major" 1 2>/dev/null || true + einfo "created /dev/nvidia-uvm (major $uvm_major)" + fi + eend 0 }