#!/usr/bin/env bash # Run fstrim in all running LXC containers on Proxmox hosts (reclaim thin pool space). # Usage: ./scripts/maintenance/fstrim-all-running-ct.sh [--dry-run] # Requires: SSH key-based access to ml110, r630-01, r630-02. # See: docs/04-configuration/STORAGE_GROWTH_AND_HEALTH.md # # Environment (optional): # FSTRIM_TIMEOUT_SEC Seconds per CT (default 180). Use 45–60 for faster fleet passes when many CTs hang on FITRIM. # FSTRIM_HOSTS Space-separated host keys: ml110 r630-01 r630-02 (default: all three). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" [[ -f "${PROJECT_ROOT}/config/ip-addresses.conf" ]] && source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true ML110="${PROXMOX_HOST_ML110:-192.168.11.10}" R630_01="${PROXMOX_HOST_R630_01:-192.168.11.11}" R630_02="${PROXMOX_HOST_R630_02:-192.168.11.12}" FSTRIM_TIMEOUT_SEC="${FSTRIM_TIMEOUT_SEC:-180}" # shellcheck disable=SC2206 FSTRIM_HOSTS_ARR=(${FSTRIM_HOSTS:-ml110 r630-01 r630-02}) DRY_RUN=0 [[ "${1:-}" == "--dry-run" ]] && DRY_RUN=1 run_ssh() { ssh -o ConnectTimeout=15 -o ServerAliveInterval=10 -o StrictHostKeyChecking=accept-new root@"$1" "$2" 2>/dev/null || true; } fstrim_host() { local host_ip="$1" host_name="$2" local vmids vmids=$(run_ssh "$host_ip" "pct list 2>/dev/null | awk 'NR>1 && \$2==\"running\" {print \$1}'" || true) if [[ -z "$vmids" ]]; then echo " $host_name ($host_ip): no running containers or unreachable" return 0 fi for vmid in $vmids; do if [[ $DRY_RUN -eq 1 ]]; then echo " [dry-run] $host_name VMID $vmid: would run fstrim -v / (timeout ${FSTRIM_TIMEOUT_SEC}s)" else # timeout: some CTs hang on FITRIM or slow storage; do not block entire fleet out=$(run_ssh "$host_ip" "timeout \"${FSTRIM_TIMEOUT_SEC}\" pct exec $vmid -- fstrim -v / 2>&1" || true) echo " $host_name VMID $vmid: ${out:-done}" fi done } echo "=== fstrim all running CTs (reclaim thin pool space) ===" echo " timeout_per_ct=${FSTRIM_TIMEOUT_SEC}s hosts=${FSTRIM_HOSTS_ARR[*]}" [[ $DRY_RUN -eq 1 ]] && echo "(dry-run: no changes)" echo "" for key in "${FSTRIM_HOSTS_ARR[@]}"; do case "$key" in ml110) fstrim_host "$ML110" "ml110" ;; r630-01) fstrim_host "$R630_01" "r630-01" ;; r630-02) fstrim_host "$R630_02" "r630-02" ;; *) echo " Unknown FSTRIM_HOSTS entry: $key (use ml110, r630-01, r630-02)" ;; esac done echo "" echo "Done. Schedule weekly via cron or run with daily-weekly-checks weekly."