Siam AI · GPU Infrastructure

NVIDIA Mirror
Sync Policy

Selective mirroring of NVIDIA CUDA repositories — restricting OS versions, driver branches, and CUDA releases to what GPU servers actually run.

Updated 2026-08-25
Mirror: mirrors.siam.ai

Overview

The full NVIDIA CUDA mirror ships packages for every supported OS (Fedora, openSUSE, SLES, Ubuntu 12.04–24.04, RHEL, Debian, WSL…) and every CUDA and driver version going back years. A full mirror consumes 2–4 TB. Most of that serves zero machines here.

This policy narrows the sync to two Ubuntu LTS releases, seven recent CUDA versions, five driver branches, and the companion libraries GPU servers actually use. In production we run it in all-versions mode (every patch build kept, not just the latest), landing at ~500 GB on the 1 TB VM.

Single source of truth policy.yaml drives every script. Update the YAML, then run sync-mirror.sh.
Auto-checked and auto-synced A systemd timer runs sync-mirror.sh every Sunday 03:00 (Persistent=true, so a missed run fires on next boot). Each run re-fetches Packages.gz from NVIDIA and downloads only new or changed .deb files — no manual step.

Files

FilePurpose
setup.shOne-stop setup: nginx + web + timer + sync + DOCA
sync-mirror.shSelective sync from NVIDIA (self-contained, policy-based)
get-cuda-mirror.shInstall NVIDIA driver + CUDA on GPU nodes via mirror
policy.yamlSync policy — verified against Packages index
cleanup-mirror.shOne-time cleanup of existing full mirror
index.htmlMirror landing page (served by nginx at repo root) — reads status.json live
README.htmlThis page — sync policy reference (served alongside the mirror)
README.mdSetup + usage guide (Markdown source)
status.jsonGenerated by sync-mirror.sh each run — live driver/CUDA state the UI renders (not committed)

Sync Policy

Verified against the mirror's Packages index (Aug 2026).

OS

OSNotes
ubuntu2404Ubuntu 24.04 LTS — primary, dzt-hgx / oa-hgx nodes
ubuntu2204Ubuntu 22.04 LTS — secondary nodes

Excluded: ubuntu2004, rhel*, fedora*, opensuse*, sles*, wsl*, ubuntu1*

CUDA — rolling window

noble carries 8, jammy carries 15 The newest branches are the active window; anything older that is still on disk keeps being served until retention ages it out, which is why jammy lists a longer 11.x/12.x tail. NVIDIA ships CUDA 13.x for jammy (22.04) too — running 13.x there still needs a driver ≥ 580 available for that node.
Versionubuntu2404ubuntu2204
13-3✓✓
13-2✓✓
13-1✓✓
13-0✓✓
12-9✓✓
12-8✓✓
12-6✓✓
12-5✓✓
12-4—✓
12-3—✓
12-2—✓
12-1—✓
12-0—✓
11-8—✓
11-7—✓

Sub-packages synced per version: toolkit, libraries, compiler, runtime, cudart, nvcc, nvrtc, nvtx, cupti, gds-tools, cuBLAS, cuFFT, cuSolver, cuSparse, cuRAND, NPP, nvJPEG, cuFile, nvJitLink, nvFatbin

Excluded: cuda-samples, cuda-documentation, cuda-visual-tools, cuda-nvvp, nsight-systems, nsight-compute

Driver + Fabric Manager

FM version must match driver EXACT version — not just the branch. Same version for ubuntu2204 and ubuntu2404.

Driver + Fabric Manager come from the NVIDIA CUDA repo alone — the Ubuntu archive is deliberately no longer consulted. The archive publishes only one build per branch, so the day 580.173.02 shipped, 580.159.03 became unobtainable and a node reinstalled with the identical command got a different driver. NVIDIA's repo keeps the full build history (12 builds of 580 alone), every one FM-matched, and every intra-set dependency is exact-versioned (= <ver>) — so pinning one build cascades the whole set instead of being dragged forward.

BranchLatest buildMax CUDA toolkitBuilds keptSource
610610.57.0413.32mirror (NVIDIA)
595595.91.0713.24mirror (NVIDIA)
590590.48.0113.12mirror (NVIDIA)
580580.178.0413.05mirror (NVIDIA)
575575.57.0812.92mirror (NVIDIA)
570570.211.0112.85mirror (NVIDIA)

Every build listed under "Builds kept" stays installable by exact pin — that is the whole point of sourcing from NVIDIA. Both prop and -open kernel-module flavors are mirrored for every branch above.

