跳转到内容

NVIDIA 驱动与容器工具包离线安装

结论:内网(无外网)Ubuntu 机器装 NVIDIA 有两种离线路径:驱动用 .run 安装包;容器工具包(nvidia-container-toolkit)在联网虚拟机里 apt-get download 递归拉取 deb 依赖打成 tar.gz,拷到内网 dpkg -iHopper 架构(如 H20)必须用 open kernel module 驱动(-open.run,闭源驱动报 RmInitAdapter failed

适用范围与环境

  • 内网服务器:Ubuntu 20.04.6,无外网
  • 打包机:本地联网虚拟机(发行版/内核版本需与目标机一致,uname -r 核对)
  • GPU:NVIDIA H20(Hopper,PCI 10de:2b85);另一场景为 8× A100 计算节点(vfio-pci 直通)

一、NVIDIA 驱动 .run 离线安装

1. 前提检查

bash
uname -r                 # 记录内核版本
lspci | grep -i nvidia   # 确认 GPU 型号
# 若机器上已绑定 vfio-pci(GPU 直通给虚拟机),宿主驱动安装需先解除绑定

2. 常见报错与处理

报错原因处理
nvidia-installer was forced to guess the kernel source path缺 kernel headers安装 linux-headers-$(uname -r)build-essential(gcc/make)
please check that cc in your path未安装 gcc 或 PATH 不含 ccapt-get install build-essential,确认 which cc
RmInitAdapter failedHopper 架构用了闭源驱动NVIDIA-Linux-x86_64-<ver>-open.run open kernel module
编译阶段找不到 kernel header内网无源与 deb 依赖打包法一致,先把 headers/debs 打成离线包

3. Hopper 架构安装命令

bash
chmod +x NVIDIA-Linux-x86_64-590.48.01-open.run
sudo ./NVIDIA-Linux-x86_64-590.48.01-open.run
nvidia-smi   # 验证

已验证事实:H20 属于 Hopper 架构,闭源驱动不兼容(RmInitAdapter failed),open kernel module 是唯一路径。

4. GPU 直通场景提醒

若 GPU 已绑定 vfio-pci 用于虚拟机(如 KubeVirt sandbox),宿主卸载/重装驱动前必须确认直通状态:普通容器 Pod 暂不能用 GPU,宿主侧驱动只服务直通或宿主内推理场景。

二、nvidia-container-toolkit 离线包制作与部署

1. 联网机器上拉取 deb 依赖(发行版一致前提)

bash
# 先配置官方源
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo tee /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg > /dev/null
# 生成 apt 源并 apt-get update
# 递归下载主包及依赖
mkdir -p debs && cd debs
apt-get download nvidia-container-toolkit && apt-get download $(apt-cache depends nvidia-container-toolkit | grep Depends | awk '{print $2}' | tr '\n' ' ')

2. 打包结构(已验证,nvidia-container-toolkit 1.19.1-1)

text
nvidia-ctk-offline-clean/
├── debs/
│   ├── libnvidia-container1_1.19.1-1_amd64.deb       # 运行时库
│   ├── libnvidia-container-tools_1.19.1-1_amd64.deb  # 工具
│   ├── nvidia-container-toolkit_1.19.1-1_amd64.deb   # 主包
│   └── nvidia-container-toolkit-base_1.19.1-1_amd64.deb
├── repo/
│   ├── nvidia-container-toolkit-keyring.gpg           # GPG key
│   └── nvidia-container-toolkit.list                  # apt 源
└── install-offline.sh                                 # 安装脚本
bash
tar -czf nvidia-ctk-offline-clean.tar.gz nvidia-ctk-offline-clean/

3. 内网部署

bash
tar -xzf nvidia-ctk-offline-clean.tar.gz
cd nvidia-ctk-offline-clean
sudo bash install-offline.sh        # 脚本内部执行 dpkg -i debs/*.deb + 装 key/源
# 配置 Docker runtime
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

4. 验证

bash
nvidia-ctk --version
nvidia-smi
docker info | grep -i runtime     # 应看到 nvidia runtime
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi

前提:内网机器必须有 NVIDIA GPU 且驱动已装好(nvidia-smi 可用),否则 toolkit 装了也无法使用 GPU。

三、离线依赖打包通用规则

  1. 发行版与内核版本必须一致:打包机与目标机 uname -r、发行版版本要完全一致,跨版本混装会损坏系统
  2. 递归拉依赖apt-get download 只拉主包,依赖要手动递归(apt-cache depends 解析)
  3. GPG key 一并携带:后续内网 apt-get update 需要 key 验证源
  4. 内网无外网时,内核 headers、build-essential 等编译依赖也要按同法打包

参考来源

  • 打包结构与内网部署命令来自实际制作会话(已验证结构,内网部署后效果以现场为准)
  • H20/Hopper 必须 open kernel module:已验证(闭源驱动 RmInitAdapter failed

基于 MIT 许可发布