Here's my updated mount script. I had problems adding @watchmeexplode5's pull that creates a single config file. Adds support for vfs local caching and also changed the mount defaults, which for me, has significantly improved playback and skipping:
Edit: I just spotted I've hardcoded the cache size at 400GB - I'll make this configurable when I have time to sort out github.
#!/bin/bash
######################
#### Mount Script ####
######################
### Version 0.96.8 ###
######################
####### EDIT ONLY THESE SETTINGS #######
# INSTRUCTIONS
# 1. Change the name of the rclone remote and shares to match your setup
# 2. NOTE: enter RcloneRemoteName WITHOUT ':'
# 3. Optional: include custom command and bind mount settings
# 4. Optional: include extra folders in mergerfs mount
# REQUIRED SETTINGS
RcloneRemoteName="tdrive_vfs"
RcloneMountShare="/mnt/user/mount_rclone"
LocalFilesShare="/mnt/user/local"
MergerfsMountShare="/mnt/user/mount_mergerfs"
DockerStart="duplicati lazylibrarian LDAPforPlex letsencrypt nzbget ombi organizrv2 plex qbittorrentvpn radarr radarr-uhd radarr-collections sonarr sonarr-uhd tautulli"
MountFolders=\{"downloads/complete,downloads/seeds,documentaries/kids,documentaries/adults,movies_adults_gd,movies_kids_gd,tv_adults_gd,tv_kids_gd,uhd/tv_adults_gd,uhd/tv_kids_gd,uhd/documentaries/kids,uhd/documentaries/adults"\}
# OPTIONAL SETTINGS
# Add extra paths to mergerfs mount in addition to LocalFilesShare
LocalFilesShare2="/mnt/user/mount_rclone/gdrive_media_vfs" # without trailing slash e.g. /mnt/user/other__remote_mount/or_other_local_folder. Enter 'ignore' to disable
LocalFilesShare3=""
LocalFilesShare4=""
LocalFilesShare5=""
LocalFilesShare6=""
# Add extra commands or filters
Command1="--rc"
Command2=""
Command3=""
Command4=""
Command5=""
Command6=""
Command7=""
Command8=""
CreateBindMount="N" # Y/N. Choose whether to bind traffic to a particular network adapter
RCloneMountIP="192.168.1.252" # My unraid IP is 172.30.12.2 so I create another similar IP address
NetworkAdapter="eth0" # choose your network adapter. eth0 recommended
VirtualIPNumber="2" # creates eth0:x e.g. eth0:1. I create a unique virtual IP addresses for each mount & upload so I can monitor and traffic shape for each of them
####### END SETTINGS #######
###############################################################################
##### DO NOT EDIT ANYTHING BELOW UNLESS YOU KNOW WHAT YOU ARE DOING #######
###############################################################################
####### Preparing mount location variables #######
LocalFilesLocation="$LocalFilesShare/$RcloneRemoteName"
RcloneMountLocation="$RcloneMountShare/$RcloneRemoteName"
MergerFSMountLocation="$MergerfsMountShare/$RcloneRemoteName"
####### create directories for rclone mount and mergerfs mounts #######
mkdir -p /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName #for script files
mkdir -p /mnt/user0/mount_rclone/cache/$RcloneRemoteName #for cache files
if [[ $LocalFileShare == 'ignore' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Not creating local folders as requested."
else
echo "$(date "+%d.%m.%Y %T") INFO: Creating local folders."
eval mkdir -p $LocalFilesLocation/"$MountFolders"
fi
mkdir -p $RcloneMountLocation
mkdir -p $MergerFSMountLocation
####### Check if script is already running #######
echo "$(date "+%d.%m.%Y %T") INFO: *** Starting mount of remote ${RcloneRemoteName}"
echo "$(date "+%d.%m.%Y %T") INFO: Checking if this script is already running."
if [[ -f "/mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running" ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Exiting script as already running."
exit
else
echo "$(date "+%d.%m.%Y %T") INFO: Script not running - proceeding."
touch /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
fi
####### Create Rclone Mount #######
# Check If Rclone Mount Already Created
if [[ -f "$RcloneMountLocation/mountcheck" ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Success ${RcloneRemoteName} remote is already mounted."
else
echo "$(date "+%d.%m.%Y %T") INFO: Mount not running. Will now mount ${RcloneRemoteName} remote."
# Creating mountcheck file in case it doesn't already exist
echo "$(date "+%d.%m.%Y %T") INFO: Recreating mountcheck file for ${RcloneRemoteName} remote."
touch mountcheck
rclone copy mountcheck $RcloneRemoteName: -vv --no-traverse
# Check bind option
if [[ $CreateBindMount == 'Y' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: *** Checking if IP address ${RCloneMountIP} already created for remote ${RcloneRemoteName}"
ping -q -c2 $RCloneMountIP > /dev/null # -q quiet, -c number of pings to perform
if [ $? -eq 0 ]; then # ping returns exit status 0 if successful
echo "$(date "+%d.%m.%Y %T") INFO: *** IP address ${RCloneMountIP} already created for remote ${RcloneRemoteName}"
else
echo "$(date "+%d.%m.%Y %T") INFO: *** Creating IP address ${RCloneMountIP} for remote ${RcloneRemoteName}"
ip addr add $RCloneMountIP/24 dev $NetworkAdapter label $NetworkAdapter:$VirtualIPNumber
fi
echo "$(date "+%d.%m.%Y %T") INFO: *** Created bind mount ${RCloneMountIP} for remote ${RcloneRemoteName}"
else
RCloneMountIP=""
echo "$(date "+%d.%m.%Y %T") INFO: *** Creating mount for remote ${RcloneRemoteName}"
fi
# create rclone mount
rclone mount \
--allow-other \
--dir-cache-time 720h \
--log-level INFO \
--poll-interval 15s \
--cache-dir=/mnt/user0/mount_rclone/cache/$RcloneRemoteName \
--vfs-cache-mode full \
--vfs-cache-max-size 400G \
--vfs-cache-max-age 336h \
--bind=$RCloneMountIP \
$RcloneRemoteName: $RcloneMountLocation &
# Check if Mount Successful
echo "$(date "+%d.%m.%Y %T") INFO: sleeping for 5 seconds"
# slight pause to give mount time to finalise
sleep 10
echo "$(date "+%d.%m.%Y %T") INFO: continuing..."
if [[ -f "$RcloneMountLocation/mountcheck" ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Successful mount of ${RcloneRemoteName} mount."
else
echo "$(date "+%d.%m.%Y %T") CRITICAL: ${RcloneRemoteName} mount failed - please check for problems."
docker stop $DockerStart
find /mnt/user/appdata/other/rclone/remotes -name mount_running* -delete
rm /mnt/user/appdata/other/scripts/running/fast_check
exit
fi
fi
####### Start MergerFS Mount #######
if [[ $MergerfsMountShare == 'ignore' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Not creating mergerfs mount as requested."
else
if [[ -f "$MergerFSMountLocation/mountcheck" ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Check successful, ${RcloneRemoteName} mergerfs mount in place."
else
# check if mergerfs already installed
if [[ -f "/bin/mergerfs" ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs already installed, proceeding to create mergerfs mount"
else
# Build mergerfs binary
echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs not installed - installing now."
mkdir -p /mnt/user/appdata/other/rclone/mergerfs
docker run -v /mnt/user/appdata/other/rclone/mergerfs:/build --rm trapexit/mergerfs-static-build
mv /mnt/user/appdata/other/rclone/mergerfs/mergerfs /bin
# check if mergerfs install successful
echo "$(date "+%d.%m.%Y %T") INFO: *sleeping for 5 seconds"
sleep 10
if [[ -f "/bin/mergerfs" ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs installed successfully, proceeding to create mergerfs mount."
else
echo "$(date "+%d.%m.%Y %T") ERROR: Mergerfs not installed successfully. Please check for errors. Exiting."
docker stop $DockerStart
find /mnt/user/appdata/other/rclone/remotes -name mount_running* -delete
rm /mnt/user/appdata/other/scripts/running/fast_check
exit
fi
fi
# Create mergerfs mount
echo "$(date "+%d.%m.%Y %T") INFO: Creating ${RcloneRemoteName} mergerfs mount."
# Extra Mergerfs folders
if [[ $LocalFilesShare2 != 'ignore' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare2} to ${RcloneRemoteName} mergerfs mount."
LocalFilesShare2=":$LocalFilesShare2"
else
LocalFilesShare2=""
fi
if [[ $LocalFilesShare3 != 'ignore' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare3} to ${RcloneRemoteName} mergerfs mount."
LocalFilesShare3=":$LocalFilesShare3"
else
LocalFilesShare3=""
fi
if [[ $LocalFilesShare4 != 'ignore' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare4} to ${RcloneRemoteName} mergerfs mount."
LocalFilesShare4=":$LocalFilesShare4"
else
LocalFilesShare4=""
fi
if [[ $LocalFilesShare5 != 'ignore' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare5} to ${RcloneRemoteName} mergerfs mount."
LocalFilesShare5=":$LocalFilesShare5"
else
LocalFilesShare5=""
fi
if [[ $LocalFilesShare6 != 'ignore' ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare6} to ${RcloneRemoteName} mergerfs mount."
LocalFilesShare6=":$LocalFilesShare6"
else
LocalFilesShare6=""
fi
# mergerfs mount command
mergerfs $LocalFilesLocation:$RcloneMountLocation$LocalFilesShare2$LocalFilesShare3$LocalFilesShare4$LocalFilesShare5$LocalFilesShare6 $MergerFSMountLocation -o rw,async_read=false,use_ino,allow_other,func.getattr=newest,category.action=all,category.create=ff,cache.files=partial,dropcacheonclose=true
# check if mergerfs mount successful
echo "$(date "+%d.%m.%Y %T") INFO: Checking if ${RcloneRemoteName} mergerfs mount created."
if [[ -f "$MergerFSMountLocation/mountcheck" ]]; then
echo "$(date "+%d.%m.%Y %T") INFO: Check successful, ${RcloneRemoteName} mergerfs mount created."
else
echo "$(date "+%d.%m.%Y %T") CRITICAL: ${RcloneRemoteName} mergerfs mount failed."
docker stop $DockerStart
find /mnt/user/appdata/other/rclone/remotes -name mount_running* -delete
rm /mnt/user/appdata/other/scripts/running/fast_check
exit
fi
fi
fi
####### Starting Dockers That Need Mergerfs Mount To Work Properly #######
echo "$(date "+%d.%m.%Y %T") INFO: Starting dockers."
docker start $DockerStart
rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
echo "$(date "+%d.%m.%Y %T") INFO: ${RcloneRemoteName} Script complete"
exit