Ana içeriğe geç

Ubuntu Linux Üzerine NVIDIA Sürücülerini ve CUDA'yı Kurma

Nvidia kartlarını resmi olarak yalnızca Ubuntu 22.04/24.04/26.04 LTS sürümlerinde destekliyoruz. Diğer dağıtımlara sürücü yüklemek için lütfen resmi geliştirici talimatlarına bakın:

Dikkat

Tesla serisi GPU'ların (örneğin NVIDIA Tesla T4) düzgün çalışması için, sunucu BIOS'unda 'above 4G decoding', 'large/64bit BARs' veya 'Above 4G MMIO BIOS assignment' parametresinin etkinleştirildiğinden emin olun.

Sunucu konsolunu açın (yerel konsol veya SSH üzerinden), root olarak giriş yapın, aşağıdaki betiği kopyalayın, komut satırına yapıştırın ve sürücüleri ile CUDA'yı otomatik olarak yüklemek için Enter tuşuna basın. Yazılımınızın çalışması için docker veya docker compose gerekiyorsa, betiğin GPU desteğini konteynerlara "aktarabilmesi" (pass through) için sürücüleri kurmadan ÖNCE bunları kurun.

Not

Bash dışında bir komut satırı kabuğu (örneğin zsh veya başka biri) kullanıyorsanız, exec bash komutunu çalıştırarak betiği çalıştırmak üzere bash'e geçin.

Dikkat

Kurulum sırasında, yeni çekirdek modüllerinin kurulumunu veya servislerin yeniden başlatılmasını onaylamak için Enter tuşuna basmanız gerekebilir.

Kurulum Betiği

#!/bin/bash
#===============================================================================
# Ubuntu 22.04/24.04/26.04 LTS için Evrensel NVIDIA Sürücü + CUDA Yükleyicisi
# - Legacy GPU'lar: nvidia-driver-535 sürümüne sabitlendi
# - Blackwell GPU'lar: açık çekirdek modülleri (nvidia-open)
# - Modern GPU'lar: cuda-drivers meta-paketi aracılığıyla en son tescilli sürücü
#===============================================================================
set -euo pipefail

#-------------------------------------------------------------------------------
# YAPILANDIRMA BAYRAKLARI
#-------------------------------------------------------------------------------
DO_OS_POLICY_CHECK=1 # Politikayı uygula: yalnızca Ubuntu 22.04/24.04/26.04 LTS
ALLOWED_UBUNTU_VERSIONS=("22.04" "24.04" "26.04")

DO_APT_UPGRADE=1 # apt update/upgrade
DO_INSTALL_HWE=1 # 22.04 üzerinde linux-generic-hwe-22.04 yükle
DO_INSTALL_KERNEL_HEADERS=1 # Mevcut çekirdek için linux-headers yükle
DO_INSTALL_BUILD_TOOLS=1 # GCC/G++ yükle

DO_PURGE_OLD_PACKAGES=1  # Eski NVIDIA/CUDA paketlerini temizlemeye çalış
DO_SETUP_CUDA_REPO=1 # cuda-keyring aracılığıyla CUDA apt deposunu kur
DO_INSTALL_CUDA_STACK=1 # CUDA toolkit (geliştirme ortamı) yükle

# Legacy GPU'lar: nvidia-driver-535 sürümüne sabitle (Pascal/Volta destekleyen son dal)
# Format: "10de:PCI_ID|İnsan Tarafından Okunabilir İsim|Sürücü Paketi"
LEGACY_GPUS=(
  "10de:1b06|GeForce GTX 1080 Ti|nvidia-driver-535"
  "10de:1db1|Tesla V100|nvidia-driver-580"
  "10de:1b80|GeForce GTX 1070|nvidia-driver-535"
  "10de:1c03|GeForce GTX 1060|nvidia-driver-535"
)

