diff --git a/README.md b/README.md index b830d47..3868b4b 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,20 @@ # Change Swap Size -Ein robustes Bash-Skript zur automatischen Anpassung der Swap-Größe auf Debian-basierten Systemen. +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 vergrößert die Swap-Datei bei Bedarf sicher und unterbrechungsfrei. +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 des Vorgangs +- ✅ **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 in 6 Schritten +- ✅ **Detailliertes Logging**: Klare Fortschrittsanzeige - ✅ **Fehlerbehandlung**: Automatischer Abbruch bei Problemen ## 🚀 Installation @@ -25,17 +27,17 @@ git clone https://git.jtl-hosting.de/thomasciesla/change-swap-size.git cd change-swap-size # Skript ausführbar machen -chmod +x resizeswap.py +chmod +x swap-setup-improved.sh # Als Root ausführen -sudo ./resizeswap.py +sudo ./swap-setup-improved.sh ``` ### Systemweite Installation ```bash # Skript nach /usr/local/bin kopieren -sudo cp resizeswap.py /usr/local/bin/resizeswap +sudo cp swap-setup-improved.sh /usr/local/bin/resizeswap sudo chmod +x /usr/local/bin/resizeswap # Überall im System ausführbar @@ -47,23 +49,52 @@ sudo resizeswap ### Basis-Aufruf ```bash -sudo ./resizeswap.py +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 aktuelle Swap-Größe -4. Vergrößert bei Bedarf die `/swapfile` +3. **Prüft ob Swap aktiv ist** +4. **Wählt optimalen Workflow**: + - Kein Swap → Direktes Anlegen + - Swap zu klein → Sichere Vergrößerung -### Beispielausgabe +### Beispielausgabe: Kein Swap vorhanden ``` === Swap-Anpassung wird gestartet === Erkannter RAM: 16384 MB Zielgröße für Swap: 18432 MB (RAM + 2048 MB) -Aktuelle Swap-Größe: 4096 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 @@ -81,6 +112,23 @@ Benötigt (temporär): 28672 MB ## 🔧 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 ``` @@ -93,38 +141,53 @@ Diese Formel orientiert sich an gängigen Best Practices für Swap-Dimensionieru ``` ┌─────────────────────────────────────┐ -│ 1. Temporären 10GB Swap erstellen │ -│ und aktivieren │ +│ Start: Swap-Erkennung │ └────────────┬────────────────────────┘ │ ▼ -┌─────────────────────────────────────┐ -│ 2. Alten /swapfile deaktivieren │ -│ und löschen │ -└────────────┬────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────┐ -│ 3. Neuen /swapfile mit Zielgröße │ -│ erstellen │ -└────────────┬────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────┐ -│ 4. Neuen /swapfile aktivieren │ -└────────────┬────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────┐ -│ 5. Temporären Swap deaktivieren │ -│ und löschen │ -└─────────────────────────────────────┘ + ┌────────────┐ + │ 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 während der Operation +- **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 @@ -133,9 +196,11 @@ Diese Formel orientiert sich an gängigen Best Practices für Swap-Dimensionieru - **Betriebssystem**: Debian, Ubuntu oder andere Debian-Derivate - **Kernel**: Linux mit Swap-Unterstützung -- **Tools**: `bash`, `dd`, `free`, `mkswap`, `swapon`, `swapoff`, `stat`, `df` +- **Tools**: `bash`, `dd`, `free`, `mkswap`, `swapon`, `swapoff`, `stat`, `df`, `wc` - **Rechte**: Root-Zugriff erforderlich -- **Speicher**: Mindestens RAM + 2GB + 10GB freier Festplattenspeicher +- **Speicher**: + - Bei Neuanlage: Mindestens RAM + 2GB freier Festplattenspeicher + - Bei Vergrößerung: Mindestens RAM + 2GB + 10GB freier Festplattenspeicher ## ⚙️ Konfiguration @@ -144,11 +209,11 @@ Diese Formel orientiert sich an gängigen Best Practices für Swap-Dimensionieru Im Skript können folgende Variablen angepasst werden: ```bash -# Temporäre Swap-Größe (in MB) +# 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) -RAM_ADDITION=2048 # Standard: 2 GB +# TARGET_MB=$((RAM_MB + 2048)) # Standard: RAM + 2GB ``` ### Beispiel: Custom-Größe @@ -157,35 +222,89 @@ Für ein System mit speziellen Anforderungen: ```bash # Im Skript anpassen: -RAM_ADDITION=4096 # RAM + 4GB statt 2GB -TEMP_SWAP_SIZE_MB=20480 # 20GB temporärer Swap +TARGET_MB=$((RAM_MB + 4096)) # RAM + 4GB statt 2GB +TEMP_SWAP_SIZE_MB=20480 # 20GB temporärer Swap ``` ## 📊 Verwendungsszenarien -### Szenario 1: Server mit 16GB RAM +### Szenario 1: Neuinstallation ohne Swap +**Ausgangssituation:** ``` RAM: 16384 MB -Berechnung: 16384 + 2048 = 18432 MB -Ergebnis: 18.4 GB Swap +Swap aktiv: Nein +Aktion: Direktes Anlegen (3 Schritte) ``` -### Szenario 2: Server mit 128GB RAM - +**Ergebnis:** ``` -RAM: 131072 MB -Berechnung: 131072 + 2048 = 133120 MB -Ergebnis: 133 GB Swap +Neuer Swap: 18432 MB (18.4 GB) +Workflow: WORKFLOW 1 (effizient) +Benötigter Platz: 18432 MB ``` -### Szenario 3: Swap bereits groß genug +### 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 -Aktuell: 16384 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 @@ -200,7 +319,7 @@ Benötigt: 28672 MB, Verfügbar: 20000 MB **Lösung:** - Speicherplatz freigeben auf dem entsprechenden Volume -- Temporäre Swap-Größe reduzieren (`TEMP_SWAP_SIZE_MB`) +- Bei Vergrößerung: Temporäre Swap-Größe reduzieren (`TEMP_SWAP_SIZE_MB`) - Alternative Partition für Swap verwenden ### Problem: Swap bereits groß genug @@ -213,7 +332,7 @@ Aktuelle Größe (20480 MB) >= Zielgröße (18432 MB) **Lösung:** - Normal - keine Aktion erforderlich -- Falls dennoch Anpassung gewünscht, `TARGET_MB` manuell anpassen +- Falls dennoch Anpassung gewünscht, Berechnungsformel im Skript anpassen ### Problem: Keine Root-Rechte @@ -224,9 +343,20 @@ Fehler: Dieses Skript muss als root ausgeführt werden **Lösung:** ```bash -sudo ./resizeswap.py +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 @@ -261,20 +391,29 @@ Erwartete Ausgabe: 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 | -|----------|------------------|-------------------| -| 1-2 GB | RAM × 2 | RAM + 2GB | -| 2-8 GB | RAM × 1.5 | RAM + 2GB | -| 8-64 GB | RAM + 2-4 GB | RAM + 2GB ✓ | -| > 64 GB | 8-32 GB | RAM + 2GB | +| 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: @@ -295,6 +434,7 @@ Pull Requests sind willkommen: - 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 @@ -309,7 +449,22 @@ Dieses Projekt ist für den internen Gebrauch bei JTL-Software entwickelt. ## 🔖 Changelog -### Version 1.0.0 (2025-10-24) +### 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 @@ -323,7 +478,9 @@ Dieses Projekt ist für den internen Gebrauch bei JTL-Software entwickelt. ### Sicherheit - **Root-Rechte erforderlich**: Skript manipuliert System-Level Ressourcen -- **Temporärer Speicherbedarf**: Benötigt kurzzeitig Zielgröße + 10GB +- **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 @@ -333,6 +490,18 @@ Dieses Projekt ist für den internen Gebrauch bei JTL-Software entwickelt. - 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 | ⚠️ | ✅ | ---