I've prepared a small program to help debugging whether setuid binaries work on your system:
===== test-setuid.c ===== #include <unistd.h> #include <sys/types.h> #include <stdio.h> int main() { printf("getuid() = %ld\n", (long)getuid()); printf("geteuid() = %ld\n", (long)geteuid()); printf("getgid() = %ld\n", (long)getgid()); printf("getegid() = %ld\n", (long)getegid()); } ========================= 1) compile $ gcc -o test-setuid test-setuid.c 2) try it as user: $ ./test-setuid getuid() = 1000 geteuid() = 1000 getgid() = 1000 getegid() = 1000 Your UID/GID could be different ... 3) try it as root: $ sudo ./test-setuid getuid() = 0 geteuid() = 0 getgid() = 0 getegid() = 0 4) install it as setuid root binary to /usr/bin (to be at the same location as nvidia-modprobe) $ sudo cp test-setuid /usr/bin/test-setuid $ sudo chown root:root /usr/bin/test-setuid $ sudo chmod u+s /usr/bin/test-setuid $ ls -la /usr/bin/test-setuid -rwsr-xr-x 1 root root 8848 Feb 5 09:13 /usr/bin/test-setuid 5) run as user $ /usr/bin/test-setuid getuid() = 1000 geteuid() = 0 getgid() = 1000 getegid() = 1000 If this works, geteuid() should return 0 6) cleanup $ sudo rm /usr/bin/test-setuid You could repeat steps 4-6 with different locations (e.g. on different filesystems). For example /run/user/<YOURUID> which should be a tmpfs mounted with option nosuid - there it shouldn't work. Andreas