# Blackwell GPU'lar: açık çekirdek modülleri + sürücü 575+ gerektirir
# Format: "10de:PCI_ID|İnsan Tarafından Okunabilir İsim"
BLACKWELL_GPUS=(
  "10de:2b85|GeForce RTX 5090"
  "10de:2b84|GeForce RTX 5080"
  "10de:2b83|GeForce RTX 5070 Ti"
  "10de:2b82|GeForce RTX 5070"
  "10de:2bb4|RTX PRO 6000 Blackwell Workstation"
  "10de:2bb1|RTX PRO 6000 Blackwell Max-Q"
  "10de:2c38|RTX PRO 5000 Blackwell"
  "10de:2c37|RTX PRO 4000 Blackwell"
  "10de:2c36|RTX PRO 3000 Blackwell"
  "10de:2c35|RTX PRO 2000 Blackwell"
)

DO_BLACKLIST_NOUVEAU=1 # Blacklist oluştur + update-initramfs (yeniden başlatma gerekir)
DO_TRY_RMMOD_NOUVEAU=1  # Nouveau modülünü kaldırmaya çalış (kullanımdaysa başarısız olabilir)
DO_USER_GROUPS=0 # Kullanıcıyı video,render gruplarına ekle (isteğe bağlı)
DO_BASHRC_CUDA_PATHS=1 # ~/.bashrc aracılığıyla CUDA PATH/LD_LIBRARY_PATH ekle (idempotent)
DO_VERIFY_NVIDIA_SMI=1 # nvidia-smi çalıştır
DO_VERIFY_NVCC=1 # nvcc -V çalıştır (yalnızca nvcc mevcutsa)
DO_INSTALL_NVIDIA_CONTAINER_TOOLKIT=1  # Docker varsa NVIDIA Container Toolkit yükle
DO_CONFIGURE_DOCKER_RUNTIME=1 # nvidia-ctk runtime configure --runtime=docker çalıştır
DO_RESTART_DOCKER=1 # docker servisini yeniden başlat

# ---- Başlangıç ----
echo "NVIDIA sürücü + CUDA kurulumu başlatılıyor (Etkileşimsiz)..."

#-------------------------------------------------------------------------------
# BAĞIMLILIK KONTROLÜ
#-------------------------------------------------------------------------------
for cmd in lspci wget gpg curl sed awk uname; do
  command -v "$cmd" >/dev/null 2>&1 || { echo "Eksik bağımlılık: $cmd"; exit 1; }
done

#-------------------------------------------------------------------------------
# İŞLETİM SİSTEMİ TESPİTİ
#-------------------------------------------------------------------------------
osr="/etc/os-release"
[[ -r "$osr" ]] || osr="/usr/lib/os-release"
[[ -r "$osr" ]] || { echo "os-release dosyası okunamıyor. Çıkılıyor."; exit 1; }

set -a
. "$osr"
set +a

[[ "${ID:-}" != "ubuntu" ]] && { echo "Bu betik yalnızca Ubuntu içindir. Çıkılıyor."; exit 1; }

UBUNTU_VERSION="${VERSION_ID:-}"
UBUNTU_CODENAME="${VERSION_CODENAME:-}"

if [[ -z "${UBUNTU_CODENAME}" ]]; then
  case "${UBUNTU_VERSION}" in
    "22.04") UBUNTU_CODENAME="jammy" ;;
    "24.04") UBUNTU_CODENAME="noble" ;;
    "26.04") UBUNTU_CODENAME="resolute" ;;
    *) UBUNTU_CODENAME="unknown" ;;
  esac
fi

[[ -z "${UBUNTU_VERSION}" ]] && { echo "Ubuntu VERSION_ID tespit edilemiyor. Çıkılıyor."; exit 1; }

# Politika kontrolü
if [[ "${DO_OS_POLICY_CHECK:-0}" -eq 1 ]]; then
  ok=0
  for v in "${ALLOWED_UBUNTU_VERSIONS[@]}"; do
    [[ "${UBUNTU_VERSION}" == "${v}" ]] && { ok=1; break; }
  done
  [[ "${ok}" -ne 1 ]] && { echo "Desteklenmeyen Ubuntu sürümü: ${UBUNTU_VERSION}"; exit 1; }
fi

RELEASE_VERSION="$(echo "${UBUNTU_VERSION}" | sed 's/\([0-9]\+\)\.\([0-9]\+\)/\1\2/')"
echo "OS: Ubuntu ${UBUNTU_VERSION} (${UBUNTU_CODENAME})"