Max CUDA toolkit A driver runs its own CUDA toolkit and every lower one (backward compatible) — e.g. driver 580 runs CUDA 13.0, 12.x and 11.x. The column shows the newest toolkit each branch supports.
FM-gated rolling window (auto) The branch list is not hardcoded. Each sync keeps the newest 5 branches at or above floor 570, and the newest 5 builds within each of them. The gate is an exact-version fabricmanager match in the NVIDIA index — not "the branch has some FM somewhere": a driver build whose version fabricmanager does not also ship is dropped, because FM depends the driver at the exact version and an unpaired build is simply not installable. Dropped branches stay served for a 30-day grace period, then are deleted — so the table above can list more branches than the window size while the extras serve out their grace. Tune with DRIVER_WINDOW_SIZE / DRIVER_FLOOR. Both this page and the landing page read these tables live from status.json (regenerated every sync), so new branches appear automatically.
bash
# Install with exact version pin (FM must match driver)
sudo apt install nvidia-driver-580-server=580.159.03-* nvidia-fabricmanager-580=580.159.03-*

# Verify versions match
dpkg-query -W -f='${Package} ${Version}\n' nvidia-driver-580-server nvidia-fabricmanager-580

DCGM 4 — CUDA 12 and 13

packages
datacenter-gpu-manager-4-cuda12
datacenter-gpu-manager-4-cuda13
datacenter-gpu-manager-4-core
datacenter-gpu-manager-4-multinode-cuda12/13
datacenter-gpu-manager-4-proprietary-cuda12/13
datacenter-gpu-manager-exporter

cuDNN — all (covers CUDA 11/12/13)

packages
cudnn9-cuda-11/12/13
libcudnn9-cuda-11/12/13
libcudnn9-dev-cuda-11/12/13
libcudnn9-jit-cuda-11/12/13
libcudnn9-static-cuda-12/13

NCCL — CUDA 12 and 13 only

Filter by apt version string containing +cuda12 or +cuda13.

Latest in mirror: libnccl2 2.29.7-1+cuda12.9 / 2.29.7-1+cuda13.2

TensorRT — all versions in mirror

TensorRT packages have no CUDA suffix in the package name. All versions in mirror (10.4–10.15) build against CUDA 12.6–13.x — matches our range, no filtering needed.

packages
libnvinfer10, libnvinfer-dev, libnvinfer-lean10, libnvinfer-dispatch10
libnvinfer-plugin10, libnvinfer-vc-plugin10
libnvonnxparsers10, tensorrt, tensorrt-libs, tensorrt-dev
python3-libnvinfer, python3-libnvinfer-dev

Excluded: libnvinfer-samples, libnvinfer-win-builder-resource10

DOCA-OFED — Ubuntu 22.04 and 24.04

