Open
Description
This is a (basic) script to create and populate a CVMFS alien cache for use on systems that do not have access to the internet (but you do require internet access to perform the initial run of the script).
# Set group (as required, useful if you would like to share the cache with others)
MYGROUP=$GROUPS
# Set user
MYUSER=$USER
# Set path to shared space
SHAREDSPACE="/path/to/shared/space"
# Set path to (node) local space to store a local alien cache (e.g., /tmp or /dev/shm)
# WARNING: This directory needs to exist on the nodes where you will mount or you will
# get a binding error from Singularity!
LOCALSPACE="/tmp"
# Chose the Singularity image to use
STACK="2020.12"
SINGULARITY_REMOTE="client-pilot:centos7-$(uname -m)"
#########################################################################
# Variables below this point can be changed (but they don't need to be) #
#########################################################################
SINGULARITY_IMAGE="$SHAREDSPACE/$MYGROUP/$MYUSER/${SINGULARITY_REMOTE/:/_}.sif"
# Set text colours for info on commands being run
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
# Make the directory structures
SINGULARITY_CVMFS_ALIEN="$SHAREDSPACE/$MYGROUP/alien_$STACK"
mkdir -p $SINGULARITY_CVMFS_ALIEN
SINGULARITY_HOMEDIR="$SHAREDSPACE/$MYGROUP/$MYUSER/home"
mkdir -p $SINGULARITY_HOMEDIR
##################################################
# No more variable definitions beyond this point #
##################################################
# Pull the container
if [ ! -f $SINGULARITY_IMAGE ]; then
echo -e "${YELLOW}\nPulling singularity image\n${NC}"
singularity pull $SINGULARITY_IMAGE docker://eessi/$SINGULARITY_REMOTE
fi
# Create a default.local file in the users home
# We use a tiered cache, with a shared alien cache and a local alien cache.
# We populate the shared alien cache and that is used to fill the local
# alien cache (which is usually in a space that gets cleaned up like /tmp or /dev/shm)
if [ ! -f $SINGULARITY_HOMEDIR/default.local ]; then
echo -e "${YELLOW}\nCreating CVMFS configuration for shared and local alien caches\n${NC}"
echo "# Custom settings" > $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_WORKSPACE=/var/lib/cvmfs" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_PRIMARY=hpc" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_hpc_TYPE=tiered" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_hpc_UPPER=local" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_hpc_LOWER=alien" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_hpc_LOWER_READONLY=yes" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_local_TYPE=posix" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_local_SHARED=no" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_local_QUOTA_LIMIT=-1" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_local_ALIEN=\"/local_alien\"" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_alien_TYPE=posix" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_alien_SHARED=no" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_alien_QUOTA_LIMIT=-1" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_CACHE_alien_ALIEN=\"/shared_alien\"" >> $SINGULARITY_HOMEDIR/default.local
echo "CVMFS_HTTP_PROXY=\"INVALID-PROXY\"" >> $SINGULARITY_HOMEDIR/default.local
fi
# Environment variables
export EESSI_CONFIG="container:cvmfs2 cvmfs-config.eessi-hpc.org /cvmfs/cvmfs-config.eessi-hpc.org"
export EESSI_PILOT="container:cvmfs2 pilot.eessi-hpc.org /cvmfs/pilot.eessi-hpc.org"
export SINGULARITY_HOME="$SINGULARITY_HOMEDIR:/home/$MYUSER"
export SINGULARITY_SCRATCH="/var/lib/cvmfs,/var/run/cvmfs"
export SINGULARITY_BIND="$SINGULARITY_CVMFS_ALIEN:/shared_alien,$LOCALSPACE:/local_alien"
# Create a dirTab file so we only cache the stack we are interested in using
if [ ! -f $SINGULARITY_HOMEDIR/dirTab.$STACK ]; then
# We will only use this workspace until we have built our dirTab file
# (this is required because the Singularity scratch dirs are just 16MB,
# i.e., not enough to cache what we need to run the python script below.
# Once we have an alien cache this is no longer a concern)
export SINGULARITY_WORKDIR=$(mktemp -d)
platform=$(uname -m)
if [[ $(uname -s) == 'Linux' ]]; then
os_type='linux'
else
os_type='macos'
fi
# Find out which software directory we should be using (grep used to filter warnings)
arch_dir=$(singularity exec --fusemount "$EESSI_CONFIG" --fusemount "$EESSI_PILOT" $SINGULARITY_IMAGE /cvmfs/pilot.eessi-hpc.org/${STACK}/compat/${os_type}/${platform}/usr/bin/python3 /cvmfs/pilot.eessi-hpc.org/${STACK}/init/eessi_software_subdir_for_host.py /cvmfs/pilot.eessi-hpc.org/${STACK} | grep ${platform})
# Construct our dirTab the alien cache is populated with the software we require
echo -e "${YELLOW}\nCreating CVMFS dirTab for $STACK alien cache\n${NC}"
echo "/$STACK/init" > $SINGULARITY_HOMEDIR/dirTab.$STACK
echo "/$STACK/tests" >> $SINGULARITY_HOMEDIR/dirTab.$STACK
echo "/$STACK/compat/${os_type}/${platform}" >> $SINGULARITY_HOMEDIR/dirTab.$STACK
echo "/$STACK/software/${arch_dir}" >> $SINGULARITY_HOMEDIR/dirTab.$STACK
# Now clean up the workspace
rm -r $SINGULARITY_WORKDIR
unset SINGULARITY_WORKDIR
fi
# Download the script for populating the alien cache
if [ ! -f $SINGULARITY_HOMEDIR/cvmfs_preload ]; then
echo -e "${YELLOW}\nGetting CVMFS preload script\n${NC}"
singularity exec $SINGULARITY_IMAGE curl https://cvmrepo.web.cern.ch/cvmrepo/preload/cvmfs_preload -o /home/$MYUSER/cvmfs_preload
fi
# Get the public keys for our repos
if [ ! -f $SINGULARITY_HOMEDIR/pilot.eessi-hpc.org.pub ]; then
echo -e "${YELLOW}\nGetting CVMFS repositories public keys\n${NC}"
export SINGULARITY_WORKDIR=$(mktemp -d)
singularity exec --fusemount "$EESSI_CONFIG" --fusemount "$EESSI_PILOT" $SINGULARITY_IMAGE cp /cvmfs/cvmfs-config.eessi-hpc.org/etc/cvmfs/keys/eessi-hpc.org/pilot.eessi-hpc.org.pub /home/$MYUSER/
singularity exec --fusemount "$EESSI_CONFIG" --fusemount "$EESSI_PILOT" $SINGULARITY_IMAGE cp /etc/cvmfs/keys/eessi-hpc.org/cvmfs-config.eessi-hpc.org.pub /home/$MYUSER/
# Now clean up the workspace
rm -r $SINGULARITY_WORKDIR
unset SINGULARITY_WORKDIR
fi
# Populate the alien cache (the connections to these can fail and may need to be restarted)
# (A note here: this is an expensive operation and puts a heavy load on the Stratum 0. From the developers:
# "With the -u <url> preload parameter, you can switch between stratum 0 and stratum 1 as necessary. I'd not
# necessarily use the stratum 1 for the initial snapshot though because the replication thrashes the stratum
# 1 cache. Instead, for preloading I'd recommend to establish a dedicated URL. This URL can initially be simply
# an alias to the stratum 0. As long as there are only a handful of preload destinations, that should work fine. If
# more sites preload, this URL can turn into a dedicated stratum 1 or a large cache in front of the stratum 0.
# ")
echo -e "${YELLOW}\nPopulating CVMFS alien cache\n${NC}"
singularity exec $SINGULARITY_IMAGE sh /home/$MYUSER/cvmfs_preload -u http://cvmfs-s0.eessi-hpc.org/cvmfs/cvmfs-config.eessi-hpc.org -r /shared_alien -k /home/$MYUSER/cvmfs-config.eessi-hpc.org.pub
# We use the dirTab file for the software repo to limit what we pull in
singularity exec $SINGULARITY_IMAGE sh /home/$MYUSER/cvmfs_preload -u http://cvmfs-s0.eessi-hpc.org/cvmfs/pilot.eessi-hpc.org -r /shared_alien -k /home/$MYUSER/pilot.eessi-hpc.org.pub -d /home/$MYUSER/dirTab.$STACK
# Now that we have a populated alien cache we can use it
export SINGULARITY_BIND="$SINGULARITY_CVMFS_ALIEN:/shared_alien,$LOCALSPACE:/local_alien,$SINGULARITY_HOMEDIR/default.local:/etc/cvmfs/default.local"
# Get a shell
echo -e "${YELLOW}\nTo get a shell inside a singularity container (for example), use:\n${NC}"
echo -e " export EESSI_CONFIG=\"$EESSI_CONFIG\""
echo -e " export EESSI_PILOT=\"$EESSI_PILOT\""
echo -e " export SINGULARITY_HOME=\"$SINGULARITY_HOME\""
echo -e " export SINGULARITY_BIND=\"$SINGULARITY_BIND\""
echo -e " export SINGULARITY_SCRATCH=\"/var/lib/cvmfs,/var/run/cvmfs\""
echo -e " singularity shell --fusemount \"\$EESSI_CONFIG\" --fusemount \"\$EESSI_PILOT\" $SINGULARITY_IMAGE"