#-------------------------------------------------------------------------------
# GPU TESPİTİ
#-------------------------------------------------------------------------------
NVIDIA_GPU_LINES="$(lspci -nn | grep -iE 'vga|3d' | grep -i '10de:' || true)"
[[ -z "${NVIDIA_GPU_LINES}" ]] && { echo "NVIDIA GPU tespit edilmedi (vendor 10de). Çıkılıyor."; exit 1; }

echo "Tespit edilen NVIDIA GPU'lar:"
echo "${NVIDIA_GPU_LINES}"

DETECTED_GPUS="$(lspci -nn)"
REBOOT_REQUIRED=0

#-------------------------------------------------------------------------------
# SİSTEM HAZIRLIĞI
#-------------------------------------------------------------------------------
export DEBIAN_FRONTEND=noninteractive
export NEEDRESTART_MODE=a

if [[ "${DO_APT_UPGRADE}" -eq 1 ]]; then
  echo "Sistem paketleri güncelleniyor..."
  sudo -E apt-get update
  sudo -E apt-get upgrade -y \
    -o Dpkg::Options::="--force-confdef" \
    -o Dpkg::Options::="--force-confold"
fi

if [[ "${DO_INSTALL_HWE}" -eq 1 ]]; then
  case "${UBUNTU_VERSION}" in
    "22.04") HWE_PKG="linux-generic-hwe-22.04" ;;
    "24.04") HWE_PKG="linux-generic-hwe-24.04" ;;
    "26.04") HWE_PKG="" ;;
    *) HWE_PKG="" ;;
  esac
  if [[ -n "${HWE_PKG}" ]]; then
    echo "HWE çekirdeği yükleniyor: ${HWE_PKG}"
    sudo -E apt-get install -y \
      -o Dpkg::Options::="--force-confdef" \
      -o Dpkg::Options::="--force-confold" \
      "${HWE_PKG}"
    REBOOT_REQUIRED=1
  fi
fi

if [[ "${DO_INSTALL_KERNEL_HEADERS}" -eq 1 ]]; then
  CURRENT_KERNEL="$(uname -r)"
  echo "Çekirdek başlıkları yükleniyor: ${CURRENT_KERNEL}"
  sudo -E apt-get install -y \
    -o Dpkg::Options::="--force-confdef" \
    -o Dpkg::Options::="--force-confold" \
    "linux-headers-${CURRENT_KERNEL}" || {
    echo "linux-headers yüklenemedi. DKMS başarısız olabilir."; exit 1; }
fi

if [[ "${DO_INSTALL_BUILD_TOOLS}" -eq 1 ]]; then
  case "${UBUNTU_VERSION}" in
    "22.04") GCC_PACKAGES=("gcc-12" "g++-12") ;;
    "24.04") GCC_PACKAGES=("gcc-13" "g++-13") ;;
    "26.04") GCC_PACKAGES=("gcc-15" "g++-15") ;;
    *) GCC_PACKAGES=("gcc" "g++") ;;
  esac
  echo "Derleme araçları yükleniyor: ${GCC_PACKAGES[*]}"
  sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" "${GCC_PACKAGES[@]}"
fi

#-------------------------------------------------------------------------------
# ESKİ PAKETLERİ TEMİZLE
#-------------------------------------------------------------------------------
if [[ "${DO_PURGE_OLD_PACKAGES}" -eq 1 ]]; then
  echo "Önceki NVIDIA/CUDA kurulumları temizleniyor..."
  sudo dpkg --configure -a || true
  sudo -E apt-get purge -y "nvidia-*" "libnvidia-*" "cuda-*" "nvidia-driver-*" "*cudnn*" "*nsight*" 2>/dev/null || true
  sudo -E apt-get remove --purge -y nvidia-cuda-toolkit nvidia-prime nvidia-settings 2>/dev/null || true
  sudo -E apt-get autoremove -y || true
  sudo -E apt-get --fix-broken install -y || true
  sudo -E apt-get clean -y || true
fi

#-------------------------------------------------------------------------------
# CUDA REPOSİTORY KURULUMU
#-------------------------------------------------------------------------------
if [[ "${DO_SETUP_CUDA_REPO}" -eq 1 ]]; then
  echo "ubuntu${RELEASE_VERSION} için CUDA reposu ayarlanıyor..."
  wget -q "https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${RELEASE_VERSION}/x86_64/cuda-keyring_1.1-1_all.deb"
  sudo dpkg -i cuda-keyring_1.1-1_all.deb 2>/dev/null || true
  rm -f cuda-keyring_1.1-1_all.deb
  sudo -E apt-get update
