From 71031dccd8943a9c5cf41511d191a8ac66ffa8c2 Mon Sep 17 00:00:00 2001 From: Don Williams Date: Thu, 5 Feb 2026 02:22:36 -0500 Subject: [PATCH] Updated `nvidia.sh` to opt install proprietary/open drivers Added HOWTO guide on using script Renamed original `nvidia.sh` script just in case On branch development Your branch is up to date with 'origin/development'. Changes to be committed: modified: CHANGELOG.md new file: HOWTO-Install-NVIDIA-drivers-in-Debian.md new file: install-scripts/nvidia-ori.sh modified: install-scripts/nvidia.sh --- CHANGELOG.md | 11 + HOWTO-Install-NVIDIA-drivers-in-Debian.md | 157 ++++++++ install-scripts/nvidia-ori.sh | 109 ++++++ install-scripts/nvidia.sh | 414 +++++++++++++++++++--- 4 files changed, 644 insertions(+), 47 deletions(-) create mode 100644 HOWTO-Install-NVIDIA-drivers-in-Debian.md create mode 100755 install-scripts/nvidia-ori.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 776dfb0..c78aa19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ ## CHANGELOG +## 05 February 2026 + +- Updated `nvidia.sh` + - Options to install: + - Debian drivers (older NVIDIA GPUs) + - For more recent NVIDIA GPUs + - NVIDIA propriertary drivers + - NVIDIA open drivers + - You can switch between them later + - Read `HOWTO-Install-NVIDIA-Drivers-in-Debian.md` + ## 04 February 2026 - Updated Hyprland to current revision diff --git a/HOWTO-Install-NVIDIA-drivers-in-Debian.md b/HOWTO-Install-NVIDIA-drivers-in-Debian.md new file mode 100644 index 0000000..1ad4411 --- /dev/null +++ b/HOWTO-Install-NVIDIA-drivers-in-Debian.md @@ -0,0 +1,157 @@ +# HOWTO: Install NVIDIA drivers on Debian 13+/testing/unstable + +This guide explains how to install and maintain NVIDIA GPU drivers on Debian 13 (trixie), testing, and unstable using `install-scripts/nvidia.sh`. + +Supported scope + +- Debian 13 (trixie), Debian testing, Debian unstable. +- Current-generation NVIDIA GPUs are best served by NVIDIA’s own repository (cuda-drivers or nvidia-open). Avoid Debian’s `nvidia-driver` for new cards. + +Quick start + +```bash +# Interactive (recommended first run) +install-scripts/nvidia.sh + +# Install from NVIDIA CUDA repo (proprietary) +install-scripts/nvidia.sh --mode=nvidia + +# Install from NVIDIA CUDA repo (open kernel modules) +install-scripts/nvidia.sh --mode=open + +# Install Debian-packaged drivers (older; not recommended for new GPUs) +install-scripts/nvidia.sh --mode=debian +``` + +## What the script does + +- Detects your GPU (prefers `nvidia-smi`, falls back to `lspci`). +- Offers three installation paths (see below). +- For NVIDIA repo paths: + - Ensures the CUDA APT repo/keyring for Debian 13 is configured (idempotent). + - Installs the selected meta package: `cuda-drivers` (proprietary) or `nvidia-open` (open kernel modules). +- Adds kernel parameters to blacklist nouveau and enable DRM KMS, updates GRUB, and updates initramfs. +- Runs a post-install verification (driver source, module loaded, `nvidia-smi`/OpenGL summary). +- Prints an end-of-run summary of changes. + +## Options and when to use them + +- NVIDIA CUDA repo — proprietary (`--mode=nvidia`) + - Installs `cuda-drivers` from NVIDIA’s APT repo. Best compatibility and newest drivers; recommended for RTX 30/40/50 series. +- NVIDIA CUDA repo — open kernel modules (`--mode=open`) + - Installs `nvidia-open` from NVIDIA’s APT repo. Uses the open-source kernel modules. Consider this if you prefer open modules and your GPU is supported. +- Debian repo — packaged by Debian (`--mode=debian`) + - Installs `nvidia-driver` and related packages from Debian. Typically older; acceptable for older GPUs, not recommended for current-generation cards. + +## Important warnings shown by the script + +When run interactively, the script displays this notice: + +``` +[WARN] Default installs Debian repo NVIDIA drivers (often older). +[WARN] NVIDIA driver options are currently in development. +[WARN] If you have a current‑generation NVIDIA GPU, do NOT use Debian-based drivers. + Choose an NVIDIA CUDA repo option below, or install drivers manually and re-run the Debian Hyprland install. +[ACTION] Choose installation source: + [D] Debian repo (default) — installs nvidia-driver and related pkgs + [N] NVIDIA CUDA repo — installs cuda-drivers (proprietary) + [O] NVIDIA CUDA repo — installs nvidia-open (open kernel modules) +Select [D/n/o]: _ +``` + +## Non-interactive flags + +- `--mode=debian|nvidia|open` Selects installation path. +- `--switch` Switch from your current variant to the target mode (removes conflicting meta-packages). +- `--force` Don’t exit early if already configured; re-run installs. +- `-n, --dry-run` Simulate actions (uses `apt-get -s`, prints changes without applying). +- `-h, --help` Show usage, options, and examples. + +Examples + +```bash +# Switch from Debian-packaged driver to proprietary CUDA repo driver +install-scripts/nvidia.sh --mode=nvidia --switch + +# Re-run Debian path even if already configured +install-scripts/nvidia.sh --mode=debian --force + +# Dry-run the open-kernel flow without making changes +install-scripts/nvidia.sh --mode=open --dry-run +``` + +## Sample outputs + +GPU detection + +``` +[INFO] Detecting NVIDIA GPU... +[OK] Detected (nvidia-smi): NVIDIA GeForce RTX 3050, 590.48.01 +``` + +(If drivers are not yet loaded, it falls back to `lspci` output.) + +Post-install verification + +``` +[INFO] Verifying NVIDIA installation... +[OK] Driver source detected: proprietary (NVIDIA CUDA repo) +[INFO] Kernel module loaded: yes +[OK] nvidia-smi: NVIDIA GeForce RTX 3050, 590.48.01 +[INFO] OpenGL summary: +OpenGL vendor string: NVIDIA Corporation +OpenGL renderer string: NVIDIA GeForce RTX 3050/PCIe/SSE2 +OpenGL core profile version string: 4.6.0 NVIDIA 590.48.01 +``` + +End-of-run summary + +``` +[OK] No changes made. +``` + +Or, when changes occurred: + +``` +[OK] Changes applied: + - configured NVIDIA CUDA repo (debian13) + - apt install: cuda-drivers + - updated GRUB_CMDLINE_LINUX in /etc/default/grub + - update-grub + - update-initramfs -u +``` + +Early exit when re-running + +``` +[OK] NVIDIA is already configured for mode: nvidia +[INFO] Use --force to re-run installs, or --switch to change variants. +``` + +## What gets changed on your system + +- APT: Adds/uses NVIDIA’s CUDA repo (Debian 13 path) via `cuda-keyring` (only if missing). +- GRUB: Appends `rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1 rcutree.rcu_idle_gp_delay=1` to `GRUB_CMDLINE_LINUX` and runs `update-grub`. +- Modules: Ensures `nvidia nvidia_modeset nvidia_uvm nvidia_drm` are added to `/etc/initramfs-tools/modules`, then runs `update-initramfs -u`. + +All changes are idempotent; re-running won’t duplicate entries. The script prints a clear summary of what, if anything, changed. + +## Troubleshooting + +- Reboot required: After installing drivers, a reboot is often needed for the `nvidia` kernel module to load. +- `nvidia-smi` missing: If `nvidia-smi` isn’t found right away, ensure the installation completed and reboot. +- Switching variants: Use `--switch` with `--mode=...` to change between Debian, proprietary CUDA, and open kernel module variants; the script removes conflicting meta-packages first. + +## Uninstall / switching notes + +The meta-packages are mutually exclusive per variant: + +- Debian: `nvidia-driver` +- Proprietary CUDA: `cuda-drivers` +- Open modules: `nvidia-open` + +When switching, the script purges the conflicting meta-packages and runs `apt autoremove` before installing the target. + +--- + +If you prefer to install drivers manually (outside the script), do so first, then re-run the Debian Hyprland installer, say `No` to installing NVIDIA, to continue with the rest of the setup. diff --git a/install-scripts/nvidia-ori.sh b/install-scripts/nvidia-ori.sh new file mode 100755 index 0000000..534b0eb --- /dev/null +++ b/install-scripts/nvidia-ori.sh @@ -0,0 +1,109 @@ +#!/bin/bash +# 💫 https://github.com/JaKooLit 💫 # +# Nvidia - Check Readme for more details for the drivers # +# UBUNTU USERS, FOLLOW README! + +nvidia_pkg=( + nvidia-driver + firmware-misc-nonfree + nvidia-kernel-dkms + linux-headers-$(uname -r) + libnvidia-egl-wayland1 + libva-wayland2 + libnvidia-egl-wayland1 + nvidia-vaapi-driver +) + +## WARNING: DO NOT EDIT BEYOND THIS LINE IF YOU DON'T KNOW WHAT YOU ARE DOING! ## +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# Change the working directory to the parent directory of the script +PARENT_DIR="$SCRIPT_DIR/.." +cd "$PARENT_DIR" || { echo "${ERROR} Failed to change directory to $PARENT_DIR"; exit 1; } + +# Source the global functions script +if ! source "$(dirname "$(readlink -f "$0")")/Global_functions.sh"; then + echo "Failed to source Global_functions.sh" + exit 1 +fi + +# Set the name of the log file to include the current date and time +LOG="Install-Logs/install-$(date +%d-%H%M%S)_nvidia.log" +MLOG="install-$(date +%d-%H%M%S)_nvidia2.log" + +## adding the deb source for nvidia driver +# Create a backup of the sources.list file +sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 2>&1 | tee -a "$LOG" + +## UBUNTU - NVIDIA (comment this two by adding # you dont need this!) +# Add the comment and repository entry to sources.list +echo "## for nvidia" | sudo tee -a /etc/apt/sources.list 2>&1 | tee -a "$LOG" +echo "deb http://deb.debian.org/debian/ trixie main contrib non-free non-free-firmware" | sudo tee -a /etc/apt/sources.list 2>&1 | tee -a "$LOG" + +# Update the package list +sudo apt update + +# Function to add a value to a configuration file if not present +add_to_file() { + local config_file="$1" + local value="$2" + + if ! sudo grep -q "$value" "$config_file"; then + echo "Adding $value to $config_file" + sudo sh -c "echo '$value' >> '$config_file'" + else + echo "$value is already present in $config_file." + fi +} + +# Install additional Nvidia packages +printf "${YELLOW} Installing ${SKY_BLUE}Nvidia packages${RESET} ...\n" + for NVIDIA in "${nvidia_pkg[@]}"; do + install_package "$NVIDIA" "$LOG" + done + +# adding additional nvidia-stuff +printf "${YELLOW} adding ${SKY_BLUE}nvidia-stuff${RESET} to /etc/default/grub..." + + # Additional options to add to GRUB_CMDLINE_LINUX + additional_options="rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1 rcutree.rcu_idle_gp_delay=1" + + # Check if additional options are already present in GRUB_CMDLINE_LINUX + if grep -q "GRUB_CMDLINE_LINUX.*$additional_options" /etc/default/grub; then + echo "GRUB_CMDLINE_LINUX already contains the additional options" + else + # Append the additional options to GRUB_CMDLINE_LINUX + sudo sed -i "s/GRUB_CMDLINE_LINUX=\"/GRUB_CMDLINE_LINUX=\"$additional_options /" /etc/default/grub + echo "Added the additional options to GRUB_CMDLINE_LINUX" + fi + + # Update GRUB configuration + sudo update-grub 2>&1 | tee -a "$LOG" + + # Define the configuration file and the line to add + config_file="/etc/modprobe.d/nvidia.conf" + line_to_add=""" + options nvidia-drm modeset=1 fbdev=1 + options nvidia NVreg_PreserveVideoMemoryAllocations=1 + """ + + # Check if the config file exists + if [ ! -e "$config_file" ]; then + echo "Creating $config_file" + sudo touch "$config_file" 2>&1 | tee -a "$LOG" + fi + + add_to_file "$config_file" "$line_to_add" + + # Add NVIDIA modules to initramfs configuration + modules_to_add="nvidia nvidia_modeset nvidia_uvm nvidia_drm" + modules_file="/etc/initramfs-tools/modules" + + if [ -e "$modules_file" ]; then + add_to_file "$modules_file" "$modules_to_add" 2>&1 | tee -a "$LOG" + sudo update-initramfs -u 2>&1 | tee -a "$LOG" + else + echo "Modules file ($modules_file) not found." 2>&1 | tee -a "$LOG" + fi + +printf "\n%.0s" {1..2} diff --git a/install-scripts/nvidia.sh b/install-scripts/nvidia.sh index 534b0eb..b624478 100755 --- a/install-scripts/nvidia.sh +++ b/install-scripts/nvidia.sh @@ -3,6 +3,12 @@ # Nvidia - Check Readme for more details for the drivers # # UBUNTU USERS, FOLLOW README! +set -euo pipefail + +DRY_RUN=0 +CHANGES=() + +# Default Debian repo packages (can be older than NVIDIA repo) nvidia_pkg=( nvidia-driver firmware-misc-nonfree @@ -31,79 +37,393 @@ fi LOG="Install-Logs/install-$(date +%d-%H%M%S)_nvidia.log" MLOG="install-$(date +%d-%H%M%S)_nvidia2.log" -## adding the deb source for nvidia driver -# Create a backup of the sources.list file -sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 2>&1 | tee -a "$LOG" +# ---------------- helpers ---------------- +run_cmd() { + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY-RUN] $*" + else + eval "$@" + fi +} -## UBUNTU - NVIDIA (comment this two by adding # you dont need this!) -# Add the comment and repository entry to sources.list -echo "## for nvidia" | sudo tee -a /etc/apt/sources.list 2>&1 | tee -a "$LOG" -echo "deb http://deb.debian.org/debian/ trixie main contrib non-free non-free-firmware" | sudo tee -a /etc/apt/sources.list 2>&1 | tee -a "$LOG" +record_change() { + # $1: message + if [ "$DRY_RUN" -eq 0 ]; then + CHANGES+=("$1") + fi +} -# Update the package list -sudo apt update +_which() { command -v "$1" >/dev/null 2>&1; } +_detect_cuda_suite() { + # We only support Debian 13+; use debian13 path for testing/unstable as well + local codename + codename=$(. /etc/os-release; echo "${DEBIAN_CODENAME:-${VERSION_CODENAME:-}}") + case "$codename" in + trixie|sid) echo "debian13" ;; + *) echo "debian13" ;; + esac +} + +detect_variant() { + if dpkg -l | grep -q -E '^ii\s+nvidia-open\b'; then echo open; return; fi + if dpkg -l | grep -q -E '^ii\s+cuda-drivers\b'; then echo nvidia; return; fi + if dpkg -l | grep -q -E '^ii\s+nvidia-driver\b'; then echo debian; return; fi + echo none +} + +_apt_update_once() { + echo -e "${INFO} Refreshing APT package lists..." + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY-RUN] sudo apt update" + else + sudo apt update 2>&1 | tee -a "$LOG" + fi +} + +apt_install() { + # pass packages as args + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY-RUN] sudo apt-get -s install -y $*" + sudo apt-get -s install -y "$@" >/dev/null || true + else + sudo apt install -y "$@" 2>&1 | tee -a "$LOG" + record_change "apt install: $*" + fi +} + +apt_remove() { + # pass packages as args + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY-RUN] sudo apt-get -s remove --purge -y $*" + sudo apt-get -s remove --purge -y "$@" >/dev/null || true + else + sudo apt remove --purge -y "$@" 2>&1 | tee -a "$LOG" || true + sudo apt autoremove -y 2>&1 | tee -a "$LOG" || true + record_change "apt remove --purge: $*" + fi +} + +remove_conflicting_for_target() { + local target="$1" + case "$target" in + nvidia) apt_remove nvidia-open nvidia-driver ;; + open) apt_remove cuda-drivers nvidia-driver ;; + debian) apt_remove cuda-drivers nvidia-open ;; + esac +} + +_install_via_debian() { + echo -e "${INFO} Using Debian repo packages (may be older on testing/unstable)." + _apt_update_once + printf "${YELLOW} Installing ${SKY_BLUE}NVIDIA packages from Debian${RESET} ...\n" + for NVIDIA in "${nvidia_pkg[@]}"; do + apt_install "$NVIDIA" + done +} + +_install_via_nvidia_repo_with() { + # $1: package to install from NVIDIA repo (e.g., cuda-drivers or nvidia-open) + local package="$1" + local suite pkg url + suite=$(_detect_cuda_suite) + pkg="cuda-keyring_1.1-1_all.deb" + url="https://developer.download.nvidia.com/compute/cuda/repos/${suite}/x86_64/${pkg}" + + echo -e "${INFO} Ensuring NVIDIA CUDA repo for ${YELLOW}${suite}${RESET} is configured ..." | tee -a "$LOG" + + # Skip keyring install if already present + if dpkg -s cuda-keyring >/dev/null 2>&1 || [ -f "/etc/apt/sources.list.d/cuda-${suite}-x86_64.sources" ]; then + echo -e "${OK} NVIDIA CUDA repo already configured." | tee -a "$LOG" + else + rm -f "$pkg" + if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY-RUN] wget -q '$url' -O '$pkg'" + else + if ! wget -q "$url" -O "$pkg"; then + echo -e "${ERROR} Failed to download $pkg from $url" | tee -a "$LOG" + return 1 + fi + fi + run_cmd "sudo dpkg -i '$pkg' 2>&1 | tee -a '$LOG'" + record_change "configured NVIDIA CUDA repo (${suite})" + _apt_update_once + fi + + echo -e "${INFO} Installing ${YELLOW}${package}${RESET} from NVIDIA repo ..." | tee -a "$LOG" + apt_install "${package}" +} + +_install_via_nvidia_repo() { + _install_via_nvidia_repo_with "cuda-drivers" +} + +_install_via_nvidia_open() { + _install_via_nvidia_repo_with "nvidia-open" +} + +_prompt_for_mode() { + local mode_input="" + echo + echo -e "${WARN} Default installs ${YELLOW}Debian repo NVIDIA drivers${RESET} (often older)." + echo -e "${WARN} ${YELLOW}NVIDIA driver options are currently in development${RESET}." + echo -e "${WARN} If you have a current‑generation NVIDIA GPU, ${YELLOW}do NOT use Debian-based drivers${RESET}." + echo -e " Choose an NVIDIA CUDA repo option below, or install drivers manually and re-run the Debian Hyprland install." + echo -e "${CAT} Choose installation source:" + echo -e " [D] Debian repo (default) — installs ${YELLOW}nvidia-driver${RESET} and related pkgs" + echo -e " [N] NVIDIA CUDA repo — installs ${YELLOW}cuda-drivers${RESET} (proprietary)" + echo -e " [O] NVIDIA CUDA repo — installs ${YELLOW}nvidia-open${RESET} (open kernel modules)" + read -r -p "Select [D/n/o]: " mode_input || true + case "${mode_input,,}" in + o|open) echo "open" ;; + n|nv|nvidia) echo "nvidia" ;; + d|""|*) echo "debian" ;; + esac +} + +print_header() { + echo -e "${INFO} NVIDIA driver setup (Debian 13+/testing/unstable supported)" \ + "\n${INFO} Logs: ${YELLOW}$LOG${RESET}" +} + +print_gpu_info() { + echo -e "${INFO} Detecting NVIDIA GPU..." + if _which nvidia-smi; then + local line + line=$(nvidia-smi --query-gpu=name,driver_version --format=csv,noheader 2>/dev/null | head -n1 || true) + if [ -n "$line" ]; then + echo -e "${OK} Detected (nvidia-smi): ${YELLOW}$line${RESET}" + return + fi + fi + if _which lspci; then + local l + l=$(lspci -nnk | awk '/VGA|3D|Display/ && /NVIDIA/ {print; getline; print}' | head -n2) + if [ -n "$l" ]; then + echo -e "${OK} Detected (lspci):\n${YELLOW}$l${RESET}" + return + fi + fi + echo -e "${NOTE} Could not positively identify an NVIDIA GPU (drivers may not be loaded yet)." +} + +print_usage() { + cat <> '$config_file'" + if ! sudo grep -q "$value" "$config_file" 2>/dev/null; then + echo "Adding $value to $config_file" | tee -a "$LOG" + run_cmd "sudo sh -c 'echo \"$value\" >> \"$config_file\"'" + record_change "appended to $config_file" else - echo "$value is already present in $config_file." + echo "$value is already present in $config_file." | tee -a "$LOG" fi } -# Install additional Nvidia packages -printf "${YELLOW} Installing ${SKY_BLUE}Nvidia packages${RESET} ...\n" - for NVIDIA in "${nvidia_pkg[@]}"; do - install_package "$NVIDIA" "$LOG" - done - -# adding additional nvidia-stuff -printf "${YELLOW} adding ${SKY_BLUE}nvidia-stuff${RESET} to /etc/default/grub..." +printf "${YELLOW} Applying ${SKY_BLUE}NVIDIA boot/module settings${RESET} ...\n" # Additional options to add to GRUB_CMDLINE_LINUX additional_options="rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1 rcutree.rcu_idle_gp_delay=1" # Check if additional options are already present in GRUB_CMDLINE_LINUX - if grep -q "GRUB_CMDLINE_LINUX.*$additional_options" /etc/default/grub; then - echo "GRUB_CMDLINE_LINUX already contains the additional options" + if grep -q "GRUB_CMDLINE_LINUX.*$additional_options" /etc/default/grub 2>/dev/null; then + echo "GRUB_CMDLINE_LINUX already contains the additional options" | tee -a "$LOG" else # Append the additional options to GRUB_CMDLINE_LINUX - sudo sed -i "s/GRUB_CMDLINE_LINUX=\"/GRUB_CMDLINE_LINUX=\"$additional_options /" /etc/default/grub - echo "Added the additional options to GRUB_CMDLINE_LINUX" + if [ -f /etc/default/grub ]; then + run_cmd "sudo sed -i 's/GRUB_CMDLINE_LINUX=\"/GRUB_CMDLINE_LINUX=\"$additional_options /' /etc/default/grub" + echo "Added the additional options to GRUB_CMDLINE_LINUX" | tee -a "$LOG" + record_change "updated GRUB_CMDLINE_LINUX in /etc/default/grub" + run_cmd "sudo update-grub 2>&1 | tee -a '$LOG'" + record_change "update-grub" + else + echo -e "${NOTE} /etc/default/grub not found; skipping GRUB update" | tee -a "$LOG" + fi fi - - # Update GRUB configuration - sudo update-grub 2>&1 | tee -a "$LOG" # Define the configuration file and the line to add - config_file="/etc/modprobe.d/nvidia.conf" - line_to_add=""" - options nvidia-drm modeset=1 fbdev=1 - options nvidia NVreg_PreserveVideoMemoryAllocations=1 - """ + config_file="/etc/modprobe.d/nvidia.conf" + line_to_add=""" +options nvidia-drm modeset=1 fbdev=1 +options nvidia NVreg_PreserveVideoMemoryAllocations=1 +""" - # Check if the config file exists - if [ ! -e "$config_file" ]; then - echo "Creating $config_file" - sudo touch "$config_file" 2>&1 | tee -a "$LOG" - fi + # Ensure the config file exists + if [ ! -e "$config_file" ]; then + echo "Creating $config_file" | tee -a "$LOG" + run_cmd "sudo touch '$config_file' 2>&1 | tee -a '$LOG'" + record_change "created $config_file" + fi - add_to_file "$config_file" "$line_to_add" + add_to_file "$config_file" "$line_to_add" - # Add NVIDIA modules to initramfs configuration - modules_to_add="nvidia nvidia_modeset nvidia_uvm nvidia_drm" - modules_file="/etc/initramfs-tools/modules" + # Add NVIDIA modules to initramfs configuration + modules_to_add="nvidia nvidia_modeset nvidia_uvm nvidia_drm" + modules_file="/etc/initramfs-tools/modules" - if [ -e "$modules_file" ]; then + if [ -e "$modules_file" ]; then add_to_file "$modules_file" "$modules_to_add" 2>&1 | tee -a "$LOG" - sudo update-initramfs -u 2>&1 | tee -a "$LOG" - else + run_cmd "sudo update-initramfs -u 2>&1 | tee -a '$LOG'" + record_change "update-initramfs -u" + else echo "Modules file ($modules_file) not found." 2>&1 | tee -a "$LOG" - fi + fi + +# ---------------- post-install verification ---------------- +post_install_verify() { + echo -e "${INFO} Verifying NVIDIA installation..." + + # Determine installed variant + local variant="unknown" + if dpkg -l | grep -q -E '^ii\s+nvidia-open\b'; then + variant="open (NVIDIA CUDA repo)" + elif dpkg -l | grep -q -E '^ii\s+cuda-drivers\b'; then + variant="proprietary (NVIDIA CUDA repo)" + elif dpkg -l | grep -q -E '^ii\s+nvidia-driver\b'; then + variant="debian-packaged" + fi + echo -e "${OK} Driver source detected: ${YELLOW}${variant}${RESET}" + + # Module load status + local loaded="no" + if lsmod | grep -q '^nvidia\b'; then loaded="yes"; fi + echo -e "${INFO} Kernel module loaded: ${YELLOW}${loaded}${RESET}" + if [ "$loaded" != "yes" ]; then + echo -e "${NOTE} NVIDIA module not loaded. A reboot is often required after driver install." + fi + + # nvidia-smi (if available) + if _which nvidia-smi; then + local smi + smi=$(nvidia-smi --query-gpu=name,driver_version --format=csv,noheader 2>/dev/null | head -n1 || true) + if [ -n "$smi" ]; then + echo -e "${OK} nvidia-smi: ${YELLOW}${smi}${RESET}" + else + echo -e "${NOTE} nvidia-smi present but returned no GPU entries." + fi + else + echo -e "${NOTE} nvidia-smi not found; driver utilities may not be installed yet." + fi + + # GL stack info (best-effort) + if _which glxinfo; then + echo -e "${INFO} OpenGL summary:"; + glxinfo -B 2>/dev/null | grep -E 'OpenGL (vendor|renderer|version)' || true + fi +} + +if [ "$DRY_RUN" -eq 1 ]; then + echo "[DRY-RUN] Would run post-install verification (nvidia-smi, module status, glxinfo)." +else + post_install_verify || true +fi + +# ---------------- summary ---------------- +if [ "$DRY_RUN" -eq 1 ]; then + echo -e "${INFO} Dry-run mode: no changes made." +else + if [ "${#CHANGES[@]}" -eq 0 ]; then + echo -e "${OK} No changes made." + else + echo -e "${OK} Changes applied:" + for c in "${CHANGES[@]}"; do + echo " - $c" + done + fi +fi printf "\n%.0s" {1..2}