#!/bin/bash set -e RED='\e[31m' GREEN='\e[32m' YELLOW='\e[33m' RESET='\e[0m' IMG_FILE="PBX-Test.img" ROOT_LV_PATH="/dev/mapper/PBX--vg-root" MOUNT_PATH="/mnt/debian" VGROUP="PBX-vg" main() { root_check trap 'echo "Status Code: $?"; cleanup;' EXIT losetup -fP $IMG_FILE LOOP_DEVICE=$(losetup -l | grep $IMG_FILE | cut -d ' ' -f1) echo $LOOP_DEVICE vgchange -a y $VGROUP mkdir -p $MOUNT_PATH mount $ROOT_LV_PATH $MOUNT_PATH mount "${LOOP_DEVICE}p2" "$MOUNT_PATH/boot" mount "${LOOP_DEVICE}p1" "$MOUNT_PATH/boot/efi" KERNEL_VERSION=$(get_kernel_version) tar -I zstd -c -C "${MOUNT_PATH}" --warning=no-file-ignored . | pv >"PBX-Image-${KERNEL_VERSION}.tar.zst" } root_check() { if [[ $EUID -ne 0 ]]; then echo -e "${RED}You must be root to do this." 1>&2 exit 77 fi } get_kernel_version() { local kernel_file=$(ls -1 "$MOUNT_PATH/boot/vmlinuz-"* 2>/dev/null | head -n1) if [[ -n "$kernel_file" ]]; then basename "$kernel_file" | sed 's/vmlinuz-//' else echo "unknown" fi } cleanup() { if [[ $NO_CLEANUP = true ]]; then echo -e "${YELLOW}No cleanup specified. Make sure to manually clean mounts.${RESET}" 1>&2 exit 100 fi echo "Cleaning Mounts" umount -lf "${MOUNT_PATH}/boot/efi" 2>/dev/null || true umount -lf "${MOUNT_PATH}/boot" 2>/dev/null || true umount -lf "${MOUNT_PATH}" 2>/dev/null || true vgchange -a n $VGROUP echo -e "${GREEN}Clean.${RESET}" losetup -D } main