管理员权限运行下述脚本:
#!/bin/bash
# ==============================================================================
# Fedora 44 Server NVIDIA 驱动自动化安装与修复脚本
# 适用硬件: NVIDIA Turing 架构及更新 (含 RTX 2080 Ti)
# ==============================================================================
# 严格模式:遇到错误立即退出,未定义变量报错,管道中任何命令失败即失败
set -euo pipefail
# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # 恢复默认颜色
# 打印带颜色的信息函数
info() { echo -e "${CYAN}[INFO] $1${NC}"; }
success() { echo -e "${GREEN}[SUCCESS] $1${NC}"; }
warn() { echo -e "${YELLOW}[WARNING] $1${NC}"; }
error() { echo -e "${RED}[ERROR] $1${NC}"; exit 1; }
# 执行需要长时间等待的命令,并打印动态进度点
run_with_dots() {
local cmd="$1"
# 将命令放入后台执行
eval "$cmd" &
local pid=$!
# 只要进程还在运行,就每隔 3 秒打印一个点
while kill -0 $pid 2>/dev/null; do
echo -n "."
sleep 3
done
echo "" # 换行
# 获取后台命令的真实退出状态码
wait $pid
return $?
}
# ==================== 1. 基础环境检查 ====================
echo -e "\n${CYAN}>>> 阶段 1: 系统与环境检查 <<<${NC}"
if [[ $EUID -ne 0 ]]; then
error "必须使用 root 权限运行此脚本,请使用 sudo ./install_nvidia.sh"
fi
# 检查安全启动状态 (仅作警告提醒)
if command -v mokutil >/dev/null 2>&1; then
SB_STATE=$(mokutil --sb-state || true)
if [[ "$SB_STATE" == *"SecureBoot enabled"* ]]; then
warn "检测到 Secure Boot (安全启动) 处于开启状态!"
warn "安装完成后,NVIDIA 模块将被拦截。建议在 BIOS 中关闭 Secure Boot。"
sleep 3
else
success "Secure Boot 已关闭,驱动加载无签名障碍。"
fi
fi
# ==================== 2. 安装内核编译核心依赖 ====================
echo -e "\n${CYAN}>>> 阶段 2: 补全内核编译环境 <<<${NC}"
CURRENT_KERNEL=$(uname -r)
info "当前正在运行的内核版本为: $CURRENT_KERNEL"
# 核心校验:如果找不到对应版本的 kernel-devel,必须阻断
if ! dnf list available "kernel-devel-${CURRENT_KERNEL}" &>/dev/null && ! rpm -q "kernel-devel-${CURRENT_KERNEL}" &>/dev/null; then
error "仓库中缺少当前内核 (${CURRENT_KERNEL}) 对应的 kernel-devel。\n请先运行 'dnf update -y kernel' 并重启系统,然后再执行本脚本!"
fi
dnf install -y gcc make kernel-devel-"$CURRENT_KERNEL" kernel-headers \
kmodtool akmods mokutil openssl
success "内核编译工具链准备完毕。"
# ==================== 3. 配置 RPM Fusion 仓库 ====================
echo -e "\n${CYAN}>>> 阶段 3: 配置第三方驱动仓库 <<<${NC}"
info "正在添加 RPM Fusion Free & Nonfree 仓库..."
dnf install -y \
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm || true
success "RPM Fusion 仓库配置完成。"
# ==================== 4. 安装 NVIDIA 驱动与 CUDA ====================
echo -e "\n${CYAN}>>> 阶段 4: 下载并安装驱动包 <<<${NC}"
info "正在通过 DNF 安装 akmod-nvidia 和 CUDA 支持包..."
dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cuda
success "驱动软件包下载并安装完成。"
# ==================== 5. 编译内核模块 (耗时步骤) ====================
echo -e "\n${CYAN}>>> 阶段 5: 动态编译 NVIDIA 驱动模块 (akmods) <<<${NC}"
info "等待可能由于 DNF 安装触发的后台 akmods 进程释放锁..."
while pgrep -x akmods > /dev/null; do
echo -n "."
sleep 3
done
echo ""
echo -n -e "${CYAN}正在强制重新编译驱动模块 ${NC}"
if run_with_dots "akmods --force --rebuild > /dev/null 2>&1"; then
depmod -a # 确保模块依赖树更新
success "akmods 编译流程结束。"
else
error "akmods 编译失败!请检查 /var/cache/akmods/nvidia/ 目录下的日志。"
fi
info "正在验证驱动文件是否成功写入内核..."
if modinfo -F version nvidia > /dev/null 2>&1; then
NVIDIA_VER=$(modinfo -F version nvidia)
success "验证通过!已成功生成内核驱动,版本号: $NVIDIA_VER"
else
error "严重错误:modinfo 仍无法找到 nvidia 模块,编译生成失败!"
fi
# ==================== 6. 更新引导镜像 (耗时步骤) ====================
echo -e "\n${CYAN}>>> 阶段 6: 更新启动引导镜像 (Dracut) <<<${NC}"
echo -n -e "${CYAN}正在仅为当前内核更新镜像 ${NC}"
if run_with_dots "dracut --force /boot/initramfs-${CURRENT_KERNEL}.img ${CURRENT_KERNEL}"; then
success "引导镜像重建完成。"
else
error "dracut 构建镜像失败!"
fi
# ==================== 7. 完成与清理 ====================
echo -e "\n${CYAN}>>> 阶段 7: 全部任务完成 <<<${NC}"
success "所有安装与修复步骤已安全执行完毕!"
info "请执行 'sudo reboot' 重启服务器。"
info "重启后,再次连接服务器并运行 'nvidia-smi' 即可查看显卡状态。"
exit 0