Served from mirror at /mirror-repo/doca/<distro>/ (nginx: https://mirrors.siam.ai/doca/<distro>/).

Download source: developer.nvidia.com/doca-downloads
(Host-Server → DOCA-Host → Linux → x86_64 → doca-ofed → Ubuntu → 22.04 / 24.04)

Versionubuntu2404ubuntu2204
3.4.0✓✓
3.3.0✓✓
3.2.0✓✓
3.1.0✓✓
3.0.0✓✓
bash
# Download and store to mirror server (run on mirror server)
# ubuntu2404
wget "https://www.mellanox.com/downloads/DOCA/DOCA_v3.4.0/host/doca-host_3.4.0-085000-26.04-ubuntu2404_amd64.deb" \
  -O /mirror-repo/doca/ubuntu2404/doca-host_3.4.0-085000-26.04-ubuntu2404_amd64.deb

# ubuntu2204
wget "https://www.mellanox.com/downloads/DOCA/DOCA_v3.4.0/host/doca-host_3.4.0-085000-26.04-ubuntu2204_amd64.deb" \
  -O /mirror-repo/doca/ubuntu2204/doca-host_3.4.0-085000-26.04-ubuntu2204_amd64.deb

Install on GPU nodes via ./get-cuda-mirror.sh --doca=true (auto-detects distro, downloads from mirror).

Installing on GPU Nodes

Network install via mirror

bash
sudo ./get-cuda-mirror.sh --nvidia-driver=<BRANCH> --cuda-toolkit=<VERSION> [OPTIONS]
FlagValues
--nvidia-driver610, 595, 590, 580, 575, 570 current window
--open=true|falseKernel module flavor. Default auto: open on Turing+, FORCED open on Blackwell/B300 (proprietary can't run there), proprietary on Maxwell/Pascal/Volta — auto also keeps whatever flavor is already installed. true migrates off proprietary; false is for pre-Turing GPUs lspci didn't name, images with no lspci, or a 3rd-party module needing proprietary (never on NVLink5 — it depends on the open module)
--yesAssume yes for the driver-lineage swap prompt
--cuda-toolkit13-3, 13-2, 13-1, 13-0, 12-9, 12-8, 12-6, 12-5 noble; jammy reaches back to 11-7
--doca=trueInstall DOCA-OFED — combine with driver flags for one reboot
--doca-version3.4.0 (default)
--dcgm=trueInstall DCGM — auto-picks cuda12/cuda13 from --cuda-toolkit
--nvitop=trueInstall nvitop
--no-nv=trueDisable NVLink — reboot required
--mirror=falseUse official NVIDIA repo
--uninstallInteractive: pick installed components to remove
--uninstall=LISTRemove selected: driver,fabric,cuda,dcgm,doca,nvitop,all
--uninstall-all=trueAlias for --uninstall=all
bash
# Full HGX install (DOCA + driver + CUDA in one run, one reboot)
sudo ./get-cuda-mirror.sh --doca=true --nvidia-driver=580 --cuda-toolkit=13-0 --nvitop=true
sudo reboot

# Driver + CUDA only
sudo ./get-cuda-mirror.sh --nvidia-driver=595 --cuda-toolkit=13-2 --nvitop=true

# VM without NVLink
sudo ./get-cuda-mirror.sh --nvidia-driver=590 --cuda-toolkit=12-9 --nvitop=true --no-nv=true

# Uninstall — pick interactively from what's installed
sudo ./get-cuda-mirror.sh --uninstall

# Uninstall specific components / everything
sudo ./get-cuda-mirror.sh --uninstall=doca,driver
sudo ./get-cuda-mirror.sh --uninstall=all

Offline / air-gapped node (--local-install)

For a node with no mirror access at install time: pre-stage the .deb files from the mirror, copy them to the node, then run the same installer against the local repo — no official NVIDIA egress.

bash
# On a machine WITH mirror access: pull installer + the .deb set, copy to the node
wget https://mirrors.siam.ai/get-cuda-mirror.sh

# On the air-gapped node: install from the pre-staged local repo
sudo ./get-cuda-mirror.sh --local-install=true --nvidia-driver=580 --cuda-toolkit=13-0

Verify after reboot

bash
nvidia-smi -L | wc -l
systemctl status nvidia-fabricmanager
lsmod | grep nvidia_peermem
dcgm.dcgmi discovery -l

Mirror Sync Scripts

Self-contained selective sync — downloads Packages.gz from NVIDIA, matches package names against policy.yaml, downloads only matching .deb files, and generates local repo metadata with apt-ftparchive. No external dependency on cuda-repo-management.

1

Preview sync (dry-run)

bash
DRY_RUN=1 ./sync-mirror.sh
2

Run manually

bash
systemctl start cuda-mirror.service
3

Full setup (root, mirror server)

Installs nginx, web files, systemd service + weekly timer (Sunday 03:00), runs first sync, and downloads DOCA-OFED.

bash
sudo ./setup.sh --sync --doca --all-versions
4

Monitor logs

bash
journalctl -u cuda-mirror.service -f
5

One-time cleanup of existing full mirror

bash
DRY_RUN=1 ./cleanup-mirror.sh   # preview
DRY_RUN=0 ./cleanup-mirror.sh   # apply

Storage Impact

Two retention modes, both driven by the same policy.yaml. Production uses all-versions on the 1 TB VM.

All-versions production
~500 GB
~470 GB CUDA + ~2 GB DOCA · every patch build kept
≈ 50% of the 1 TB VM · ~500 GB free
Latest-only
~40–50 GB
Newest build of each package only · timer prunes the rest
For a small disk
Choosing a mode Run setup.sh --all-versions to keep every historical build (production). Omit the flag for latest-only — the weekly timer then prunes superseded versions on every run.

Notes

  • FM version must match driver branch — mismatch causes service start failure.
  • ubuntu2204 carries the same CUDA set as noble — CUDA 13.x is available for jammy too; running 13.x on jammy needs a driver ≥ 580 on that node.
  • DOCA-OFED must be installed before the driver (same run) so nvidia_peermem links at DKMS build time — then one reboot at the end.
  • --no-nv=true adds kernel blacklist — reboot required to take effect.
  • DCGM takes ~10–20s after boot to report GPU state.