fi

#-------------------------------------------------------------------------------
# NOUVEAU BLACKLIST (Kara Liste)
#-------------------------------------------------------------------------------
if [[ "${DO_BLACKLIST_NOUVEAU}" -eq 1 ]]; then
  BL_FILE="/etc/modprobe.d/blacklist-nouveau.conf"
  if [[ ! -f "${BL_FILE}" ]] || ! grep -q "^blacklist nouveau" "${BL_FILE}" 2>/dev/null; then
    echo "Nouveau kara listeye ekleniyor (yeniden başlatma gerekir)..."
    sudo tee "${BL_FILE}" >/dev/null <<'EOF'
blacklist nouveau
options nouveau modeset=0
EOF
    sudo update-initramfs -u
    REBOOT_REQUIRED=1
  fi
fi

#-------------------------------------------------------------------------------
# SÜRÜCÜ + CUDA KURULUMU
#-------------------------------------------------------------------------------
IS_BLACKWELL=0
IS_LEGACY=0

# 1) Önce Blackwell kontrolü (açık modüller gerektirir)
for gpu_spec in "${BLACKWELL_GPUS[@]}"; do
  IFS='|' read -r pci_id gpu_name <<< "$gpu_spec"
  if echo "$DETECTED_GPUS" | grep -q "$pci_id"; then
    echo "Tespit edilen Blackwell GPU: $gpu_name ($pci_id)"
    echo "Açık çekirdek modülleri + sürücü 575+ yükleniyor..."
    sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" \
      nvidia-open nvidia-driver-open nvidia-dkms-open
    IS_BLACKWELL=1
    break
  fi
done

