Compare commits
2 Commits
4ff40ed381
...
0a51d658fc
| Author | SHA1 | Date | |
|---|---|---|---|
| 0a51d658fc | |||
|
|
beae2d2c95 |
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2024 scriptos
|
Copyright (c) 2025 scriptos
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
|||||||
53
README.md
53
README.md
@ -1,8 +1,55 @@
|
|||||||
# template_repository
|
# fstrim-lxc Script
|
||||||
|
|
||||||
|
Kleines Host-Skript für **Proxmox VE**, das per `pct fstrim <VMID>` TRIM/Discard für **LXC-Container** ausführt.
|
||||||
|
Es unterstützt alle laufenden Container oder eine gezielte ID-Liste – sowie einen interaktiven Modus.
|
||||||
|
|
||||||
|
## Voraussetzungen
|
||||||
|
- Proxmox VE Host (mit `pct`)
|
||||||
|
- Ausführung als `root`
|
||||||
|
- Container müssen **laufen** (gestoppte werden übersprungen)
|
||||||
|
|
||||||
Wichtig: Link für Lizenz anpassen.
|
## Aufruf
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle LXC-Container trimmen
|
||||||
|
./fstrim-lxc.sh --all
|
||||||
|
|
||||||
|
# Ausgewählte Container per ID-Liste (kommagetrennt)
|
||||||
|
./fstrim-lxc.sh -i 102,103
|
||||||
|
|
||||||
|
# Interaktiver Modus (Menü: alle oder IDs eingeben)
|
||||||
|
./fstrim-lxc.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Beispiele
|
||||||
|
|
||||||
|
### Manuell
|
||||||
|
```bash
|
||||||
|
# Alle laufenden Container
|
||||||
|
bash ./fstrim-lxc.sh --all
|
||||||
|
|
||||||
|
# Nur bestimmte IDs
|
||||||
|
bash ./fstrim-lxc.sh -i 102,105,117
|
||||||
|
```
|
||||||
|
|
||||||
|
### Automatisierung (Cron)
|
||||||
|
Wöchentlich sonntags um 03:30 Uhr alle LXCs trimmen:
|
||||||
|
|
||||||
|
```cron
|
||||||
|
# /etc/crontab oder per crontab -e
|
||||||
|
30 3 * * 0 root /usr/bin/bash /root/scripts/fstrim-lxc.sh --all >> /var/log/fstrim-lxc.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
- Das Skript führt **keine** Containerstarts/-stops durch.
|
||||||
|
- TRIM wirkt hostseitig: Speicher wird am Storage-Backend (SSD / Thin-Provisioning) freigegeben.
|
||||||
|
|
||||||
|
## 💬 Support & Community
|
||||||
|
|
||||||
|
Du hast Fragen, brauchst Unterstützung bei der Einrichtung oder möchtest dich einfach mit anderen austauschen, die ähnliche Projekte betreiben? Dann schau gerne in unserer Techniverse Community vorbei:
|
||||||
|
|
||||||
|
👉 **Matrix-Raum:** [#community:techniverse.net](https://matrix.to/#/#community:techniverse.net)
|
||||||
|
Wir freuen uns auf deinen Besuch und helfen dir gerne weiter!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -11,5 +58,5 @@ Wichtig: Link für Lizenz anpassen.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://assets.techniverse.net/f1/logos/small/license.png" alt="License" width="15" height="15"> <a href="./template_repository/src/branch/main/LICENSE">License</a> | <img src="https://assets.techniverse.net/f1/logos/small/matrix2.svg" alt="Matrix" width="15" height="15"> <a href="https://matrix.to/#/#community:techniverse.net">Matrix</a> | <img src="https://assets.techniverse.net/f1/logos/small/mastodon2.svg" alt="Matrix" width="15" height="15"> <a href="https://social.techniverse.net/@donnerwolke">Mastodon</a>
|
<img src="https://assets.techniverse.net/f1/logos/small/license.png" alt="License" width="15" height="15"> <a href="./fstrim-lxc/src/branch/main/LICENSE">License</a> | <img src="https://assets.techniverse.net/f1/logos/small/matrix2.svg" alt="Matrix" width="15" height="15"> <a href="https://matrix.to/#/#community:techniverse.net">Matrix</a> | <img src="https://assets.techniverse.net/f1/logos/small/mastodon2.svg" alt="Matrix" width="15" height="15"> <a href="https://social.techniverse.net/@donnerwolke">Mastodon</a>
|
||||||
</p>
|
</p>
|
||||||
179
fstrim-lxc.v1.sh
Normal file
179
fstrim-lxc.v1.sh
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Beschreibung: Führt fstrim in LXC-Containern auf einem Proxmox-Host aus
|
||||||
|
# Aufrufbeispiele:
|
||||||
|
# ./fstrim-lxc.sh --all #Alle LXCs
|
||||||
|
# ./fstrim-lxc.sh -i 102,103 #Gewünschte IDs
|
||||||
|
# ./fstrim-lxc.sh #Interaktiver Modus mit Auswahlmenü
|
||||||
|
# Synapse: https://git.techniverse.net/scriptos/fstrim-lxc.git
|
||||||
|
# Autor: Patrick Asmus
|
||||||
|
# Web: https://www.cleveradmin.de
|
||||||
|
# Version: 1.0
|
||||||
|
# Datum: 31.10.2025
|
||||||
|
# Modifikation: Initial
|
||||||
|
#####################################################
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# --- Einstellungen ---
|
||||||
|
DEFAULT_TIMEOUT=60 # Sekunden; je pct fstrim-Aufruf
|
||||||
|
# ---------------------
|
||||||
|
|
||||||
|
log() { echo "[$(date +'%F %T')] $*"; }
|
||||||
|
have() { command -v "$1" >/dev/null 2>&1; }
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<'EOF'
|
||||||
|
Verwendung:
|
||||||
|
fstrim-lxc.pct.v1.sh -all [--timeout SECONDS]
|
||||||
|
-> pct fstrim auf allen laufenden LXC-Containern ausführen
|
||||||
|
|
||||||
|
fstrim-lxc.pct.v1.sh -i 102,103 [--timeout SECONDS]
|
||||||
|
fstrim-lxc.pct.v1.sh -102,103 [--timeout SECONDS]
|
||||||
|
-> pct fstrim nur auf diesen IDs ausführen
|
||||||
|
|
||||||
|
fstrim-lxc.pct.v1.sh
|
||||||
|
-> Interaktives Menü
|
||||||
|
|
||||||
|
Optionen:
|
||||||
|
--timeout N : Timeout pro Container (Sekunden), Default 60
|
||||||
|
-h | --help : Hilfe
|
||||||
|
Hinweise:
|
||||||
|
- Gestoppte Container werden übersprungen (kein Auto-Start).
|
||||||
|
- Benötigt root und das Proxmox-Tool "pct".
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
require_root() {
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Bitte als root ausführen." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
list_all_ids() {
|
||||||
|
pct list | awk 'NR>1 {print $1}'
|
||||||
|
}
|
||||||
|
|
||||||
|
exists_id() {
|
||||||
|
local id="$1"
|
||||||
|
list_all_ids | grep -qx "$id"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_running() {
|
||||||
|
local id="$1"
|
||||||
|
pct status "$id" 2>/dev/null | grep -q "status: running"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_fstrim() {
|
||||||
|
local id="$1"
|
||||||
|
local timeout_s="$2"
|
||||||
|
|
||||||
|
if ! exists_id "$id"; then
|
||||||
|
log "[ID $id] existiert nicht. Übersprungen."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! is_running "$id"; then
|
||||||
|
log "[ID $id] gestoppt. Übersprungen (kein Auto-Start)."
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! have pct; then
|
||||||
|
log "Fehler: pct nicht gefunden."
|
||||||
|
return 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "[ID $id] pct fstrim (Timeout ${timeout_s}s)..."
|
||||||
|
if timeout "$timeout_s" pct fstrim "$id"; then
|
||||||
|
log "[ID $id] OK."
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log "[ID $id] Fehler oder Timeout."
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_for_ids() {
|
||||||
|
local ids_csv="$1"
|
||||||
|
local timeout_s="$2"
|
||||||
|
ids_csv="${ids_csv//[[:space:]]/}"
|
||||||
|
IFS=',' read -r -a ids <<< "$ids_csv"
|
||||||
|
[[ ${#ids[@]} -gt 0 ]] || { echo "Keine gültigen IDs."; exit 1; }
|
||||||
|
|
||||||
|
local rc=0
|
||||||
|
for id in "${ids[@]}"; do
|
||||||
|
if [[ ! "$id" =~ ^[0-9]+$ ]]; then
|
||||||
|
log "[$id] keine numerische ID. Übersprungen."
|
||||||
|
rc=1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
do_fstrim "$id" "$timeout_s" || rc=1
|
||||||
|
done
|
||||||
|
return $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
run_for_all() {
|
||||||
|
local timeout_s="$1"
|
||||||
|
mapfile -t all_ids < <(list_all_ids)
|
||||||
|
if [[ ${#all_ids[@]} -eq 0 ]]; then
|
||||||
|
log "Keine LXC-Container gefunden."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Starte pct fstrim für alle laufenden Container: ${all_ids[*]}"
|
||||||
|
local rc=0
|
||||||
|
for id in "${all_ids[@]}"; do
|
||||||
|
do_fstrim "$id" "$timeout_s" || rc=1
|
||||||
|
done
|
||||||
|
return $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
interactive_menu() {
|
||||||
|
echo "Kein Parameter übergeben. Bitte auswählen:"
|
||||||
|
echo " 1) Alle laufenden LXC-Container trimmen"
|
||||||
|
echo " 2) Bestimmte IDs (kommagetrennt)"
|
||||||
|
read -r -p "Auswahl [1/2]: " choice
|
||||||
|
case "$choice" in
|
||||||
|
1) run_for_all "$TIMEOUT_S" ;;
|
||||||
|
2)
|
||||||
|
read -r -p "IDs (z. B. 102,103): " ids
|
||||||
|
run_for_ids "$ids" "$TIMEOUT_S"
|
||||||
|
;;
|
||||||
|
*) echo "Ungültige Auswahl."; exit 1 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Main ---
|
||||||
|
require_root
|
||||||
|
have pct || { echo "Fehler: 'pct' nicht verfügbar. Bitte auf einem Proxmox-Host ausführen."; exit 1; }
|
||||||
|
|
||||||
|
TIMEOUT_S=$DEFAULT_TIMEOUT
|
||||||
|
|
||||||
|
# globale Option --timeout vorziehen
|
||||||
|
while [[ $# -gt 1 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--timeout) TIMEOUT_S="${2:-$DEFAULT_TIMEOUT}"; shift 2 ;;
|
||||||
|
*) break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ $# -eq 0 ]]; then
|
||||||
|
interactive_menu
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
-h|--help) usage; exit 0 ;;
|
||||||
|
-all|--all) run_for_all "$TIMEOUT_S"; exit $? ;;
|
||||||
|
-i|--ids)
|
||||||
|
[[ -z "${2:-}" ]] && { echo "Fehler: IDs fehlen, z. B. -i 101,102"; exit 1; }
|
||||||
|
run_for_ids "$2" "$TIMEOUT_S"; exit $? ;;
|
||||||
|
-[0-9]*)
|
||||||
|
ids_arg="${1#-}"
|
||||||
|
run_for_ids "$ids_arg" "$TIMEOUT_S"; exit $? ;;
|
||||||
|
*)
|
||||||
|
echo "Unbekannter Parameter: $1"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
Loading…
x
Reference in New Issue
Block a user