手把手教你用脚本自动化安装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_FILE="NVIDIA-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_PRESENCE=1 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_PRESENCE=1绕过实时内核检测 - 添加
--no-cc-version-check跳过编译器版本验证(适用于gcc版本冲突时)
3. 系统级配置自动化
3.1 自动禁用Nouveau驱动
脚本中集成以下命令实现自动禁用开源驱动:
sudo bash -c 'echo -e "blacklist nouveau\noptions nouveau modeset=0" > /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?psid=95') 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,都能一键完成部署。记得第一次成功批量部署时,团队里负责运维的小伙子激动得差点把咖啡洒在服务器上——毕竟再也不用每台机器折腾大半天了。