Files
poky/meta/recipes-core/volatile-binds/files/mount-copybind
Luca Boccassi 52cad1fe64 mount-copybind: add MOUNT_COPYBIND_AVOID_OVERLAYFS env var to skip OverlayFS
In some cases we don't want to even attempt to set up OverlayFS, for
example because SELinux in enforcing mode would kill the process
attempting to use the mount. See:

https://lore.kernel.org/all/CA+FmFJBDwt52Z-dVGfuUcnRMiMtGPhK4cCQJ=J_fg0r3x-b6ng@mail.gmail.com/T/#mef98aa406324096d1889d3d467251f30456f403c

If MOUNT_COPYBIND_AVOID_OVERLAYFS=1 is set, skip directly to copy and
bind mount.

(From OE-Core rev: a8e7dca69054798b1c9843a0de889cef3e261c4f)

Signed-off-by: Luca Boccassi <luca.boccassi@microsoft.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2022-03-26 09:33:32 +00:00

2.3 KiB
Executable File

#!/bin/sh

Perform a bind mount, copying existing files as we do so to ensure the

overlaid path has the necessary content.

If the target is a directory and overlayfs is available (and the environment

variable MOUNT_COPYBIND_AVOID_OVERLAYFS=1 is not set), then an overlay mount

will be attempted first.

if [ $# -lt 2 ]; then echo >&2 "Usage: $0 spec mountpoint [OPTIONS]" exit 1 fi

e.g. /var/volatile/lib

spec=$1

e.g. /var/lib

mountpoint=$2

if [ $# -gt 2 ]; then options=$3 else options= fi

[ -n "$options" ] && options=",$options"

mkdir -p "${spec%/*}"

if [ -d "$mountpoint" ]; then

if [ -d "$spec" ]; then
    specdir_existed=yes
else
    specdir_existed=no
    mkdir "$spec"
    # If the $spec directory is created we need to take care that
    # the selinux context is correct
    if command -v selinuxenabled > /dev/null 2>&1; then
        if selinuxenabled; then
            restorecon "$spec"
        fi
    fi
fi

# Fast version of calculating `dirname ${spec}`/.`basename ${spec}`-work
overlay_workdir="${spec%/*}/.${spec##*/}-work"
mkdir "${overlay_workdir}"

# Try to mount using overlay, which is must faster than copying files.
# If that fails, fall back to slower copy.
if command -v selinuxenabled > /dev/null 2>&1; then
    if selinuxenabled; then
        mountcontext=",rootcontext=$(matchpathcon -n "$mountpoint")"
    fi
fi
if [ "$MOUNT_COPYBIND_AVOID_OVERLAYFS" = 1 ] || ! mount -t overlay overlay -olowerdir="$mountpoint",upperdir="$spec",workdir="$overlay_workdir""$mountcontext" "$mountpoint" > /dev/null 2>&1; then

    if [ "$specdir_existed" != "yes" ]; then
        cp -aPR "$mountpoint"/. "$spec/"
    fi

    mount -o "bind$options" "$spec" "$mountpoint"
    # restore the selinux context.
    if command -v selinuxenabled > /dev/null 2>&1; then
        if selinuxenabled; then
            restorecon -R "$mountpoint"
        fi
    fi
fi

elif [ -f "$mountpoint" ]; then if [ ! -f "$spec" ]; then cp -aP "$mountpoint" "$spec" fi

mount -o "bind$options" "$spec" "$mountpoint"
# restore the selinux context.
if command -v selinuxenabled > /dev/null 2>&1; then
    if selinuxenabled; then
        restorecon -R "$mountpoint"
    fi
fi

fi