夜雨聆风学习资料网

ARTICLE · 1054745

B300 交付实战:离线软件源(本地 apt 源)怎么搭

B300 交付实战:离线软件源(本地 apt 源)怎么搭

GPU 交付 · 环境搭建 · 离线源部署

在无外网的 GPU 机房交付 B300 服务器,第一道坎往往不是驱动、不是 CUDA,而是「装包的源从哪来」。本文基于 B300 离线安装包 v1,把离线源(本地 apt 源 + vendor local-repo)的部署原理和实操步骤拆开讲清楚。

Ubuntu 24.04全离线交付12 阶段一键部署

01为什么必须先搭离线源

GPU 交付机房通常无外网或严控外网,Ubuntu 默认的 archive.ubuntu.com 根本连不上。所以思路只有一个:

把整套软件栈的 deb 包提前打好,随离线包一起带到机房,原位构建成本地源,让 apt 在断网状态下也能正常安装。

整个离线源不是"一个文件",而是三块拼起来的。

02离线源的三块构成

组成
作用
构建方式
本地 apt 源
系统依赖包(base/build-tools/rdma 等)
dpkg-scanpackages
vendor local-repo
NVIDIA 驱动、NCCL 官方本地仓库
厂商 local-repo 挂载
bdpkg-dev
dpkg-dev 工具链引导(31 个 deb)
stage1 自动调用

03先破"鸡生蛋"死结

离线源部署最大的坑是个循环依赖:

要构建本地源,需要 dpkg-scanpackages 命令(来自 dpkg-dev 包);但 dpkg-dev 本身又得从本地源里装。这就成了"先有鸡还是先有蛋"。

破局方案是 dpkg-dev/install.sh——一个自带 31 个 deb 的引导包(dpkg-dev 1.22.6ubuntu6.6),先把工具链"裸装"上去。它由主脚本 stage1 自动调用;手动方式如下:

cd b-dpkg-dev# 二选一:sudo apt-get install -y ./*.deb# 或sudo dpkg -i ./*.deb

04部署步骤六连

1整包就位:把离线包整体拷贝到目标机(如 /soft/)。

scp -r <离线包目录> root@<目标机IP>:/soft/

2引导工具链:stage1 先裸装 dpkg-dev,破除"鸡生蛋"。

cd bootstrap-dpkg-devsudo dpkg -i ./*.deb

3原位构建本地源dpkg-scanpackages 生成包索引,再把源指向本地。

cd /soft/pkgdpkg-scanpackages --multiversion . > Packagesecho "deb [trusted=yes] file:/soft/pkg noble main" > /etc/apt/sources.list.d/offline.listapt-get update

4依赖全量补齐:stage1b 从 ubuntu-deps 六类目录批量补装。

# 按 base/build-tools/rdma/doca-host/server-tools/stress-test 扫描apt-get install -y <系统缺失的依赖包>

5挂载 vendor 仓库:NVIDIA 驱动 local-repo、NCCL 走各自 vendor 仓库。

dpkg -i nvidia-driver-local-repo-ubuntu2404-*.debapt-get updateapt-get install -y cuda-drivers

6安全加固:keyring 拷入 + 禁用公网源 + hold 内核。

# keyring 拷入,防 NO_PUBKEYsudo cp nvidia-driver-local-*-keyring.gpg /usr/share/keyrings/# 禁用公网源(改名 .disabled-qy,只用本地源)sudo mv /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.disabled-qy# hold 内核元包,防误升内核apt-mark hold linux-image-generic linux-headers-generic linux-generic

05三道保险:为什么不装错

版本感知:用 dpkg --compare-versions 判断已装版本,绝不降级,从根上防 glibc 死锁。

状态硬校验pkg_installed() 要求 dpkg 状态必须是 installed,半安装态(unpacked/half-configured)一律视为未装,防误跳过。

幂等 + 断点续装:每个 stage 完成后写 /root/qy_install/state,重跑自动跳过;切内核时写 .resume + systemd 单元,重启后自动续跑。

06一键部署命令

# ① 整包拷贝到目标机 /soft/ 后,root 执行主脚本(含离线源构建)sudo bash offline_install.sh# ② 装压测工具sudo bash install_benchmarks.sh# ③ 时间同步 + 时区(NTP 已脱敏)sudo bash sync_time.sh 192.168.*.*

环境变量开关:NO_REBOOT=1 不自动重启;SKIP_KERNEL=0 启用内核升级;FORCE=1 强制重装;--check 只检测不安装。

07四个脚本各自干什么

交付包里有 4 个关键脚本,各管一段,串起来就是完整交付链路:

脚本
定位
offline_install.sh
主安装:12 阶段全离线装 GPU 软件栈
install_kernel_6.8.0-71_offline.sh
内核:独立切内核到 6.8.0-71
sync_time.sh
时间:时区 + 内网 NTP + 24 小时制
gpu_stress
压测:一键 6 场景烤机

① offline_install.sh —— 主安装(12 阶段)

Stage
内容
1
bdpkg-dev + 建本地源 + build 工具链
1b
ubuntu-deps 六类依赖全量补齐
2
内核 6.8.0-124(默认跳过)
3
DOCA 3.5.0 + OFED
4
NVIDIA 驱动 580.159.04
5
CUDA 13.1
6
NCCL 2.29.2
7
DCGM 4.5.3
8/9
HPC-X / HPC-Benchmarks(默认跳过)
10
MFT 4.37.0
11
模块加载 + 服务 enable + chrony 接管
12
生成验收报告

机制:幂等 state 标记 + 断点续装 .resume + 版本感知不降级 + 状态硬校验。

② install_kernel_6.8.0-71_offline.sh —— 内核独立安装

离线切内核到 6.8.0-71-generic:禁自动更新 + hold → 前置工具版本感知装 → 内核 6 件套一条 dpkg装完 → 硬校验 → GRUB 默认项 pin 到 71 → 验证;零自动重启,装完人工 reboot。

③ sync_time.sh —— 时间同步

时区 Asia/Shanghai;内网 NTP(chrony / timesyncd 双模式,默认 192.168.*.*);24 小时制(LC_TIME=en_DK.UTF-8)。

④ gpu_stress —— 压测启动器

6 场景:burn GPU 满载 / babel 显存带宽 / dcgm 诊断 / stress CPU+内存 / mem 逐位检测 / all 整机满载(新机老化 all 720=12h);日志统一 /var/log/gpu-stress/

08踩坑清单(v1~v2 累积)

libc-patch:机器 libc6 介于包内版本之间时,从 pkg/ubuntu-deps/libc-patch/ 补配套 libc6-dev。

禁用公网源.disabled-qy,防止 apt 偏好选到"下不下来的新版本"。

防误升内核:禁用 unattended-upgrades + hold 内核元包,避免 DKMS 模块失效。

keyring:拷到 /usr/share/keyrings/,杜绝 NO_PUBKEY。

pipefail 误判:修复 cmd | grep -q 在 pipefail 下的 SIGPIPE 误判。

一句话总结:离线源的部署,本质是"b破循环依赖 → dpkg-scanpackages 原位建源 → 挂 vendor local-repo → 禁用公网只走本地"四步闭环,再叠上版本感知、状态硬校验、幂等续装三道保险,就稳了。

相关学习资料