由于本人工作原因,经常会遇到需要给ubuntu打显卡驱动的问题,虽然说不难吧,但是耐不住机器多,重复多次也就烦了,于是抽出了一点时间,并且在deepseek的帮助之下,写了一个自动安装驱动的脚本,脚本中除了自动关闭nouveau的这一步没有进行确认,其他情况下(即nouveau默认禁用的情况下)可正常运行。
#上传install_cuda.sh
chmod +x install_cuda.sh
sudo ./install_cuda.sh
#查看是否安装完成
nvidia-smi
nvcc -V
附上脚本,可以进行微调
#!/bin/bash
# -----------------------------------------------------------------------------
# 脚本名称: install_cuda.sh
# 版本: 2.0.0
# 作者: 一个不知名的苦逼打工人
# 目标:在 Ubuntu 22.04 上安装 NVIDIA CUDA 12.8,并修改 root 密码
# -----------------------------------------------------------------------------
echo "🔧 五秒后开始执行脚本"
sleep 5
# 记录脚本开始时间
start_time=$(date +%s)
# 确保以 root 权限运行
if [[ $EUID -ne 0 ]]; then
echo "❌ 错误:此脚本必须以 root 权限执行。" >&2
sleep 1
echo "用法:sudo bash $0"
sleep 1
exit 1
fi
# **修改 root 密码**
ROOT_PASSWORD="1!P@ssw0rd"
echo "🔑 正在修改 root 密码..."
sleep 1
echo "root:$ROOT_PASSWORD" | sudo chpasswd
echo "✅ root 密码已修改为 '1!P@ssw0rd'!"
sleep 1
# **允许 root 通过 SSH 登录**
echo "🔧 允许 root 通过 SSH 登录..."
sleep 1
sudo sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config
# **重启 SSH 服务(使修改生效)**
sudo systemctl restart sshd
echo "✅ SSH 允许 root 登录已启用!"
sleep 1
# **切换到 root 账户**
# echo "🔄 切换到 root 账户..."
# exec su - root
# -----------------------------------------------------------------------------
# **以下开始执行 CUDA 12.8 安装**
# -----------------------------------------------------------------------------
echo "🔧 定义 CUDA 相关变量..."
sleep 1
CUDA_VERSION="12.8.0"
CUDA_DRIVER_VERSION="570.86.10"
CUDA_MAJOR_VERSION=$(echo "$CUDA_VERSION" | cut -d. -f1-2)
CUDA_URL="https://developer.download.nvidia.com/compute/cuda/${CUDA_VERSION}/local_installers/cuda_${CUDA_VERSION}_${CUDA_DRIVER_VERSION}_linux.run"
CUDA_PKG="/root/cuda_${CUDA_VERSION}_${CUDA_DRIVER_VERSION}_linux.run"
echo "✅ CUDA 版本: $CUDA_VERSION"
sleep 1
echo "✅ CUDA 驱动版本: $CUDA_DRIVER_VERSION"
sleep 1
echo "✅ CUDA 主版本: $CUDA_MAJOR_VERSION"
sleep 1
echo "✅ CUDA 下载链接: $CUDA_URL"
sleep 1
echo "✅ CUDA 安装包路径: $CUDA_PKG"
sleep 1
echo "🔧 将 CUDA 相关变量写入 /etc/profile..."
sleep 1
# 检查并添加 CUDA_VERSION
if ! grep -q "export CUDA_VERSION=" /etc/profile; then
echo "export CUDA_VERSION=\"$CUDA_VERSION\"" >> /etc/profile
echo "✅ 已写入 CUDA_VERSION"
sleep 1
else
echo "⚠️ CUDA_VERSION 已存在,跳过写入"
sleep 1
fi
# 检查并添加 CUDA_DRIVER_VERSION
if ! grep -q "export CUDA_DRIVER_VERSION=" /etc/profile; then
echo "export CUDA_DRIVER_VERSION=\"$CUDA_DRIVER_VERSION\"" >> /etc/profile
echo "✅ 已写入 CUDA_DRIVER_VERSION"
sleep 1
else
echo "⚠️ CUDA_DRIVER_VERSION 已存在,跳过写入"
sleep 1
fi
# 检查并添加 CUDA_MAJOR_VERSION
if ! grep -q "export CUDA_MAJOR_VERSION=" /etc/profile; then
echo "export CUDA_MAJOR_VERSION=\"$CUDA_MAJOR_VERSION\"" >> /etc/profile
echo "✅ 已写入 CUDA_MAJOR_VERSION"
sleep 1
else
echo "⚠️ CUDA_MAJOR_VERSION 已存在,跳过写入"
sleep 1
fi
# 检查并添加 CUDA_URL
if ! grep -q "export CUDA_URL=" /etc/profile; then
echo "export CUDA_URL=\"$CUDA_URL\"" >> /etc/profile
echo "✅ 已写入 CUDA_URL"
sleep 1
else
echo "⚠️ CUDA_URL 已存在,跳过写入"
sleep 1
fi
# 检查并添加 CUDA_PKG
if ! grep -q "export CUDA_PKG=" /etc/profile; then
echo "export CUDA_PKG=\"$CUDA_PKG\"" >> /etc/profile
echo "✅ 已写入 CUDA_PKG"
sleep 1
else
echo "⚠️ CUDA_PKG 已存在,跳过写入"
sleep 1
fi
echo "🔧 使环境变量配置立即生效..."
sleep 1
source /etc/profile
echo "✅ 环境变量配置已生效"
sleep 1
echo "🎉 CUDA 相关变量已成功写入环境变量并生效!"
sleep 1
# 备份 sources.list
echo "📂 备份原始的 sources.list..."
sleep 1
cp /etc/apt/sources.list /etc/apt/sources.list.bak && echo "✅ 备份成功: /etc/apt/sources.list.bak" || { echo "❌ 备份失败"; sleep 1; exit 1; }
# 配置阿里源
echo "⚙️ 配置阿里源..."
sleep 1
cat > /etc/apt/sources.list << EOF
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF
# 更新系统并安装必要工具
echo "🔄 更新软件包..."
sleep 1
export DEBIAN_FRONTEND=noninteractive
apt update && apt upgrade -y
# 安装基础工具(确保 `nvcc -V` 可用)
echo "📦 安装必要工具 (gcc, make, vim,, nvidia-cuda-toolkit)..."
sleep 1
apt install -y gcc make vim nvidia-cuda-toolkit || { echo "❌ 工具安装失败"; sleep 1; exit 1; }
# 下载 CUDA 12.8 安装包
echo "⬇️ 正在下载 CUDA $CUDA_MAJOR_VERSION 安装包..."
sleep 1
wget -O "$CUDA_PKG" --progress=dot:giga "$CUDA_URL" || { echo "❌ CUDA 下载失败"; sleep 1; exit 1; }
echo "✅ CUDA 下载完成: $CUDA_PKG"
sleep 1
# 禁用 Nouveau 驱动
echo "🚫 禁用 Nouveau 驱动..."
sleep 1
cat > /etc/modprobe.d/blacklist-nouveau.conf << EOF
blacklist nouveau
options nouveau modeset=0
EOF
# 重新生成 initramfs 并尝试卸载 nouveau
update-initramfs -u
sleep 3
if lsmod | grep -q nouveau; then
echo "⚠️ Nouveau 仍在运行,尝试移除..."
sleep 1
rmmod nouveau || echo "⚠️ 无法卸载 Nouveau,可能需要手动检查"
sleep 1
else
echo "✅ Nouveau 禁用成功。"
sleep 1
fi
# 赋予 CUDA 安装包执行权限
chmod +x "$CUDA_PKG"
# 安装 CUDA
echo "📦 开始安装 NVIDIA CUDA $CUDA_MAJOR_VERSION..."
sleep 1
if bash "$CUDA_PKG" --silent --driver --toolkit --no-drm ; then
echo "✅ CUDA 安装完成。"
sleep 1
else
echo "❌ CUDA 安装失败,退出脚本。" >&2
sleep 1
exit 1
fi
# 更新环境变量
echo "🔧 配置环境变量..."
sleep 1
if ! grep -q "/usr/local/cuda-$CUDA_MAJOR_VERSION/bin" /etc/profile; then
echo "export PATH=/usr/local/cuda-$CUDA_MAJOR_VERSION/bin:\$PATH" >> /etc/profile
fi
if ! grep -q "/usr/local/cuda-$CUDA_MAJOR_VERSION/lib64" /etc/profile; then
echo "export LD_LIBRARY_PATH=/usr/local/cuda-$CUDA_MAJOR_VERSION/lib64:\$LD_LIBRARY_PATH" >> /etc/profile
fi
# 使配置立即生效
source /etc/profile
source ~/.bashrc
# 配置 NVIDIA 持久模式 systemd 服务
echo "🛠️ 创建 NVIDIA 持久模式 systemd 服务(Deshine-NVIDIA-Persistence-M-On)..."
sleep 1
cat > /etc/systemd/system/Deshine-NVIDIA-Persistence-M-On.service << EOF
[Unit]
Description=Enable NVIDIA Persistence Mode (Deshine)
After=multi-user.target
[Service]
ExecStart=/usr/bin/nvidia-smi -pm 1
RemainAfterExit=yes
Type=oneshot
[Install]
WantedBy=multi-user.target
EOF
# 重新加载 systemd 并启用服务
systemctl daemon-reload
systemctl enable Deshine-NVIDIA-Persistence-M-On.service
systemctl start Deshine-NVIDIA-Persistence-M-On.service
# 删除 CUDA 安装包
echo "🗑️ 清理无用的安装文件..."
sleep 1
rm -f "$CUDA_PKG"
# 验证 CUDA 是否安装成功
echo "🔍 检查 CUDA $CUDA_MAJOR_VERSION 安装状态..."
sleep 1
if command -v nvcc &> /dev/null; then
echo "🎉 CUDA 安装成功!版本信息:"
sleep 1
nvcc -V
else
echo "⚠️ CUDA 可能未正确安装,请手动检查!"
sleep 1
fi
# 记录脚本结束时间并计算执行时间
end_time=$(date +%s)
execution_time=$((end_time - start_time))
echo "🕒 脚本执行完成,总耗时: ${execution_time} 秒"
sleep 1
# **自动删除自身**
echo "🗑️ 自动删除安装脚本..."
sleep 1
rm -- "$0"
# 询问是否重启系统
read -p "CUDA $CUDA_MAJOR_VERSION 配置完成,是否立即重启系统? (y/n) " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
echo "🔄 系统将在 10 秒后重启..."
sleep 10
echo "🔄 即将重启系统..."
sudo reboot
else
echo "✅ 请手动重启系统以完成 CUDA 配置。"
sleep 1
fi