主题
NVIDIA 驱动与容器工具包离线安装
结论:内网(无外网)Ubuntu 机器装 NVIDIA 有两种离线路径:驱动用
.run安装包;容器工具包(nvidia-container-toolkit)在联网虚拟机里apt-get download递归拉取 deb 依赖打成 tar.gz,拷到内网dpkg -i。Hopper 架构(如 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 不含 cc | apt-get install build-essential,确认 which cc |
RmInitAdapter failed | Hopper 架构用了闭源驱动 | 换 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 docker4. 验证
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。
三、离线依赖打包通用规则
- 发行版与内核版本必须一致:打包机与目标机
uname -r、发行版版本要完全一致,跨版本混装会损坏系统 - 递归拉依赖:
apt-get download只拉主包,依赖要手动递归(apt-cache depends解析) - GPG key 一并携带:后续内网
apt-get update需要 key 验证源 - 内网无外网时,内核 headers、build-essential 等编译依赖也要按同法打包
参考来源
- 打包结构与内网部署命令来自实际制作会话(已验证结构,内网部署后效果以现场为准)
- H20/Hopper 必须 open kernel module:已验证(闭源驱动
RmInitAdapter failed)