From 2e31283b61aa5f4c2f0cee9b1cea8442f54b6b05 Mon Sep 17 00:00:00 2001 From: Sam Hardeman Date: Fri, 13 Mar 2026 00:37:28 +0100 Subject: [PATCH] Pre-refactor --- destroy-squash-image | 65 +++++++++++++++++++------- make-squash-image | 109 ++++++++++++++++++++++++++++++++----------- mount-squash-image | 30 +++++++++--- own | 2 +- umount-squash-image | 10 ++-- 5 files changed, 157 insertions(+), 59 deletions(-) diff --git a/destroy-squash-image b/destroy-squash-image index dc4f3a3..8bde37f 100755 --- a/destroy-squash-image +++ b/destroy-squash-image @@ -1,27 +1,56 @@ #!/bin/bash -DIR="$@" -DIR=$(readlink -f "$DIR") -DIR_SHORT=$(basename $DIR) +# Lackadaisical squashfs tools - Destroy +BIN_DIR=$(dirname "$(readlink -f "$0")") +DIR="$1" -if [[ -f "$DIR/.needs_mount" ]]; -then - echo "Not a SquashFS image, exiting." - exit 0 +if [[ -z "$DIR" ]]; then + echo "Usage: $0 " + exit 1 fi -echo "Destroying the existing SquashFS image." -echo "Copying data from the original directory." +DIR=$(readlink -f "$DIR") +DIR_SHORT=$(basename "$DIR") -echo "Using rsync... in 2 seconds." -sleep 2 -rsync -avz --progress "$DIR" "/tmp/$DIR_SHORT.tmp" +if [[ ! -f "$DIR/.needs_mount" ]]; then + if ! mountpoint -q "$DIR"; then + echo "Error: $DIR does not appear to be a SquashFS-backed directory (missing .needs_mount)." + exit 1 + fi +fi -umount-squash-image "$DIR" +# Disable systemd service +ESC_PATH=$(systemd-escape -p "$DIR") +SERVICE_NAME="squash-mount@-$ESC_PATH" -rm -rf "$DIR" -mv "/tmp/$DIR_SHORT.tmp" "$DIR" +echo "Disabling systemd service ($SERVICE_NAME)..." +sudo systemctl stop "$SERVICE_NAME" 2>/dev/null +sudo systemctl disable "$SERVICE_NAME" 2>/dev/null -rm -rf "$DIR/../.squashfs/$DIR_SHORT.img" -rm -rf "$DIR/../.squashfs/$DIR_SHORT" +# Ensure it is mounted to copy merged data +echo "Ensuring image is mounted to preserve data..." +"$BIN_DIR"/mount-squash-image "$DIR" 1>/dev/null 2>/dev/null + +echo "Destroying SquashFS image and restoring data to normal directory..." + +TEMP_DIR=$(mktemp -d) +# Copy data out (preserving all attributes) +sudo rsync -a "$DIR/" "$TEMP_DIR/" + +# Unmount the overlay and squashfs +echo "Unmounting..." +"$BIN_DIR"/umount-squash-image "$DIR" + +# Restore data to original location +echo "Restoring files..." +sudo rm -rf "$DIR" +sudo mv "$TEMP_DIR" "$DIR" + +# Cleanup hidden image and overlay files +OVERLAY_ROOT=$(readlink -f "${DIR}/..")/.squashfs/${DIR_SHORT} +echo "Cleaning up ${OVERLAY_ROOT}..." +sudo rm -rf "${OVERLAY_ROOT}.img" +sudo rm -rf "${OVERLAY_ROOT}" + +echo "Success: SquashFS image destroyed and data restored to $DIR." +exit 0 -echo "Your SquashFS image was deleted." diff --git a/make-squash-image b/make-squash-image index 4d33eeb..b6111e9 100755 --- a/make-squash-image +++ b/make-squash-image @@ -4,12 +4,29 @@ BIN_DIR=$(dirname "$(readlink -f "$0")") DIR=$1 +if [[ -z "$DIR" ]]; then + echo "Usage: $0 " + exit 1 +fi + test -d "$DIR" if [[ $? -ne 0 ]]; then echo Directory "$DIR" does not exist! - exit -1 + exit -1 fi +echo "You need support for FUSE, SquashFS, and OverlayFS." +echo "Checking your system for these requirements..." +for fs in fuse squashfs overlay; do + if ! grep -q "$fs" /proc/filesystems; then + echo "Loading $fs kernel module..." + if ! sudo modprobe "$fs"; then + echo "Error: $fs is not supported and could not be loaded." + exit 1 + fi + fi +done + DIRSIZE=$(du -s "$DIR") DIR=$(readlink -f "$DIR") @@ -32,57 +49,93 @@ echo "=========================================================================" echo "> DIR = \"$DIR\"" echo "> DIR_SHORT = \"$DIR_SHORT\"" echo "> OVERLAY_ROOT = \"$OVERLAY_ROOT\"" -echo "> OVERLAY_UPPER = \"$OVERLAY_LOWER\"" -echo "> OVERLAY_LOWER= \"$OVERLAY_UPPER\"" +echo "> OVERLAY_UPPER = \"$OVERLAY_UPPER\"" +echo "> OVERLAY_LOWER= \"$OVERLAY_LOWER\"" echo "> OVERLAY_WORK = \"$OVERLAY_WORK\"" echo "> OVERLAY_TARG = \"$OVERLAY_TARG\"" echo "=========================================================================" -# Make the dirs for the overlay mkdir -p "$OVERLAY_ROOT" -mkdir -p "$OVERLAY_UPPER" -mkdir -p "$OVERLAY_LOWER" -mkdir -p "$OVERLAY_WORK" -mkdir -p "$OVERLAY_TARG" # Check for existing image if test -f "${OVERLAY_ROOT}.img"; then - echo "We already have an existing image, updating i..." + echo "We already have an existing image, updating it..." + mount-squash-image "$DIR" + DIRSIZE=$(du -s "$DIR") RECREATE=true fi sudo mksquashfs "$DIR" "${OVERLAY_ROOT}.img.1" -noappend -comp xz if [ $RECREATE == true ]; then - echo "Copy created, now unmount and swap everything." - sudo rm -rf "$OVERLAY_UPPER" - sudo rm -rf "$OVERLAY_LOWER" - sudo rm -rf "$OVERLAY_WORK" - rm -rf "${OVERLAY_ROOT}.img" + echo "Copy created, now unmount and swap everything." + umount-squash-image "$DIR" + sudo rm -rf "$OVERLAY_UPPER" + sudo rm -rf "$OVERLAY_LOWER" + sudo rm -rf "$OVERLAY_WORK" + rm -rf "${OVERLAY_ROOT}.img" fi mv "${OVERLAY_ROOT}.img.1" "${OVERLAY_ROOT}.img" +# Make the dirs for the overlay +mkdir -p "$OVERLAY_UPPER" +mkdir -p "$OVERLAY_LOWER" +mkdir -p "$OVERLAY_WORK" +mkdir -p "$OVERLAY_TARG" + # Reset dir sudo rm -rf "$DIR" mkdir -p "$DIR" touch "${DIR}/.needs_mount" -echo "Your SquashFS-backed folder is ready for use." -echo "To mount it, either cd into it or use mount-squash-image." -echo "We recomnnend setting up a cronjob for that." -echo "" -echo "Should you wish to update the contents of the image with your changes made" -echo "imside of the folder, simply run make-squash-image again on the same" -echo "folder to update the imaghe." -echo -echo "To disable auto-mounting upon cd, pleas remove the" -echo "'.needs_mount' file to prevent that." -echo "To enable mount at-login, add something aking to this to cron:" -echo "\"@reboot /mount-squash-image \"" -echo echo "=========================================================================" echo "Storage data:" -echo "Uuncompressed: $DIRSIZE" +echo "Uncompressed: $DIRSIZE" echo " Compressed: $(du -s ${OVERLAY_ROOT}.img)" echo "=========================================================================" + +# Service content embedded +SERVICE_CONTENT="[Unit] +Description=SquashFS Mount for %I +After=local-fs.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=${BIN_DIR}/mount-squash-image %I +ExecStop=${BIN_DIR}/umount-squash-image %I + +[Install] +WantedBy=multi-user.target" + +echo "$SERVICE_CONTENT" | sudo tee /etc/systemd/system/squash-mount@.service > /dev/null +sudo systemctl daemon-reload + +ESC_PATH=$(systemd-escape -p "$DIR") +SERVICE_NAME="squash-mount@-$ESC_PATH" + +read -p "Do you want to auto-enable the mount service ($SERVICE_NAME)? [y/N] " yn +case $yn in + [Yy]* ) + echo "Enabling and starting service..." + sudo systemctl enable --now "$SERVICE_NAME" + sudo systemctl stop "$SERVICE_NAME" + sudo systemctl start "$SERVICE_NAME" + ;; + * ) + echo "To enable the service manually, run: sudo systemctl enable --now $SERVICE_NAME" + ;; +esac + +echo "" +echo "Your SquashFS-backed folder is ready for use." +echo "To mount it manually, either cd into it or use mount-squash-image." +echo "" +echo "Should you wish to update the contents of the image with your changes made" +echo "inside of the folder, simply run make-squash-image again on the same" +echo "folder to update the image." +echo +echo "To disable auto-mounting upon cd, please remove the" +echo ".needs_mount file to prevent that." +echo diff --git a/mount-squash-image b/mount-squash-image index d2e065f..ee46f3d 100755 --- a/mount-squash-image +++ b/mount-squash-image @@ -1,9 +1,8 @@ #!/bin/bash -echo $@ - DIR="$@" DIR=$(readlink -f "$DIR") -DIR_SHORT=$(basename $DIR) +DIR_SHORT=$(basename "$DIR") +BIN_DIR=$(dirname "$(readlink -f "$0")") mkdir -p "$DIR" OVERLAY_ROOT=$(readlink -f "${DIR}/..")/.squashfs/${DIR_SHORT} @@ -12,9 +11,28 @@ OVERLAY_LOWER=${OVERLAY_ROOT}/lower OVERLAY_WORK=${OVERLAY_ROOT}/work OVERLAY_TARG=$DIR -umount-squash-image $@ 1>/dev/null 2>/dev/null +if [ ! -f "${OVERLAY_ROOT}.img" ]; then + echo "Error: SquashFS image ${OVERLAY_ROOT}.img not found." >&2 + exit 1 +fi + +"$BIN_DIR"/umount-squash-image "$@" 1>/dev/null 2>/dev/null sudo mount "${OVERLAY_ROOT}.img" "$OVERLAY_LOWER" -t squashfs -o loop -sudo mount -t overlay -o lowerdir="$OVERLAY_LOWER",upperdir="$OVERLAY_UPPER",workdir="$OVERLAY_WORK" none "$OVERLAY_TARG" +EXIT_CODE=$? +if [ $EXIT_CODE -ne 0 ]; then + echo "Error: Failed to mount squashfs image (exit code $EXIT_CODE)." >&2 + exit $EXIT_CODE +fi -echo "SquashFS filesystem is mounted and ready," +sudo mount -t overlay -o lowerdir="$OVERLAY_LOWER",upperdir="$OVERLAY_UPPER",workdir="$OVERLAY_WORK" none "$OVERLAY_TARG" +EXIT_CODE=$? +if [ $EXIT_CODE -ne 0 ]; then + echo "Error: Failed to mount overlay (exit code $EXIT_CODE)." >&2 + # Cleanup: unmount the lower squashfs if overlay mount fails + sudo umount "$OVERLAY_LOWER" 2>/dev/null + exit $EXIT_CODE +fi + +echo "SquashFS filesystem is mounted and ready." +exit 0 diff --git a/own b/own index 84cd6fe..a04be63 100755 --- a/own +++ b/own @@ -14,4 +14,4 @@ then exit 2 fi -sudo chown -R $(whoami):$(whoami) "$@" +sudo chown -R $(whoami):$(whoami) "$@" 1>/dev/null 2>/dev/null diff --git a/umount-squash-image b/umount-squash-image index 9eb0522..58f36b1 100755 --- a/umount-squash-image +++ b/umount-squash-image @@ -1,8 +1,7 @@ #!/bin/bash DIR="$@" DIR=$(readlink -f "$DIR") -DIR_SHORT=$(basename $DIR) -mkdir -p "$DIR" +DIR_SHORT=$(basename "$DIR") OVERLAY_ROOT=$(readlink -f "${DIR}/..")/.squashfs/${DIR_SHORT} OVERLAY_UPPER=${OVERLAY_ROOT}/upper @@ -10,9 +9,8 @@ OVERLAY_LOWER=${OVERLAY_ROOT}/lower OVERLAY_WORK=${OVERLAY_ROOT}/work OVERLAY_TARG=$DIR -sudo umount -R "$OVERLAY_ROTO" -sudo umount -R "$OVERLAY_LOWER" -sudo umount -R "$OVERLAY_TARG" -sudo umount -R "$DIR" +sudo umount -R "$OVERLAY_TARG" 2>/dev/null +sudo umount -R "$OVERLAY_LOWER" 2>/dev/null echo "SquashFS filesystem has been unmounted." +exit 0