Skip to content

Commit 9ad7e25

Browse files
committed
better
1 parent 31d2786 commit 9ad7e25

1 file changed

Lines changed: 168 additions & 8 deletions

File tree

Github/Runners/debloat_ubuntu.sh

Lines changed: 168 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
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
@@ -60,6 +61,7 @@ USAGE:
6061
OPTIONS:
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
7982
WHAT 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
96106
EOF
97107
}
98108

@@ -247,14 +257,82 @@ EOF
247257

248258
# Function to remove Docker images
249259
remove_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
362509
create_build_mount() {
363510
local mount_path="$1"
@@ -481,6 +628,7 @@ create_build_mount() {
481628
main() {
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

Comments
 (0)