mirror of
https://git.yoctoproject.org/poky
synced 2026-07-16 03:47:03 +00:00
52cad1fe64
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>
84 lines
2.3 KiB
Bash
Executable File
84 lines
2.3 KiB
Bash
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
|