Files
change-swap-size/README.md
2025-12-01 19:34:53 +01:00

508 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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**