手把手教你用脚本自动化安装Nvidia驱动到Ubuntu实时内核上周给实验室三台实时系统工作站部署Nvidia驱动时发现每次手动操作都要重复近20个步骤稍不留神就会在某个环节出错。于是花了两天时间封装了个全自动安装脚本现在新机器部署时间从原来的1小时缩短到10分钟。本文将分享这个实战中打磨出来的自动化方案特别适合需要批量配置实时内核设备的开发者。1. 实时内核环境准备实时内核RT-Preempt与标准内核的主要区别在于任务调度机制这会导致部分驱动模块需要重新编译。在开始前请确认uname -r | grep rt若输出包含rt字样说明当前运行的是实时内核否则需要先安装实时内核包。推荐使用Ubuntu官方提供的低延迟内核变体sudo apt install linux-image-rt-aws常见问题排查表现象可能原因解决方案无法进入图形界面Nouveau驱动冲突执行sudo systemctl isolate multi-user.target切换到控制台模式安装后黑屏内核模块签名验证在BIOS中关闭Secure Boot或手动签名模块编译过程卡死内存不足添加swap空间sudo fallocate -l 4G /swapfile sudo mkswap /swapfile提示实时内核版本必须与驱动版本严格匹配可通过apt-cache search linux-headers-$(uname -r)查找对应头文件2. 驱动自动化安装脚本解析核心脚本install-nvidia.sh包含以下功能模块#!/bin/bash # 参数配置区 NV_FILENVIDIA-Linux-x86_64-535.104.05.run # 需替换为实际驱动文件名 NV_DIR${NV_FILE%.run}2.1 环境检测函数function check_env() { # 实时内核验证 if ! uname -r | grep -q rt; then echo [ERROR] 必须使用实时内核启动系统 exit 1 fi # 现存驱动检测 lsmod | grep -q nvidia { echo [WARN] 检测到现存Nvidia驱动建议先卸载 read -p 是否继续?(y/n) -n 1 choice [[ $choice ~ [yY] ]] || exit 1 } }2.2 驱动编译安装模块function build_driver() { echo 正在提取驱动文件... ./$NV_FILE -x /dev/null # 关键编译参数 export IGNORE_PREEMPT_RT_PRESENCE1 cd $NV_DIR/kernel make -j$(nproc) module # 模块部署 sudo cp nvidia*.ko /lib/modules/$(uname -r)/kernel/drivers/video/ sudo depmod -a }性能优化技巧使用-j$(nproc)参数启用多核并行编译通过export IGNORE_PREEMPT_RT_PRESENCE1绕过实时内核检测添加--no-cc-version-check跳过编译器版本验证适用于gcc版本冲突时3. 系统级配置自动化3.1 自动禁用Nouveau驱动脚本中集成以下命令实现自动禁用开源驱动sudo bash -c echo -e blacklist nouveau\noptions nouveau modeset0 /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u3.2 动态库链接处理function setup_libs() { local lib_path/usr/lib/x86_64-linux-gnu sudo cp $NV_DIR/lib*.so.* $lib_path # 创建版本化符号链接 for lib in libnvidia-ml libcuda; do sudo ln -sf $lib.so.$NV_VERSION $lib_path/$lib.so.1 sudo ln -sf $lib.so.1 $lib_path/$lib.so done sudo ldconfig }4. 生产环境增强方案4.1 多节点批量部署结合Ansible实现集群自动化安装- name: 部署Nvidia驱动 hosts: gpu_nodes tasks: - copy: src: install-nvidia.sh dest: /tmp/ mode: 0755 - command: /tmp/install-nvidia.sh async: 3600 poll: 04.2 驱动版本管理使用元脚本自动获取最新驱动版本#!/usr/bin/env python3 import requests from bs4 import BeautifulSoup def get_latest_driver(): res requests.get(https://www.nvidia.com/Download/processFind.aspx?psid95) soup BeautifulSoup(res.text, html.parser) return soup.find(td, class_gridItem).text.strip()4.3 安全验证增强添加SHA256校验环节function verify_driver() { local sha256sum$(curl -s https://us.download.nvidia.cn/XFree86/Linux-x86_64/${NV_VERSION}/sha256sum) echo ${sha256sum} ${NV_FILE} | sha256sum --check || { echo 驱动文件校验失败 exit 1 } }最后在实验室所有机器上跑这个脚本时发现有个老型号Quadro显卡需要特殊处理于是在脚本开头加了段硬件检测逻辑。现在无论是Tesla V100还是老旧的K80都能一键完成部署。记得第一次成功批量部署时团队里负责运维的小伙子激动得差点把咖啡洒在服务器上——毕竟再也不用每台机器折腾大半天了。