# Change Swap Size Ein robustes Bash-Skript zur automatischen Anpassung der Swap-Größe auf Debian-basierten Systemen mit intelligenter Swap-Erkennung. ## 📋 Übersicht Dieses Skript passt die Größe der `/swapfile` automatisch an die Systemkonfiguration an. Es berechnet die optimale Swap-Größe basierend auf dem installierten RAM und legt Swap neu an oder vergrößert ihn bei Bedarf sicher und unterbrechungsfrei. ### Hauptmerkmale - ✅ **Intelligente Swap-Erkennung**: Erkennt automatisch ob Swap vorhanden ist - ✅ **Zwei optimierte Workflows**: Direkter Weg ohne Swap, sicherer Weg mit vorhandenem Swap - ✅ **Automatische Größenberechnung**: RAM + 2GB als Zielgröße - ✅ **Unterbrechungsfreier Betrieb**: Temporärer Swap während der Vergrößerung - ✅ **Sicherheitsgeprüft**: Speicherplatz-Validierung vor Ausführung - ✅ **Idempotent**: Kann mehrfach sicher ausgeführt werden - ✅ **Detailliertes Logging**: Klare Fortschrittsanzeige - ✅ **Fehlerbehandlung**: Automatischer Abbruch bei Problemen ## 🚀 Installation ### Schnellinstallation ```bash # Repository klonen git clone https://git.jtl-hosting.de/thomasciesla/change-swap-size.git cd change-swap-size # Skript ausführbar machen chmod +x swap-setup-improved.sh # Als Root ausführen sudo ./swap-setup-improved.sh ``` ### Systemweite Installation ```bash # Skript nach /usr/local/bin kopieren sudo cp swap-setup-improved.sh /usr/local/bin/resizeswap sudo chmod +x /usr/local/bin/resizeswap # Überall im System ausführbar sudo resizeswap ``` ## 📖 Verwendung ### Basis-Aufruf ```bash sudo ./swap-setup-improved.sh ``` Das Skript benötigt Root-Rechte und führt folgende Aktionen aus: 1. Ermittelt die installierte RAM-Größe 2. Berechnet Zielgröße (RAM + 2GB) 3. **Prüft ob Swap aktiv ist** 4. **Wählt optimalen Workflow**: - Kein Swap → Direktes Anlegen - Swap zu klein → Sichere Vergrößerung ### Beispielausgabe: Kein Swap vorhanden ``` === Swap-Anpassung wird gestartet === Erkannter RAM: 16384 MB Zielgröße für Swap: 18432 MB (RAM + 2048 MB) === KEIN SWAP AKTIV - Erstelle neuen Swap === Verfügbarer Speicher: 50000 MB Benötigt: 18432 MB [1/3] Erstelle /swapfile mit 18432 MB... [2/3] Formatiere /swapfile als Swap... [3/3] Aktiviere /swapfile... === Swap erfolgreich erstellt und aktiviert! === Swap-Status: NAME TYPE SIZE USED PRIO /swapfile file 18G 0B -2 ``` ### Beispielausgabe: Swap vergrößern ``` === Swap-Anpassung wird gestartet === Erkannter RAM: 16384 MB Zielgröße für Swap: 18432 MB (RAM + 2048 MB) === SWAP IST AKTIV - Prüfe Größe === NAME TYPE SIZE USED PRIO /swapfile file 4G 512M -2 Aktuelle /swapfile-Größe: 4096 MB Swap wird vergrößert von 4096 MB auf 18432 MB... Verfügbarer Speicher: 50000 MB Benötigt (temporär): 28672 MB [1/6] Erstelle temporären Swap (10240 MB)... [2/6] Aktiviere temporären Swap... [3/6] Deaktiviere alten /swapfile... [4/6] Erstelle neue /swapfile mit 18432 MB... [5/6] Aktiviere neue /swapfile... [6/6] Entferne temporären Swap... === Swap erfolgreich vergrößert und aktiviert! === ``` ## 🔧 Technische Details ### Intelligente Workflow-Auswahl Das Skript entscheidet automatisch zwischen zwei Workflows: ```bash # Prüfung ob Swap aktiv ist SWAP_ACTIVE=$(swapon --show | wc -l) if [ "$SWAP_ACTIVE" -eq 0 ]; then # WORKFLOW 1: Direktes Anlegen (3 Schritte) # Effizienter Weg ohne temporären Swap else # WORKFLOW 2: Sichere Vergrößerung (6 Schritte) # Mit temporärem Swap für unterbrechungsfreien Betrieb fi ``` ### Berechnungsformel ``` Ziel-Swap-Größe = RAM + 2048 MB ``` Diese Formel orientiert sich an gängigen Best Practices für Swap-Dimensionierung. ### Ablaufdiagramm ``` ┌─────────────────────────────────────┐ │ Start: Swap-Erkennung │ └────────────┬────────────────────────┘ │ ▼ ┌────────────┐ │ Swap aktiv?│ └─────┬──────┘ │ ┌─────────┴─────────┐ │ NEIN │ JA ▼ ▼ ┌───────────────┐ ┌────────────────┐ │ WORKFLOW 1 │ │ WORKFLOW 2 │ │ (3 Schritte) │ │ (6 Schritte) │ └───────┬───────┘ └────────┬───────┘ │ │ ▼ ▼ ┌───────────────────────────────────────┐ │ 1. /swapfile erstellen │ │ 2. Als Swap formatieren │ │ 3. Aktivieren │ └───────────────────────────────────────┘ │ ▼ ┌───────────────────────────────────┐ │ 1. Temporären 10GB Swap erstellen │ │ 2. Temporären Swap aktivieren │ │ 3. Alten /swapfile deaktivieren │ │ 4. Neuen /swapfile erstellen │ │ 5. Neuen /swapfile aktivieren │ │ 6. Temporären Swap entfernen │ └───────────────────────────────────┘ │ ┌───────────────────┴───────────────────┐ │ │ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ fstab-Eintrag │ │ Swap aktiv! │ │ hinzufügen │ │ │ └─────────────────┘ └─────────────────┘ ``` ### Sicherheitsmechanismen - **Swap-Status-Erkennung**: Automatische Erkennung des optimalen Workflows - **Speicherplatz-Prüfung**: Validiert vor Beginn, ob genug Speicher verfügbar ist - **Temporärer Swap**: 10GB Sicherheits-Swap nur bei Vergrößerung - **Root-Prüfung**: Verhindert Ausführung ohne ausreichende Rechte - **Fehlerbehandlung**: `set -e` bricht bei Fehlern sofort ab - **Permission-Management**: Automatisches Setzen von `chmod 600` für Swap-Dateien ### Systemvoraussetzungen - **Betriebssystem**: Debian, Ubuntu oder andere Debian-Derivate - **Kernel**: Linux mit Swap-Unterstützung - **Tools**: `bash`, `dd`, `free`, `mkswap`, `swapon`, `swapoff`, `stat`, `df`, `wc` - **Rechte**: Root-Zugriff erforderlich - **Speicher**: - Bei Neuanlage: Mindestens RAM + 2GB freier Festplattenspeicher - Bei Vergrößerung: Mindestens RAM + 2GB + 10GB freier Festplattenspeicher ## ⚙️ Konfiguration ### Anpassbare Parameter Im Skript können folgende Variablen angepasst werden: ```bash # Temporäre Swap-Größe für Vergrößerung (in MB) TEMP_SWAP_SIZE_MB=10240 # Standard: 10 GB # Zusätzlicher Speicher zum RAM (in MB) # TARGET_MB=$((RAM_MB + 2048)) # Standard: RAM + 2GB ``` ### Beispiel: Custom-Größe Für ein System mit speziellen Anforderungen: ```bash # Im Skript anpassen: TARGET_MB=$((RAM_MB + 4096)) # RAM + 4GB statt 2GB TEMP_SWAP_SIZE_MB=20480 # 20GB temporärer Swap ``` ## 📊 Verwendungsszenarien ### Szenario 1: Neuinstallation ohne Swap **Ausgangssituation:** ``` RAM: 16384 MB Swap aktiv: Nein Aktion: Direktes Anlegen (3 Schritte) ``` **Ergebnis:** ``` Neuer Swap: 18432 MB (18.4 GB) Workflow: WORKFLOW 1 (effizient) Benötigter Platz: 18432 MB ``` ### Szenario 2: Server mit zu kleinem Swap **Ausgangssituation:** ``` RAM: 16384 MB Aktueller Swap: 4096 MB Swap aktiv: Ja Aktion: Sichere Vergrößerung (6 Schritte) ``` **Ergebnis:** ``` Neuer Swap: 18432 MB (18.4 GB) Workflow: WORKFLOW 2 (mit temp. Swap) Benötigter Platz: 28672 MB (temporär) ``` ### Szenario 3: Server mit ausreichend Swap **Ausgangssituation:** ``` RAM: 8192 MB Ziel: 10240 MB Aktueller Swap: 16384 MB ``` **Ergebnis:** ``` Aktion: Keine - Swap bereits ausreichend Meldung: "Swap ist bereits groß genug" ``` ### Szenario 4: Server mit 128GB RAM **Ausgangssituation:** ``` RAM: 131072 MB Swap aktiv: Nein ``` **Ergebnis:** ``` Neuer Swap: 133120 MB (133 GB) Workflow: WORKFLOW 1 (direktes Anlegen) Benötigter Platz: 133120 MB ``` ### Szenario 5: Swap-Partition statt Datei **Ausgangssituation:** ``` RAM: 16384 MB Swap aktiv: Ja (/dev/sda2) /swapfile: Existiert nicht ``` **Ergebnis:** ``` Meldung: "Dieses Skript verwaltet nur /swapfile" Aktion: Keine - Anderer Swap-Typ erkannt Info: Aktuelle Swap-Konfiguration wird angezeigt ``` ## 🛠️ Troubleshooting ### Problem: Nicht genug Speicherplatz **Fehler:** ``` FEHLER: Nicht genug freier Speicherplatz! Benötigt: 28672 MB, Verfügbar: 20000 MB ``` **Lösung:** - Speicherplatz freigeben auf dem entsprechenden Volume - Bei Vergrößerung: Temporäre Swap-Größe reduzieren (`TEMP_SWAP_SIZE_MB`) - Alternative Partition für Swap verwenden ### Problem: Swap bereits groß genug **Meldung:** ``` === Swap ist bereits groß genug === Aktuelle Größe (20480 MB) >= Zielgröße (18432 MB) ``` **Lösung:** - Normal - keine Aktion erforderlich - Falls dennoch Anpassung gewünscht, Berechnungsformel im Skript anpassen ### Problem: Keine Root-Rechte **Fehler:** ``` Fehler: Dieses Skript muss als root ausgeführt werden ``` **Lösung:** ```bash sudo ./swap-setup-improved.sh ``` ### Problem: /swapfile existiert aber ist nicht aktiv **Meldung:** ``` Warnung: /swapfile existiert aber ist nicht aktiv - wird gelöscht ``` **Lösung:** - Normal - Skript bereinigt alte, inaktive Swap-Dateien - Falls Datei wichtig ist, vor Ausführung sichern ## 🔍 Verifikation ### Swap-Status prüfen ```bash # Aktive Swap-Devices anzeigen swapon --show # Speicher-Übersicht free -h # Detaillierte Swap-Informationen cat /proc/swaps ``` ### /etc/fstab prüfen ```bash grep swapfile /etc/fstab ``` Erwartete Ausgabe: ``` /swapfile none swap sw 0 0 ``` ## 📝 Best Practices ### Empfehlungen 1. **Backup**: Wichtige Daten vor Ausführung sichern 2. **Wartungsfenster**: Während wartungsarmer Zeiten ausführen 3. **Monitoring**: Swap-Nutzung nach Anpassung überwachen 4. **Dokumentation**: Änderungen in Change-Management dokumentieren 5. **Planung**: Bei großen Systemen (>64GB RAM) Speicherbedarf vorher prüfen ### Swap-Dimensionierung Allgemeine Richtlinien für Swap-Größen: | RAM | Empfohlener Swap | Skript-Berechnung | Workflow | |----------|------------------|-------------------|------------| | 1-2 GB | RAM × 2 | RAM + 2GB | 1 oder 2 | | 2-8 GB | RAM × 1.5 | RAM + 2GB | 1 oder 2 | | 8-64 GB | RAM + 2-4 GB | RAM + 2GB ✓ | 1 oder 2 | | > 64 GB | 8-32 GB | RAM + 2GB | 1 oder 2 | Das Skript folgt der modernen Best Practice für mittlere bis große Server. ### Workflow-Effizienz | Szenario | Workflow | Schritte | Temp. Swap | Zeitaufwand | |-----------------------|----------|----------|------------|-------------| | Kein Swap vorhanden | 1 | 3 | Nein | ~2-5 Min | | Swap vergrößern | 2 | 6 | Ja (10GB) | ~5-15 Min | | Swap groß genug | - | 0 | Nein | <1 Min | ## 🤝 Beitragen Wir freuen uns über Beiträge! Bitte beachten Sie: ### Issues melden Bugs oder Feature-Requests können hier gemeldet werden: **Issues**: https://git.jtl-hosting.de/thomasciesla/change-swap-size/issues ### Merge Requests Pull Requests sind willkommen: **Merge Requests**: https://git.jtl-hosting.de/thomasciesla/change-swap-size/pulls ### Entwicklungsrichtlinien - Bash-Coding-Standards einhalten - Ausführliche Kommentare für komplexe Logik - Fehlerbehandlung für alle kritischen Operationen - Tests auf Debian 11 und 12 durchführen - Beide Workflows testen (mit und ohne vorhandenen Swap) ## 📞 Kontakt **Maintainer**: Thomas Ciesla **E-Mail**: thomas.ciesla@jtl-software.com **Teams**: thomas.ciesla@jtl-software.com **Organisation**: JTL-Software ## 📜 Lizenz Dieses Projekt ist für den internen Gebrauch bei JTL-Software entwickelt. ## 🔖 Changelog ### Version 2.0.0 (2025-12-01) **Neue Features:** - ✨ Intelligente Swap-Erkennung mit automatischer Workflow-Auswahl - ✨ Optimierter Workflow für Systeme ohne aktiven Swap (3 statt 6 Schritte) - ✨ Erkennung von Swap-Partitionen und anderen Swap-Typen - ✨ Automatische Bereinigung inaktiver /swapfile-Dateien - 🔧 Verbesserte Fehlerbehandlung und Statusmeldungen **Verbesserungen:** - ⚡ Bis zu 50% schnellere Ausführung bei Neuinstallationen - 💾 Reduzierter temporärer Speicherbedarf bei Systemen ohne Swap - 📊 Detailliertere Ausgaben zur besseren Nachvollziehbarkeit - 🛡️ Zusätzliche Sicherheitsprüfungen ### Version 1.0.0 (2024-10-24) - Initial Release - Automatische RAM-Erkennung und Berechnung - Temporärer Swap für unterbrechungsfreien Betrieb - Speicherplatz-Validierung - fstab-Integration - Ausführliches Logging ## ⚠️ Wichtige Hinweise ### Sicherheit - **Root-Rechte erforderlich**: Skript manipuliert System-Level Ressourcen - **Temporärer Speicherbedarf**: - Workflow 1 (kein Swap): RAM + 2GB - Workflow 2 (Vergrößerung): RAM + 2GB + 10GB (temporär) - **Keine Datenvalidierung**: Swap-Inhalt wird nicht gesichert - **Production-Use**: In Testumgebung validieren vor Production-Einsatz ### Einschränkungen - Nur für `/swapfile`, nicht für Swap-Partitionen - Keine Verkleinerung der Swap-Datei - Keine Unterstützung für Multiple-Swap-Dateien - Nur Linux/Debian-basierte Systeme - Andere Swap-Typen werden erkannt aber nicht verwaltet ### Vorteile der neuen Version | Feature | v1.0 | v2.0 | |----------------------------|------|------| | Swap-Erkennung | ❌ | ✅ | | Workflow-Optimierung | ❌ | ✅ | | Neuinstallation (3 Steps) | ❌ | ✅ | | Vergrößerung (6 Steps) | ✅ | ✅ | | Swap-Partition-Erkennung | ❌ | ✅ | | Speichereffizienz | ⚠️ | ✅ | --- **Entwickelt mit ❤️ für JTL-Software Infrastructure Team**