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 }