77# ./debloat.sh # Auto-detect runner environment
88# ./debloat.sh --force # Force run regardless of environment
99# ./debloat.sh --mount /build # Create optimized build mount at /build
10+ # ./debloat.sh --unmount # Remove LVM mount and restore original setup
1011# ./debloat.sh --help # Show help
1112
1213# Colors for output
6061OPTIONS:
6162 --force Force execution regardless of environment detection
6263 --mount PATH Create optimized build mount at PATH using LVM
64+ --unmount Remove LVM mount and restore original setup
6365 --root-reserve-mb MB Space to reserve on root filesystem (default: $DEFAULT_ROOT_RESERVE_MB )
6466 --temp-reserve-mb MB Space to reserve on temp filesystem (default: $DEFAULT_TEMP_RESERVE_MB )
6567 --swap-size-mb MB Swap space to create in MB (default: $DEFAULT_SWAP_SIZE_MB )
@@ -74,6 +76,7 @@ EXAMPLES:
7476 $SCRIPT_NAME # Standard cleanup
7577 $SCRIPT_NAME --force # Force run on any system
7678 $SCRIPT_NAME --mount /build # Cleanup + create optimized build mount
79+ $SCRIPT_NAME --unmount # Remove LVM mount and restore system
7780 $SCRIPT_NAME --mount /build --remove-docker-images --remove-codeql
7881
7982WHAT GETS REMOVED:
@@ -93,6 +96,13 @@ MOUNT FEATURE:
9396 • Recreates swap space efficiently
9497 • Provides maximum available space for builds
9598 • Uses ext4 filesystem optimized for build workloads
99+
100+ UNMOUNT FEATURE:
101+ When --unmount is used, safely removes LVM setup:
102+ • Unmounts build volumes and restores original swap
103+ • Removes volume groups and physical volumes
104+ • Cleans up loop devices and files
105+ • Restores system to pre-mount state
96106EOF
97107}
98108
@@ -247,14 +257,82 @@ EOF
247257
248258# Function to remove Docker images
249259remove_docker_images () {
250- if command -v docker & > /dev/null; then
251- log " info" " Removing Docker images..."
252- sudo docker image prune --all --force & > /dev/null || true
253- sudo docker system prune --all --force & > /dev/null || true
254- log " success" " Docker images removed"
255- else
256- log " info" " Docker not found, skipping Docker cleanup"
257- fi
260+ log " info" " Starting comprehensive Docker/Podman cleanup..."
261+
262+ for cmd in docker podman; do
263+ if ! command -v " $cmd " & > /dev/null; then
264+ continue
265+ fi
266+
267+ log " info" " Cleaning up $cmd ..."
268+
269+ case " $cmd " in
270+ docker)
271+ # Stop and remove all containers
272+ local containers
273+ containers=$( $cmd ps -aq 2> /dev/null || true)
274+ if [[ -n " $containers " ]]; then
275+ sudo $cmd stop $containers & > /dev/null || true
276+ sudo $cmd rm -f $containers & > /dev/null || true
277+ fi
278+
279+ # Remove all images
280+ local images
281+ images=$( $cmd images -aq 2> /dev/null || true)
282+ if [[ -n " $images " ]]; then
283+ sudo $cmd rmi -f $images & > /dev/null || true
284+ fi
285+
286+ # Remove all volumes
287+ local volumes
288+ volumes=$( $cmd volume ls -q 2> /dev/null || true)
289+ if [[ -n " $volumes " ]]; then
290+ sudo $cmd volume rm $volumes & > /dev/null || true
291+ fi
292+
293+ # Remove all networks (except default ones)
294+ local networks
295+ networks=$( $cmd network ls -q --filter type=custom 2> /dev/null || true)
296+ if [[ -n " $networks " ]]; then
297+ sudo $cmd network rm $networks & > /dev/null || true
298+ fi
299+
300+ # System-wide cleanup
301+ sudo $cmd system prune -af --volumes & > /dev/null || true
302+ sudo $cmd builder prune -af & > /dev/null || true
303+
304+ # Clean up Docker root directory if possible
305+ sudo systemctl stop docker & > /dev/null || true
306+ safe_remove /var/lib/docker/tmp /var/lib/docker/overlay2
307+ sudo systemctl start docker & > /dev/null || true
308+ ;;
309+
310+ podman)
311+ # Stop and remove all containers
312+ sudo $cmd stop --all & > /dev/null || true
313+ sudo $cmd rm -af & > /dev/null || true
314+
315+ # Remove all images
316+ sudo $cmd rmi -af & > /dev/null || true
317+
318+ # Remove all volumes
319+ sudo $cmd volume rm --all & > /dev/null || true
320+
321+ # Remove all pods
322+ sudo $cmd pod rm -af & > /dev/null || true
323+
324+ # System reset (nuclear option for podman)
325+ sudo $cmd system reset -f & > /dev/null || true
326+ ;;
327+ esac
328+
329+ log " success" " $cmd cleanup completed"
330+ done
331+
332+ # Clean up additional container-related directories
333+ safe_remove /var/lib/containerd /var/lib/containers
334+
335+ log " success" " Container runtime cleanup completed"
258336}
259337
260338# Function to remove CodeQL
@@ -358,6 +436,75 @@ perform_cleanup() {
358436 unset DEBIAN_FRONTEND
359437}
360438
439+ # Function to unmount and cleanup LVM setup
440+ unmount_build_mount () {
441+ local pv_loop_path=" $1 "
442+ local tmp_pv_loop_path=" $2 "
443+
444+ log " mount" " Starting LVM unmount and cleanup process..."
445+
446+ # Find and unmount any build volumes
447+ local build_mounts
448+ build_mounts=$( mount | grep " /dev/mapper/${VG_NAME} -buildlv" | awk ' {print $3}' || true)
449+
450+ if [[ -n " $build_mounts " ]]; then
451+ log " mount" " Unmounting build volumes..."
452+ echo " $build_mounts " | while IFS= read -r mount_point; do
453+ log " mount" " Unmounting: $mount_point "
454+ sudo umount " $mount_point " 2> /dev/null || true
455+ done
456+ fi
457+
458+ # Deactivate swap if it's from our VG
459+ if sudo swapon --show | grep -q " ${VG_NAME} -swap" ; then
460+ log " mount" " Deactivating LVM swap..."
461+ sudo swapoff " /dev/mapper/${VG_NAME} -swap" 2> /dev/null || true
462+ fi
463+
464+ # Remove logical volumes
465+ if sudo lvs 2> /dev/null | grep -q " $VG_NAME " ; then
466+ log " mount" " Removing logical volumes..."
467+ sudo lvremove -f " /dev/mapper/${VG_NAME} -buildlv" 2> /dev/null || true
468+ sudo lvremove -f " /dev/mapper/${VG_NAME} -swap" 2> /dev/null || true
469+ fi
470+
471+ # Remove volume group
472+ if sudo vgs 2> /dev/null | grep -q " $VG_NAME " ; then
473+ log " mount" " Removing volume group: $VG_NAME "
474+ sudo vgremove -f " $VG_NAME " 2> /dev/null || true
475+ fi
476+
477+ # Find and remove physical volumes / loop devices
478+ local loop_devices
479+ loop_devices=$( sudo losetup -l | grep -E " (${pv_loop_path} |${tmp_pv_loop_path} )" | awk ' {print $1}' || true)
480+
481+ if [[ -n " $loop_devices " ]]; then
482+ log " mount" " Removing loop devices..."
483+ echo " $loop_devices " | while IFS= read -r loop_dev; do
484+ log " mount" " Removing loop device: $loop_dev "
485+ sudo pvremove -f " $loop_dev " 2> /dev/null || true
486+ sudo losetup -d " $loop_dev " 2> /dev/null || true
487+ done
488+ fi
489+
490+ # Remove loop files
491+ log " mount" " Removing loop files..."
492+ safe_remove " $pv_loop_path " " $tmp_pv_loop_path "
493+
494+ # Restore original swap if possible
495+ log " mount" " Attempting to restore original swap..."
496+ if [[ -f /mnt/swapfile ]]; then
497+ sudo swapon /mnt/swapfile 2> /dev/null || true
498+ elif sudo fallocate -l 2G /mnt/swapfile 2> /dev/null; then
499+ sudo chmod 600 /mnt/swapfile
500+ sudo mkswap /mnt/swapfile & > /dev/null
501+ sudo swapon /mnt/swapfile & > /dev/null || true
502+ log " mount" " Created new 2GB swap file at /mnt/swapfile"
503+ fi
504+
505+ log " success" " LVM unmount and cleanup completed successfully"
506+ }
507+
361508# Function to create optimized build mount
362509create_build_mount () {
363510 local mount_path=" $1 "
@@ -481,6 +628,7 @@ create_build_mount() {
481628main () {
482629 local force=false
483630 local mount_path=" "
631+ local unmount=false
484632 local root_reserve_mb=$DEFAULT_ROOT_RESERVE_MB
485633 local temp_reserve_mb=$DEFAULT_TEMP_RESERVE_MB
486634 local swap_size_mb=$DEFAULT_SWAP_SIZE_MB
@@ -503,6 +651,10 @@ main() {
503651 mount_path=" $2 "
504652 shift 2
505653 ;;
654+ --unmount)
655+ unmount=true
656+ shift
657+ ;;
506658 --root-reserve-mb)
507659 root_reserve_mb=" $2 "
508660 shift 2
@@ -558,6 +710,14 @@ main() {
558710 exit 1
559711 fi
560712
713+ # Handle unmount operation
714+ if [[ " $unmount " == " true" ]]; then
715+ log " info" " GitHub Actions Runner Debloat Tool - Unmount Mode"
716+ unmount_build_mount " $pv_loop_path " " $tmp_pv_loop_path "
717+ show_disk_report " === Final Disk Usage After Unmount ==="
718+ exit 0
719+ fi
720+
561721 # Check if we should run
562722 if ! should_run " $force " ; then
563723 exit 1
0 commit comments