# 2) Legacy GPU'ları kontrol et (535 sürümüne sabitle)
if [[ "$IS_BLACKWELL" -eq 0 ]]; then
  for gpu_spec in "${LEGACY_GPUS[@]}"; do
    IFS='|' read -r pci_id gpu_name driver_pkg <<< "$gpu_spec"
    if echo "$DETECTED_GPUS" | grep -q "$pci_id"; then
      echo "Tespit edilen legacy GPU: $gpu_name ($pci_id) -> $driver_pkg sürümüne sabitleniyor"
      sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" \
        "$driver_pkg" "nvidia-dkms-${driver_pkg#nvidia-driver-}"
      IS_LEGACY=1
      break
    fi
  done
fi

# 3) CUDA toolkit + sürücüleri yükle
if [[ "${DO_INSTALL_CUDA_STACK}" -eq 1 ]]; then
  if [[ "$IS_BLACKWELL" -eq 1 ]]; then
    echo "CUDA toolkit yükleniyor (Blackwell yolu)..."
    sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" cuda-toolkit
  elif [[ "$IS_LEGACY" -eq 1 ]]; then
    # 🔒 LEGACY DÜZELTME: V100/Pascal/Volta en fazla CUDA <= 12.2 destekler
    # Otomatik CUDA 13.x yükseltmesini önlemek için versiyonlanmış paket kullanılıyor
    echo "CUDA toolkit 12.2 yükleniyor (legacy yolu)..."
    sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" cuda-toolkit-12-2
  else
    # Modern GPU'lar: en son tescilli sürücü için cuda-drivers meta-paketi kullanılır
    echo "CUDA toolkit + en son tescilli sürücü cuda-drivers aracılığıyla yükleniyor..."
    sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" cuda-toolkit cuda-drivers
  fi
fi

#-------------------------------------------------------------------------------
# KURULUM SONRASI ADIMLAR
#-------------------------------------------------------------------------------
if [[ "${DO_TRY_RMMOD_NOUVEAU}" -eq 1 ]]; then
  sudo rmmod -f nouveau 2>/dev/null || true
fi

if [[ "${DO_USER_GROUPS}" -eq 1 ]]; then
  TARGET_USER="${SUDO_USER:-$USER}"
  sudo usermod -aG video,render "${TARGET_USER}" || true
  echo "Kullanıcı ${TARGET_USER} video/render gruplarına eklendi."
  REBOOT_REQUIRED=1
fi

if [[ "${DO_BASHRC_CUDA_PATHS}" -eq 1 ]]; then
  TARGET_USER="${SUDO_USER:-$USER}"
  TARGET_HOME="$(getent passwd "${TARGET_USER}" | cut -d: -f6)"
  TARGET_BASHRC="${TARGET_HOME}/.bashrc"
  MARKER="NVIDIA CUDA Paths"

  [[ -f "${TARGET_BASHRC}" ]] || sudo -u "${TARGET_USER}" touch "${TARGET_BASHRC}" || true

  if ! grep -q "${MARKER}" "${TARGET_BASHRC}" 2>/dev/null; then
    cat >> "${TARGET_BASHRC}" <<'EOF'

# NVIDIA CUDA Paths
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
EOF
    echo "CUDA PATH ${TARGET_BASHRC} dosyasına eklendi."
  fi
fi

#-------------------------------------------------------------------------------
# DOĞRULAMA
#-------------------------------------------------------------------------------
if [[ "${DO_VERIFY_NVIDIA_SMI}" -eq 1 ]]; then
  echo "nvidia-smi doğrulanıyor..."
  nvidia-smi || true
fi

if [[ "${DO_VERIFY_NVCC}" -eq 1 ]]; then
  if command -v nvcc >/dev/null 2>&1; then
    echo "nvcc doğrulanıyor..."
    nvcc -V || true
  else
    echo "nvcc henüz PATH içinde bulunamadı (yeniden oturum açma/yeniden başlatma gerekebilir)"
  fi
fi

#-------------------------------------------------------------------------------
# NVIDIA CONTAINER TOOLKIT
#-------------------------------------------------------------------------------
if [[ "${DO_INSTALL_NVIDIA_CONTAINER_TOOLKIT}" -eq 1 ]]; then
  if command -v docker >/dev/null 2>&1; then
    echo "Docker tespit edildi: NVIDIA Container Toolkit yükleniyor..."
    sudo -E apt-get update
    sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" curl gnupg2

    sudo install -d -m 0755 /usr/share/keyrings
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
          | sudo gpg --dearmor --yes -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

    curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
      | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
      | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list >/dev/null

    sudo -E apt-get update
    sudo -E apt-get install -y -o Dpkg::Options::="--force-confdef" nvidia-container-toolkit

    if [[ "${DO_CONFIGURE_DOCKER_RUNTIME}" -eq 1 ]]; then
      command -v nvidia-ctk >/dev/null 2>&1 && sudo nvidia-ctk runtime configure --runtime=docker || true
    fi

    if [[ "${DO_RESTART_DOCKER}" -eq 1 ]]; then
      sudo systemctl restart docker || true
    fi
  else
    echo "Docker bulunamadı. Konteyner toolkit atlanıyor."
  fi
fi

#-------------------------------------------------------------------------------
# FİNAL
#-------------------------------------------------------------------------------
echo ""
echo "========================================"
echo "Kurulum tamamlandı"
echo "========================================"

if [[ "${REBOOT_REQUIRED}" -eq 1 ]]; then
  echo ">> YENİDEN BAŞLATMA GEREKLİ: sudo reboot"
fi

echo "Yeniden başlatma sonrası şunlarla doğrulayın:"
echo "  nvidia-smi"
echo "  nvcc -V"

Dikkat

Betik çalıştırıldıktan sonra, sudo reboot komutu kullanılarak sunucunun yeniden başlatılması zorunludur. Bu, yeni çekirdek modüllerinin etkinleştirilmesi için gereklidir.

Yeniden başlattıktan sonra, nvidia-smi ve nvcc -V komutlarını kullanarak sürücülerin ve CUDA'nın kurulumunu doğrulayın. Aşağıdakine benzer bir çıktı görmelisiniz:

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 595.71.05              Driver Version: 595.71.05      CUDA Version: 13.2     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4090        On  |   00000000:07:00.0 Off |                  Off |
| 31%   27C    P8              7W /  450W |      33MiB /  24564MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

veya

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2026 NVIDIA Corporation
Built on Thu_Mar_19_11:12:51_PM_PDT_2026
Cuda compilation tools, release 13.2, V13.2.78
Build cuda_13.2.r13.2/compiler.37668154_0