Containers and running legacy code

Learning Objectives

  • Understand how to use containers to run code requiring older operating systems

When running code at LHCb there are several scenarios where a user may have to run legacy code intended for an older OS. The most recent operating systems used is Redhat Enterprise Linux 9 (RHEL9). There are however, different alternatives to this OS which are roughly equivalent e.g. AlmaLinux 9, Rocky Linux 9.

There are a few situations where you may need to run legacy code e.g.

  • Running code from an older analysis

  • Often times the code used by the Simulation working group requires older operating systems as well

The previously-used operating systems used by lxplus are listed below. If not RHEL9, the OS you need will almost certainly be one of thse two:

  • Centos7 - Retired in 2023

  • Scientific Linux CERN 6 (SLC6) - Retired in 2018

Running simulation

The simulation framework is a common place where older operating systems are needed these are:

 | Simulation framework | Required OS |
 | -------------------- | ----------- |
 | Sim10                | Centos7     |
 | Sim09                | SLC6        |

When running legacy code, it is not necessary to find a machine which runs the older OS nor is it necessary to make a virtual machine using the older OS. Instead we can use containers! Containers are virtualisation software which will allow for multiple operating systems to be run on the same machine, so in this case a machine running RHEL9 can instead use another OS for a while as if it were just another environment.

The software used on lxplus to jump from one OS to another is called apptainer. To be able to run centos7 software on a RHEL9 machine the following command can be used and adapted:

apptainer exec --env LBENV_SOURCED= -B /afs/cern.ch/user -B /afs/cern.ch/work -B /cvmfs -e /cvmfs/lhcb.cern.ch/containers/os-base/centos7-devel/prod/amd64 bash --rcfile /cvmfs/lhcb.cern.ch/lib/LbEnv

We can break down this command in the following way:

 | Command                                | Explanation                                                     |
 | -------------------------------------- | --------------------------------------------------------------- |
 | Apptainer                              | The command being run.                                          |
 | exec -e <the centos7 environment> bash | Run a bash session with centos7.                                |
 | -B <directory>                         | These are 'binds', any directory (and its subdirectories) which |
 |                                        | should be visible within the container need to be specified.    |
 | --rcfile <group_login>                 | Specifies that LbEnv should be sourced.                         |
 | --env LBENV_SOURCED=                   | Resets the LBENV_SOURCED environment variable to reload LbEnv   |

The full list of available platforms is listed here[^1]:

| Platform | Location                                                        |
| -------- | --------------------------------------------------------------- |
| slc5     | /cvmfs/lhcb.cern.ch/containers/os-base/slc6-devel/prod/amd64    |
| slc6     | /cvmfs/lhcb.cern.ch/containers/os-base/slc6-devel/prod/amd64    |
| centos7  | /cvmfs/lhcb.cern.ch/containers/os-base/centos7-devel/prod/amd64 |
| el9      | /cvmfs/lhcb.cern.ch/containers/os-base/alma9-devel/prod/amd64   |

Checking your OS

At any point the OS you are using can be checked with the command cat /etc/system-release

  • Try it now both in a RHEL9 environment and a singularity running Centos7 to see the operating system change!

Warning: minimal use and stability

One thing to bear in mind about using containers is that they will be less stable than the default OS on your machine. For this reason it is recommended to only use the containers to run code requiring that OS and do everything else (e.g. git stuff) outside of the container. This is especially true for containers of older systems such as SLC5 and SLC6.

[^1]: It’s also possible to get an el9 (i.e. RHEL9) platform. This allows a system running a different linux distro locally (e.g. Ubuntu, Fedora, Arch, …) to run software compiled for EL9!