@@ -97,8 +97,8 @@ display_help() {
9797 echo " container; can be given multiple times [default: not set]"
9898 echo " -r | --repository CFG - configuration file or identifier defining the"
9999 echo " repository to use; can be given multiple times;"
100- echo " CFG may include a suffix ',access={ro,rw}' to"
101- echo " overwrite the global access mode for this repository"
100+ echo " CFG may include suffixes ',access={ro,rw},mode={bind,fuse }' to"
101+ echo " overwrite the global access and/or mount mode for this repository"
102102 echo " [default: software.eessi.io via CVMFS config available"
103103 echo " via default container, see --container]"
104104 echo " -u | --resume DIR/TGZ - resume a previous run from a directory or tarball,"
@@ -747,7 +747,11 @@ declare -a EESSI_FUSE_MOUNTS=()
747747# mount cvmfs-config repo (to get access to EESSI repositories such as software.eessi.io) unless env var
748748# EESSI_DO_NOT_MOUNT_CVMFS_CONFIG_CERN_CH is defined
749749if [ -z ${EESSI_DO_NOT_MOUNT_CVMFS_CONFIG_CERN_CH+x} ]; then
750- EESSI_FUSE_MOUNTS+=(" --fusemount" " container:cvmfs2 cvmfs-config.cern.ch /cvmfs/cvmfs-config.cern.ch" )
750+ if [[ -x $( command -v cvmfs_config) ]] && cvmfs_config probe cvmfs-config.cern.ch >& /dev/null; then
751+ BIND_PATHS=" ${BIND_PATHS} ,/cvmfs/cvmfs-config.cern.ch"
752+ else
753+ EESSI_FUSE_MOUNTS+=(" --fusemount" " container:cvmfs2 cvmfs-config.cern.ch /cvmfs/cvmfs-config.cern.ch" )
754+ fi
751755fi
752756
753757
@@ -756,25 +760,54 @@ for cvmfs_repo in "${REPOSITORIES[@]}"
756760do
757761 unset cfg_repo_id
758762 [[ ${VERBOSE} -eq 1 ]] && echo " add fusemount options for CVMFS repo '${cvmfs_repo} '"
759- # split into name and access mode if ',access=' in $cvmfs_repo
760- if [[ ${cvmfs_repo} == * " ,access=" * ]] ; then
761- cvmfs_repo_name=${cvmfs_repo/ ,access=*/ } # remove access mode specification
762- cvmfs_repo_access=${cvmfs_repo/* ,access=/ } # remove repo name part
763- else
764- cvmfs_repo_name=" ${cvmfs_repo} "
765- cvmfs_repo_access=" ${ACCESS} " # use globally defined access mode
766- fi
763+ # split into name, access mode, and mount mode
764+ readarray -td, cvmfs_repo_args <<< " $cvmfs_repo"
765+ cvmfs_repo_name=$( sed -e ' s/\\n//g' <<< " ${cvmfs_repo_args[0]}" )
766+ cvmfs_repo_access=" ${ACCESS} " # initialize to the default access mode
767+ for arg in ${cvmfs_repo_args[@]: 1} ; do
768+ if [[ $arg == " access=" * ]]; then
769+ cvmfs_repo_access=${arg/ access=}
770+ fi
771+ if [[ $arg == " mount=" * ]]; then
772+ cvmfs_repo_mount=${arg/ mount=}
773+ # check if the specified mount mode is a valid one
774+ if [[ ${cvmfs_repo_mount} != " bind" ]] && [[ ${cvmfs_repo_mount} != " fuse" ]]; then
775+ echo -e " ERROR: mount mode '${cvmfs_repo_mount} ' for CVMFS repository\n '${cvmfs_repo_name} ' is not known"
776+ exit ${REPOSITORY_ERROR_EXITCODE}
777+ fi
778+ fi
779+ done
780+
767781 # obtain cvmfs_repo_name from EESSI_REPOS_CFG_FILE if cvmfs_repo is in cfg_cvmfs_repos
768782 if [[ ${cfg_cvmfs_repos[${cvmfs_repo_name}]} ]]; then
769783 [[ ${VERBOSE} -eq 1 ]] && echo " repo '${cvmfs_repo_name} ' is not an EESSI CVMFS repository..."
770784 # cvmfs_repo_name is actually a repository ID, use that to obtain
771785 # the actual name from the EESSI_REPOS_CFG_FILE
772786 cfg_repo_id=${cvmfs_repo_name}
787+ echo " bob $cfg_repo_id "
773788 cvmfs_repo_name=$( cfg_get_value ${cfg_repo_id} " repo_name" )
789+ echo $cvmfs_repo_name
774790 fi
775791 # remove project subdir in container
776792 cvmfs_repo_name=${cvmfs_repo_name% " /${EESSI_DEV_PROJECT} " }
777793
794+ # if a mount mode was not specified, we use a bind mount if the repository is available on the host,
795+ # and otherwise we use a fuse mount
796+ if [[ -z ${cvmfs_repo_mount} ]]; then
797+ cvmfs_repo_mount=" fuse"
798+ if [[ -x $( command -v cvmfs_config) ]] && cvmfs_config probe ${cvmfs_repo_name} >& /dev/null; then
799+ cvmfs_repo_mount=" bind"
800+ fi
801+ fi
802+ [[ ${VERBOSE} -eq 1 ]] && echo " Using a ${cvmfs_repo_mount} mount for /cvmfs/${cvmfs_repo_name} "
803+ # if a bind mount was requested, check if the repository is really available on the host
804+ if [[ ${cvmfs_repo_mount} == " bind" ]]; then
805+ if [[ ! -x $( command -v cvmfs_config) ]] || ! cvmfs_config probe ${cvmfs_repo_name} >& /dev/null; then
806+ echo -e " ERROR: bind mount requested for CVMFS repository\n '${cvmfs_repo_name} ', but it cannot be probed on the host"
807+ exit ${REPOSITORY_ERROR_EXITCODE}
808+ fi
809+ fi
810+
778811 # always create a directory for the repository (e.g., to store settings, ...)
779812 mkdir -p ${EESSI_TMPDIR} /${cvmfs_repo_name}
780813
795828 echo " session. Will use it as left-most directory in 'lowerdir' argument for fuse-overlayfs."
796829
797830 # make the target CernVM-FS repository available under /cvmfs_ro
798- export EESSI_READONLY=" container:cvmfs2 ${cvmfs_repo_name} /cvmfs_ro/${cvmfs_repo_name} "
799-
800- EESSI_FUSE_MOUNTS+=(" --fusemount" " ${EESSI_READONLY} " )
831+ if [[ ${cvmfs_repo_mount} == " fuse" ]]; then
832+ export EESSI_READONLY=" container:cvmfs2 ${cvmfs_repo_name} /cvmfs_ro/${cvmfs_repo_name} "
833+ EESSI_FUSE_MOUNTS+=(" --fusemount" " ${EESSI_READONLY} " )
834+ elif [[ ${cvmfs_repo_mount} == " bind" ]]; then
835+ BIND_PATHS=" /cvmfs/${cvmfs_repo_name} :/cvmfs_ro/${cvmfs_repo_name} ,${BIND_PATHS} "
836+ fi
801837
802838 # now, put the overlay-upper read-only on top of the repo and make it available under the usual prefix /cvmfs
803839 if [[ " ${OVERLAY_TOOL} " == " fuse-overlayfs" ]]; then
827863 # basic "ro" access that doesn't require any fuseoverlay-fs
828864 echo " Mounting '${cvmfs_repo_name} ' 'read-only' without fuse-overlayfs."
829865
830- export EESSI_READONLY=" container:cvmfs2 ${cvmfs_repo_name} /cvmfs/${cvmfs_repo_name} "
866+ if [[ ${cvmfs_repo_mount} == " fuse" ]]; then
867+ export EESSI_READONLY=" container:cvmfs2 ${cvmfs_repo_name} /cvmfs/${cvmfs_repo_name} "
868+ EESSI_FUSE_MOUNTS+=(" --fusemount" " ${EESSI_READONLY} " )
869+ export EESSI_FUSE_MOUNTS
870+ elif [[ ${cvmfs_repo_mount} == " bind" ]]; then
871+ BIND_PATHS=" /cvmfs/${cvmfs_repo_name} ,${BIND_PATHS} "
872+ fi
831873
832- EESSI_FUSE_MOUNTS+=(" --fusemount" " ${EESSI_READONLY} " )
833- export EESSI_FUSE_MOUNTS
834874 fi
835875 elif [[ ${cvmfs_repo_access} == " rw" ]] ; then
836876 # use repo-specific overlay directories
840880 [[ ${VERBOSE} -eq 1 ]] && echo -e " TMP directory contents:\n$( ls -l ${EESSI_TMPDIR} ) "
841881
842882 # set environment variables for fuse mounts in Singularity container
843- export EESSI_READONLY=" container:cvmfs2 ${cvmfs_repo_name} /cvmfs_ro/${cvmfs_repo_name} "
844-
845- EESSI_FUSE_MOUNTS+=(" --fusemount" " ${EESSI_READONLY} " )
883+ if [[ ${cvmfs_repo_mount} == " fuse" ]]; then
884+ export EESSI_READONLY=" container:cvmfs2 ${cvmfs_repo_name} /cvmfs_ro/${cvmfs_repo_name} "
885+ EESSI_FUSE_MOUNTS+=(" --fusemount" " ${EESSI_READONLY} " )
886+ elif [[ ${cvmfs_repo_mount} == " bind" ]]; then
887+ BIND_PATHS=" /cvmfs/${cvmfs_repo_name} :/cvmfs_ro/${cvmfs_repo_name} ,${BIND_PATHS} "
888+ fi
846889
847890 if [[ " ${OVERLAY_TOOL} " == " fuse-overlayfs" ]]; then
848891 EESSI_WRITABLE_OVERLAY=" container:fuse-overlayfs"
0 commit comments