nixos/nvidia: use nvidia-modprobe to create device nodes

Use the native helper to handle existing nodes and driver device-file parameters, including stale UVM major numbers. Create the reverse-link directory before the module add handlers, keep GPU minor enumeration, and do not recreate nodes on remove events. Backport the independently prepared helper fix for concurrent device creation.

Assisted-by: OpenAI Codex (gpt-6.1-sol)
This commit is contained in:
ooonea
2026-10-15 22:08:05 +02:00
parent c1bcd60026
commit 07880405bb
2 changed files with 14 additions and 6 deletions

View File

@@ -456,12 +456,12 @@ in
"L+ /run/nvidia-docker/bin - - - - ${nvidia_x11.bin}/origBin"
];
services.udev.extraRules = ''
# Create /dev/nvidia-uvm when the nvidia-uvm module is loaded.
KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidiactl c 195 255'"
KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'for i in $$(cat /proc/driver/nvidia/gpus/*/information | grep Minor | cut -d \ -f 4); do mknod -m 666 /dev/nvidia$${i} c 195 $${i}; done'"
KERNEL=="nvidia_modeset", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-modeset c 195 254'"
KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 0'"
KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm-tools c $$(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 1'"
# nvidia-modprobe honors the driver's device-file parameters.
ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvidia|nvidia_modeset|nvidia_uvm", RUN+="${pkgs.coreutils}/bin/mkdir -m 755 -p /dev/char"
ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvidia", RUN+="${pkgs.nvidia-modprobe}/bin/nvidia-modprobe -c 255"
ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'for i in $$(cat /proc/driver/nvidia/gpus/*/information | grep Minor | cut -d \ -f 4); do ${pkgs.nvidia-modprobe}/bin/nvidia-modprobe -c $${i} || exit; done'"
ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvidia_modeset", RUN+="${pkgs.nvidia-modprobe}/bin/nvidia-modprobe -m"
ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvidia_uvm", RUN+="${pkgs.nvidia-modprobe}/bin/nvidia-modprobe -u -c 0"
'';
hardware.graphics =
let

View File

@@ -2,6 +2,7 @@
stdenv,
lib,
fetchFromGitHub,
fetchpatch,
gnum4,
}:
stdenv.mkDerivation (finalAttrs: {
@@ -15,6 +16,13 @@ stdenv.mkDerivation (finalAttrs: {
hash = "sha256-XVWvnUZkEqEh3UjPIU6DaZuYU9DvjfIMsWbLJ78jJWs=";
};
patches = [
(fetchpatch {
url = "https://github.com/ooonea/nvidia-modprobe/commit/450f0c15ad9229fe5f4d3f80ae4d95e42d9c038e.patch";
hash = "sha256-SKJqt2MJDQxzRnfGcgB9oJHyt6Rwrm4hLh9zgIPEv/0=";
})
];
nativeBuildInputs = [ gnum4 ];
postPatch = ''