ARTICLE · 1054745
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 源 | dpkg-scanpackages | |
| vendor local-repo | ||
| bdpkg-dev |
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 | |
| install_kernel_6.8.0-71_offline.sh | |
| sync_time.sh | |
| gpu_stress |
① offline_install.sh —— 主安装(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 → 禁用公网只走本地"四步闭环,再叠上版本感知、状态硬校验、幂等续装三道保险,就稳了。