CernVM-FS, the Compute Canada model, and EESSI - how scientific software actually reaches the machines that run it
2026-08-08
Your cluster runs an enterprise distribution because the vendor supports the interconnect, the parallel filesystem and the GPU driver against that kernel and no other. The cost is a frozen userland.
| Distribution | Kernel | GCC | glibc | Python |
|---|---|---|---|---|
| RHEL / Rocky 8 | 4.18 | 8.4 | 2.28 | 3.9.2 |
| RHEL / Rocky 9 | 5.14 | 11.2.1 | 2.34 | 3.9.10 |
| Fedora 41 | 6.11 | 14.2.1 | 2.40 | 3.13.0 |
The first two rows are what you run. The third is what your users’ documentation assumes.
sudo dnf install ... on a login node, and the sudoers lectureThe effort is real, the people are good, and almost all of it is duplicated.
It is how many times. The tree gets built either way.
Users should be presented with an interface that is as consistent and as easy to use as possible across all sites. It should also offer optimal performance.
— Digital Research Alliance of Canada
Two things the word reproducible is doing at once:
A container is a distribution format, not a derivation. Freezing an unknown does not make it known.
Containers stay in the picture. They carry an OS and a mount point, not a stack.
A read-only directory under /cvmfs that behaves like an on-demand streaming service. Nothing installed, nothing downloaded up front - files arrive when a process opens them.
Exactly one object is signed. Everything else is reachable from it by content hash.
C7d1e... # root catalog, by content hash
B1179648 # its size in bytes
Xf3a9... # hash of the signing certificate
T1747526400 # when this revision was published
D240 # how long a client may cache it
S5348 # revision number
Nsoftware.eessi.io # fully qualified repository name
-- # everything below is the signature
The transport does not need to be trusted. A proxy, a mirror or a disk can be wrong without the client being wrong.
cvmfs_server transaction software.example.org
# ... install ...
cvmfs_server publish -a r-4.5.1 -m 'R 4.5.1, foss/2023a' software.example.org
cvmfs_server abort software.example.org # throws it all away
cvmfs_server rollback -t r-4.5.1 # go back to a named revision
Every publish is an immutable revision. There is no half-published state for a client to catch.
# /etc/cvmfs/default.local
CVMFS_HTTP_PROXY="http://proxy-a:3128|http://proxy-b:3128"
CVMFS_QUOTA_LIMIT=10000 # 10 GB of local cache
CVMFS_CACHE_BASE=/ssd/cvmfs # the fastest disk the node has
sudo cvmfs_config reload
ls /cvmfs/software.eessi.io # mounted on demand by autofs
/cvmfs treeImporting one Python package touches ~3,500 files / ~1.1 GB, most of them tiny.
| Where the software lives | Time to import |
|---|---|
| Local SSD or ramdisk | ~2 s (the floor) |
| GPFS / Lustre | 30-60 s, even with a hot pagepool |
| CernVM-FS, cold cache, near Stratum 1 + proxy | dramatically better |
| CernVM-FS, warm client cache | approx. local disk |
The catalogue grows without bound because nothing pays for the parts it does not open.
Three configurations, two programmes, one working architecture each time - and the layers above and below did not change when it was swapped.
This converts a technology bet into an architectural choice.
A full OS userland installed somewhere other than / - its own loader, glibc, coreutils, bash, autotools - built from source, without root.
Gentoo Prefix: no symlinks, no store leak, minimal solution.
— Digital Research Alliance of Canada, on the 2020 migration
patchelf --set-interpreterLD_LIBRARY_PATH=/usr/lib64 in a .bashrc breaks most tools$EPREFIX/var versus /var - who and last read an empty filelibstdc++, so GCCcore builds collapse to one module levelEvery site hits these in the same order. That is a much better position than a set nobody has written down.
The easyconfig is copied into the installation. Provenance is a by-product, not a chore.
$ module load fftw
Lmod has detected the following error: These module(s) exist but cannot be
loaded as requested: "fftw"
$ module spider fftw/3.3.10
You will need to load all module(s) on one of the lines below first:
gcc/12.3 openmpi/4.1.5
$ module load gcc/12.3 openmpi/4.1.5 fftw/3.3.10
~1,000 applications × 4 CPU generations × 4 GPU generations = 10,000+ permutations. The user sees fftw/3.3.10.
# the Alliance stack - public, mountable anywhere
source /cvmfs/soft.computecanada.ca/config/profile/bash.sh
module load StdEnv/2023
# EESSI - in the default CernVM-FS config since November 2023
source /cvmfs/software.eessi.io/versions/2023.06/init/bash
module load R/4.3.2-gfbf-2023a
| Environment | Compiler | MPI | What changed |
|---|---|---|---|
| StdEnv/2016.4 | GCC 5.4 / Intel 2016.4 | OMPI 2.1.1 | First unified environment |
| StdEnv/2018.3 | GCC 7.3 / Intel 2018.3 | OMPI 3.1.2 | First AVX-512 |
| StdEnv/2020 | GCC 9.3 / Intel 2020.1 | OMPI 4.0.3 | Nix → Gentoo Prefix |
| StdEnv/2023 | GCC 12.3 / Intel 2023.1 | OMPI 4.1.5 | GCC default; min AVX2; FlexiBLAS; CUDA 12 |
Already a qualification pipeline, whether or not anyone calls it one.
| Architecture | Targets |
|---|---|
| x86_64 / AMD | zen2, zen3, zen4, zen5 |
| x86_64 / Intel | haswell, skylake_avx512, cascadelake, icelake, sapphirerapids |
| aarch64 | neoverse_n1, neoverse_v1, a64fx, nvidia/grace |
| riscv64 | separate development repository |
Validated with a ReFrame test suite a site runs against its own mount.
“We moved to Arm” stops being a recompile and a revalidation.
CUDA’s licence permits redistributing runtime libraries only - so nvcc is a symlink into a local SDK.
The method has transferred between programmes that share no staff, funding or hardware - and is now transferring back.
| What it says | What it means |
|---|---|
Too many levels of symbolic links |
Mount namespace not shared. Almost always a container. |
No such file or directory |
A catalog could not load. The reason is in the syslog. |
Transport endpoint is not connected |
The client died and the watchdog did not restart it. |
Software caused connection abort |
The kernel cut the FUSE connection. Remount. |
cvmfs_config probe software.eessi.io # is it reachable at all
cvmfs_config stat -v software.eessi.io # revision, cache use, hit rate
cvmfs_config showconfig software.eessi.io # what it thinks it was told
cvmfs_talk -i software.eessi.io ncleanup24 # cache evictions in 24h
sudo cvmfs_config wipecache # last resort, not first
If your nodes have no local disk, do not run one client and export it over NFS.
It can be made to work. It is slow. It generates more operational problems than any other configuration in the deployment guidance.
Use a loopback cache file on the shared filesystem instead.
None of this is novel and all of it is in production, at national scale, for around eighteen thousand researchers.
The useful conversation is not whether the model works - two national programmes have answered that - but which parts of it fit the estate you already have.