# System

# systemd

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-systemd-ist-der-stan"><div>**`systemd`** ist der Standard-Init-Prozess und System-Manager in fast allen modernen Linux-Distributionen (z. B. Ubuntu, Debian, RHEL, Fedora, Arch Linux). Es wurde 2010 von Lennart Poettering und Kay Sievers entwickelt, um das alte, sequenzielle SysVinit-System abzulösen.</div>  
</div>### 1. Was ist systemd und welche Aufgaben hat es?

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-der-prozess-systemd-"><div>Der Prozess `systemd` startet direkt nach dem Linux-Kernel und erhält immer die **Process ID (PID) 1**. Als Mutter aller Prozesse verfolgt und verwaltet es den gesamten Zustand des Betriebssystems.</div>  
</div>#### Haupteigenschaften

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-parallelisierung%3A-di">- <div>**Parallelisierung:** Dienste werden beim Systemstart parallel gestartet, was die Bootzeit drastisch verkürzt.</div>
- <div>**Socket- und D-Bus-Aktivierung:** Dienste werden erst gestartet, wenn auf ein Socket zugegriffen wird oder ein D-Bus-Aufruf eingeht (Lazy Loading).</div>
- <div>**Automatischer Dienst-Neustart:** Stürzt ein Prozess ab, kann `systemd` ihn sofort neu starten.</div>
- <div>**Prozess-Tracking mit [cgroups](https://bookstack.michael-bohn.net/books/system/page/cgroups):** Prozess-Gruppen werden sauber isoliert. Stoppt man einen Dienst, werden auch alle Tochterprozesse verlässlich beendet.</div>
- <div>**Einheitliches Logging:** Zentrale Protokollierung aller System- und Dienstnachrichten über den Daemon `journald`.</div>

</div>### 2. Das Konzept der "Units"

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-in-systemd-wird-alle"><div>In `systemd` wird alles über sogenannte **Units** verwaltet. Jede Unit repräsentiert eine Systemressource oder eine Aufgabe. Es gibt verschiedene Unit-Typen, erkennbar an ihrer Dateiendung:</div>  
<table><thead><tr><td>**Unit-Typ**</td><td>**Endung**</td><td>**Beschreibung**</td></tr></thead><tbody><tr><td><span>**Service**</span></td><td><span>`.service`</span></td><td><span>Verwaltet Hintergrundprozesse / Daemons (z. B. `nginx.service`, `ssh.service`).</span></td></tr><tr><td><span>**Target**</span></td><td><span>`.target`</span></td><td><span>Gruppiert andere Units (entspricht den alten Runleveln, z. B. `multi-user.target`).</span></td></tr><tr><td><span>**Socket**</span></td><td><span>`.socket`</span></td><td><span>Hört auf Netzwerksockets oder IPC-Pipes zur Socket-Aktivierung.</span></td></tr><tr><td><span>**Timer**</span></td><td><span>`.timer`</span></td><td><span>Zeitgesteuerter Ausführungstrigger (Ersatz für klassische Cronjobs).</span></td></tr><tr><td><span>**Mount / Automount**</span></td><td><span>`.mount` / `.automount`</span></td><td><span>Steuert das Einhängen von Dateisystemen (`/etc/fstab`-Ersatz).</span></td></tr><tr><td><span>**Path**</span></td><td><span>`.path`</span></td><td><span>Überwacht Dateien/Ordner auf Änderungen und startet daraufhin Services.</span></td></tr><tr><td><span>**Slice / Scope**</span></td><td><span>`.slice` / `.scope`</span></td><td><span>Verwaltet Ressourcenbeschränkungen (CPU, RAM) via cgroups.</span></td></tr></tbody></table>

</div>### 3. Dateipfade &amp; Speicherorte für Konfigurationen

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-konfigurationsdateie"><div>Konfigurationsdateien sind in einer strikten Hierarchie organisiert:</div>  
1. <div>**`/lib/systemd/system/` (oder `/usr/lib/systemd/system/`)**</div>  
    
    - <div>Hier liegen die vom Paketmanager (APT, DNF, Pacman) installierten Standard-Units.</div>
    - <div>**Wichtig:** Diese Dateien niemals manuell bearbeiten, da sie bei Updates überschrieben werden!</div>
2. <div>**`/run/systemd/system/`**</div>  
    
    - <div>Zur Laufzeit generierte Units (z. B. temporäre Einstellungen).</div>
3. <div>**`/etc/systemd/system/`**</div>  
    
    - <div>**Der Ort für eigene Konfigurationen.**</div>
    - <div>Hier abgelegte Dateien haben Vorrang vor den Dateien in `/lib/systemd/system/`.</div>

</div>### 4. Aufbau einer `.service`-Unit-Datei

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-eine-service-datei-b"><div>Eine Service-Datei besteht typischerweise aus drei Hauptabschnitten: `[Unit]`, `[Service]` und `[Install]`.</div>  
</div><div class="code-block ng-tns-c25623069-24 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-ini%2C-toml"><div class="formatted-code-block-internal-container ng-tns-c25623069-24"><div class="animated-opacity ng-tns-c25623069-24"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-24 ng-star-inserted"><span class="ng-tns-c25623069-24">Ini, TOML</span><div class="buttons ng-tns-c25623069-24 ng-star-inserted"></div></div></div></div></div>```
[Unit]
Description=Mein eigener Python-Webservice
After=network.target remote-fs.target
Wants=postgresql.service

[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/var/www/myextension
ExecStart=/usr/bin/python3 /var/www/myextension/app.py
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s

# Sicherheits-Hardening (Optional)
ProtectSystem=full
PrivateTmp=true

[Install]
WantedBy=multi-user.target

```

<div class="code-block ng-tns-c25623069-24 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-"><div class="formatted-code-block-internal-container ng-tns-c25623069-24"><div class="animated-opacity ng-tns-c25623069-24"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--1"></div>#### Die Abschnitte im Detail:

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%5Bunit%5D-description%3A-">- <div>**`[Unit]`**</div>  
    
    - <div>`Description`: Menschlich lesbarer Name.</div>
    - <div>`After`: Der Dienst startet erst **nach** den hier angegebenen Units.</div>
    - <div>`Requires`: Strikte Abhängigkeit. Schlägt eine hier genannte Unit fehl, startet auch dieser Dienst nicht.</div>
    - <div>`Wants`: Schwache Abhängigkeit. Versucht die genannte Unit zu starten, bricht aber bei Fehler nicht ab.</div>
- <div>**`[Service]`**</div>  
    
    - <div>`Type`:</div>  
        
        - <div>`simple` (Standard): Der Befehl in `ExecStart` ist der Hauptprozess.</div>
        - <div>`forking`: Für klassische Daemons, die sich im Hintergrund abspalten (forken).</div>
        - <div>`oneshot`: Kurzläufer-Skripte, die einmalig laufen und sich beenden.</div>
    - <div>`ExecStart`: Der exakte Befehl zum Starten (immer mit absolutem Pfad!).</div>
    - <div>`Restart`: Wann soll neu gestartet werden? (`always`, `on-failure`, `no`).</div>
    - <div>`RestartSec`: Wartezeit vor dem Neustart.</div>
- <div>**`[Install]`**</div>  
    
    - <div>`WantedBy`: Bestimmt, in welchem Target die Unit beim Systemstart geladen wird (z. B. `multi-user.target` entspricht dem alten Runlevel 3 - Konsolenmodus).</div>

</div>### 5. Wichtige Befehle zur Verwaltung

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-die-steuerung-von-sy"><div>Die Steuerung von `systemd` erfolgt über das Befehlszeilenwerkzeug **`systemctl`**.</div>  
</div>#### Steuerung von Diensten

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--2"></div><div class="code-block ng-tns-c25623069-25 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash"><div class="formatted-code-block-internal-container ng-tns-c25623069-25"><div class="animated-opacity ng-tns-c25623069-25"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-25 ng-star-inserted"><span class="ng-tns-c25623069-25">Bash</span><div class="buttons ng-tns-c25623069-25 ng-star-inserted"></div></div></div></div></div>```
# Status eines Dienstes prüfen
systemctl status mein-dienst.service

# Dienst sofort starten / stoppen / neustarten
systemctl start mein-dienst
systemctl stop mein-dienst
systemctl restart mein-dienst

# Konfiguration neu laden ohne den Dienst zu stoppen
systemctl reload mein-dienst

# Autostart beim Booten aktivieren / deaktivieren
systemctl enable mein-dienst
systemctl disable mein-dienst

# Autostart aktivieren UND sofort starten
systemctl enable --now mein-dienst

```

<div class="code-block ng-tns-c25623069-25 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--3"><div class="formatted-code-block-internal-container ng-tns-c25623069-25"><div class="animated-opacity ng-tns-c25623069-25"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--4"></div>#### Konfiguration bearbeiten und laden

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--5"></div><div class="code-block ng-tns-c25623069-26 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash-1"><div class="formatted-code-block-internal-container ng-tns-c25623069-26"><div class="animated-opacity ng-tns-c25623069-26"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-26 ng-star-inserted"><span class="ng-tns-c25623069-26">Bash</span><div class="buttons ng-tns-c25623069-26 ng-star-inserted"></div></div></div></div></div>```
# Erstellt/Editiert einen Override in /etc/systemd/system/
systemctl edit mein-dienst.service

# systemd-Daemon anweisen, Geänderte Unit-Dateien neu einzulesen (SEHR WICHTIG!)
systemctl daemon-reload

```

<div class="code-block ng-tns-c25623069-26 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--6"><div class="formatted-code-block-internal-container ng-tns-c25623069-26"><div class="animated-opacity ng-tns-c25623069-26"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--7"></div>#### Targets und Systemzustände

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--8"></div><div class="code-block ng-tns-c25623069-27 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash-2"><div class="formatted-code-block-internal-container ng-tns-c25623069-27"><div class="animated-opacity ng-tns-c25623069-27"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-27 ng-star-inserted"><span class="ng-tns-c25623069-27">Bash</span><div class="buttons ng-tns-c25623069-27 ng-star-inserted"></div></div></div></div></div>```
# Aktuelles Standard-Target anzeigen
systemctl get-default

# Auf grafische Oberfläche (Runlevel 5) umstellen
systemctl set-default graphical.target

# Auf Konsolenmodus (Runlevel 3) umstellen
systemctl set-default multi-user.target

```

<div class="code-block ng-tns-c25623069-27 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--9"><div class="formatted-code-block-internal-container ng-tns-c25623069-27"><div class="animated-opacity ng-tns-c25623069-27"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--10"></div>### 6. Logging mit `journald`

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-systemd-journald-sam"><div>`systemd-journald` sammelt zentral alle Systemnachrichten (Kernel-Logs, stdout/stderr von Services, Syslog). Der Zugriff erfolgt über **`journalctl`**.</div>  
</div><div class="code-block ng-tns-c25623069-28 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash-3"><div class="formatted-code-block-internal-container ng-tns-c25623069-28"><div class="animated-opacity ng-tns-c25623069-28"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-28 ng-star-inserted"><span class="ng-tns-c25623069-28">Bash</span><div class="buttons ng-tns-c25623069-28 ng-star-inserted"></div></div></div></div></div>```
# Gesamtes Protokoll seit dem letzten Bootvorgang anzeigen
journalctl -b

# Live-Logs eines spezifischen Dienstes verfolgen (wie tail -f)
journalctl -u mein-dienst.service -f

# Logs der letzten 2 Stunden anzeigen
journalctl --since "2 hours ago"

# Nur Fehler-Nachrichten anzeigen
journalctl -u mein-dienst.service -p err

```

<div class="code-block ng-tns-c25623069-28 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--11"><div class="formatted-code-block-internal-container ng-tns-c25623069-28"><div class="animated-opacity ng-tns-c25623069-28"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--12"></div>### 7. Weitere wichtige Komponenten des systemd-Ökosystems

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-systemd-ist-l%C3%A4ngst-m"><div>`systemd` ist längst mehr als nur ein Init-System, sondern eine Suite von Werkzeugen:</div>  
- <div>**`timedatectl`**: Verwaltung von Zeitzone und NTP-Ressourcen.</div>
- <div>**`hostnamectl`**: Verwaltung des Hostnamens und System-Metadaten.</div>
- <div>**`localectl`**: Verwaltung von Tastaturlayouts und System-Locales.</div>
- <div>**`resolved`**: Ein lokaler DNS-Resolver Daemon (`resolvectl`).</div>
- <div>**`networkd`**: Netzwerkkonfiguration für Interfaces.</div>
- <div>**`logind`**: Verwaltet Benutzer-Sitzungen und Power-Management (Reboot, Suspend).</div>

</div>

# cgroups

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-control-groups-%28cgro"><div>**Control Groups (cgroups)** spielen eine zentrale Schlüsselrolle in `systemd`. Sie bilden das fundamentale Kernel-Feature, mit dem `systemd` Prozesse **gruppiert, verfolgt, isoliert und bezüglich ihrer Systemressourcen beschränkt**.</div>  
<div>Vor `systemd` nutzten klassische Init-Systeme (wie SysVinit) Prozess-IDs (PIDs) und PID-Dateien (`.pid`), um zu verfolgen, welche Prozesse zu welchem Dienst gehörten. Wenn ein Dienst Tochterprozesse erzeugte (z. B. ein Apache-Webserver mit vielen Worker-Prozessen) und abstürzte oder unsauber beendet wurde, blieben verwaiste Prozesse („Zombie-Prozesse“) im System zurück.</div>  
<div>Mit cgroups gelingt `systemd` die vollständige und lückenlose Prozesskontrolle.</div>  
</div>### 1. Die Kernaufgaben von cgroups in systemd

#### A. Lückenloses Prozess-Tracking (Keine "Verwaisten Prozesse")

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-jeder-dienst%2C-den-sy"><div>Jeder Dienst, den `systemd` startet, wird in seine eigene cgroup platziert.</div>  
- <div>Wenn ein Prozess neue Tochterprozesse startet (`fork()`), erben diese **automatisch** dieselbe cgroup.</div>
- <div>Selbst wenn sich ein Dämon versucht zu tarnen oder von seinem Elternprozess abspaltet, bleibt er in der cgroup gefangen.</div>
- <div>**Ergebnis:** Wenn Sie `systemctl stop mein-dienst` ausführen, sendet `systemd` das Stopp-Signal an die *gesamte cgroup*. Dadurch werden verlässlich **alle** dazugehörigen Prozesse beendet.</div>

</div>#### B. Ressourcenbeschränkung und -kontrolle (Resource Limiting)

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%C3%9Cber-cgroups-kann-sy"><div>Über cgroups kann `systemd` genau festlegen, wie viel Hardware-Ressourcen eine Unit oder eine Gruppe von Units verbrauchen darf. Sie können das direkt in der Unit-Datei konfigurieren:</div>  
- <div>**Arbeitsspeicher (RAM):**</div>  
    
    - <div>`MemoryMax=500M` – Der Dienst darf maximal 500 MB RAM nutzen. Wächst er darüber hinaus, greift der Out-Of-Memory (OOM) Killer gezielt für diesen Dienst.</div>
    - <div>`MemoryHigh=400M` – Drosselt den Prozess sanft ab 400 MB, bevor das harte Limit erreicht wird.</div>
- <div>**CPU-Leistung:**</div>  
    
    - <div>`CPUQuota=50%` – Beschränkt den Dienst auf maximal 50% eines CPU-Kerns.</div>
    - <div>`CPUWeight=100` – Priorisierung der CPU-Zeit im Vergleich zu anderen cgroups (Standard ist 100).</div>
- <div>**Festplatten-I/O:**</div>  
    
    - <div>`IOReadBandwidthMax=/dev/sda 10M` – Beschränkt das Lesen von der Festplatte auf 10 MB/s.</div>
- <div>**Tasks/Prozesse (Fork-Bomb-Schutz):**</div>  
    
    - <div>`TasksMax=100` – Der Dienst darf maximal 100 Unterprozesse/Threads gleichzeitig öffnen.</div>

</div>### 2. Die cgroup-Hierarchie in systemd

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-systemd-baut-beim-sy"><div>`systemd` baut beim Systemstart eine baumartige Struktur unter dem virtuellen Dateisystem `/sys/fs/cgroup/` auf. Diese Struktur unterteilt die Last des Systems in drei Hauptzweige (Slices):</div>  
</div><div class="code-block ng-tns-c25623069-45 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-plaintext"><div class="formatted-code-block-internal-container ng-tns-c25623069-45"><div class="animated-opacity ng-tns-c25623069-45"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-45 ng-star-inserted"><span class="ng-tns-c25623069-45">Plaintext</span><div class="buttons ng-tns-c25623069-45 ng-star-inserted"></div></div></div></div></div>```
/sys/fs/cgroup/
├── system.slice      --> Alle Systemdienste (z. B. nginx, sshd, docker)
├── user.slice        --> Angemeldete Benutzer & deren Sitzungen/Prozesse
└── machine.slice     --> Virtuelle Maschinen (KVM/QEMU) & LXC/Systemd-Container

```

<div class="code-block ng-tns-c25623069-45 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-"><div class="formatted-code-block-internal-container ng-tns-c25623069-45"><div class="animated-opacity ng-tns-c25623069-45"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-slices-%28.slice%29%3A-log">- <div>**Slices (`.slice`):** Logische Gruppen, um Ressourcen hierarchisch zu verteilen (z. B. "Systemdienste bekommen insgesamt maximal 70% CPU, angemeldete User 30%").</div>
- <div>**Scopes (`.scope`):** Automatisch erstellte Gruppen für Prozesse, die nicht von `systemd` selbst gestartet wurden (z. B. eine SSH-Benutzersitzung).</div>
- <div>**Services (`.service`):** Die einzelnen Dienste innerhalb der Slices.</div>

</div>### 3. Befehle zum Anzeigen und Steuern von cgroups

#### Der Befehl `systemd-cgls` (cgroup list)

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-zeigt-den-gesamten-c"><div>Zeigt den gesamten cgroup-Baum des Systems inklusive aller laufenden PIDs an:</div>  
</div><div class="code-block ng-tns-c25623069-46 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash"><div class="formatted-code-block-internal-container ng-tns-c25623069-46"><div class="animated-opacity ng-tns-c25623069-46"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-46 ng-star-inserted"><span class="ng-tns-c25623069-46">Bash</span><div class="buttons ng-tns-c25623069-46 ng-star-inserted"></div></div></div></div></div>```
systemd-cgls

```

<div class="code-block ng-tns-c25623069-46 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1"><div class="formatted-code-block-internal-container ng-tns-c25623069-46"><div class="animated-opacity ng-tns-c25623069-46"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--2"></div>#### Der Befehl `systemd-cgtop` (cgroup top)

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%C3%84hnlich-wie-der-norm"><div>Ähnlich wie der normale `top`-Befehl, zeigt aber den Live-Ressourcenverbrauch (CPU, RAM, I/O) aufgeteilt nach cgroups/Services an:</div>  
</div><div class="code-block ng-tns-c25623069-47 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash-1"><div class="formatted-code-block-internal-container ng-tns-c25623069-47"><div class="animated-opacity ng-tns-c25623069-47"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-47 ng-star-inserted"><span class="ng-tns-c25623069-47">Bash</span><div class="buttons ng-tns-c25623069-47 ng-star-inserted"></div></div></div></div></div>```
systemd-cgtop

```

<div class="code-block ng-tns-c25623069-47 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--3"><div class="formatted-code-block-internal-container ng-tns-c25623069-47"><div class="animated-opacity ng-tns-c25623069-47"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--4"></div>#### Ressourcen zur Laufzeit anpassen

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-sie-k%C3%B6nnen-limits-ei"><div>Sie können Limits eines laufenden Dienstes dynamisch anpassen, ohne die Unit-Datei manuell zu bearbeiten:</div>  
</div><div class="code-block ng-tns-c25623069-48 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash-2"><div class="formatted-code-block-internal-container ng-tns-c25623069-48"><div class="animated-opacity ng-tns-c25623069-48"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-48 ng-star-inserted"><span class="ng-tns-c25623069-48">Bash</span><div class="buttons ng-tns-c25623069-48 ng-star-inserted"></div></div></div></div></div>```
# Setzt das Arbeitsspeicher-Limit für Nginx sofort auf 1 GB
systemctl set-property nginx.service MemoryMax=1G

```

<div class="code-block ng-tns-c25623069-48 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--5"><div class="formatted-code-block-internal-container ng-tns-c25623069-48"><div class="animated-opacity ng-tns-c25623069-48"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--6"></div>### 4. Die Bedeutung von cgroups für Container (Docker, Podman)

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-cgroups-sind-zusamme"><div>Cgroups sind zusammen mit Linux **Namespaces** die fundamentale Grundlage moderner Container-Technologien:</div>  
- <div>**Namespaces** sorgen für die *Isolierung* (Der Container sieht nur seine eigenen Dateien, Netzwerke und Prozesse).</div>
- <div>**CGroups** sorgen für die *Ressourcenbegrenzung* (Der Container kann das Wirtssystem nicht lahmlegen).</div>

<div>Da `systemd` cgroups nativ verwaltet, integrieren sich Container-Runtimes wie Docker, Podman oder `containerd` meist direkt mit dem `systemd`-cgroup-Treiber.</div></div>

# namespaces

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-linux-namespaces-sin"><div>**Linux Namespaces** sind ein fundamentales Feature des Linux-Kernels, das die Grundlage für moderne Container-Technologien (wie Docker, Podman oder Kubernetes) bildet.</div>  
<div>Einfach ausgedrückt: **Namespaces isolieren Systemressourcen für bestimmte Prozesse.**</div>  
<div>Ein Prozess (oder eine Gruppe von Prozessen), der sich in einem eigenen Namespace befindet, sieht nur die Ressourcen, die diesem Namespace zugewiesen sind. Aus der Perspektive des Prozesses sieht es so aus, als hätte er ein eigenes, völlig isoliertes Linux-System für sich allein.</div>  
</div>### 1. Die Analogie: Das Bürogebäude

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-stell-dir-das-linux-"><div>Stell dir das Linux-Betriebssystem wie ein großes Bürogebäude vor:</div>  
- <div>**Ohne Namespaces (Klassisches Linux):** Alle Mitarbeiter (Prozesse) arbeiten im selben Open-Space-Büro. Jeder sieht jeden, nutzt dieselbe Kaffeemaschine (Dateisystem), dieselbe Telefonanlage (Netzwerk) und sieht die gleichen Namensschilder (PIDs).</div>
- <div>**Mit Namespaces (Container-Prinzip):** Das Bürogebäude wird in Einzelbüros mit Milchglas und eigenen Telefonanlagen unterteilt. Mitarbeiter in *Büro A* wissen nicht einmal, dass Mitarbeiter in *Büro B* existieren. Sie haben ihre eigene Kaffeemaschine und eigene Durchwahlnummern – obwohl sie sich alle im selben Gebäude befinden und das gleiche Fundament (den Kernel) teilen.</div>

</div>### 2. Die 8 Typen von Linux Namespaces

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-linux-stellt-verschi"><div>Linux stellt verschiedene Arten von Namespaces zur Verfügung. Jeder Typ isoliert eine ganz bestimmte Systemressource:</div>  
<table><thead><tr><td>**Namespace-Typ**</td><td>**Isolierte Ressource**</td><td>**Was der Prozess sieht**</td></tr></thead><tbody><tr><td><span>**PID** (Process ID)</span></td><td><span>Prozess-IDs</span></td><td><span>Einen eigenen Prozess-Baum. Prozess `#1` im Namespace ist die "Initiator-PID", obwohl er auf dem Host eine ganz andere PID hat.</span></td></tr><tr><td><span>**NET** (Network)</span></td><td><span>Netzwerk-Stack</span></td><td><span>Eigene Netzwerk-Interfaces (`eth0`, `lo`), eigene Routing-Tabellen, Firewall-Regeln (iptables) und Port-Belegungen.</span></td></tr><tr><td><span>**MNT** (Mount)</span></td><td><span>Dateisystem-Mountpoints</span></td><td><span>Einen eigenen Mount-Baum. Änderungen an Dateisystem-Mounts betreffen nur diesen Namespace.</span></td></tr><tr><td><span>**UTS** (UNIX Timesharing)</span></td><td><span>Hostname &amp; Domain</span></td><td><span>Einen eigenen Hostnamen (z. B. `my-container`) unabhängig vom tatsächlichen Host-Namen.</span></td></tr><tr><td><span>**IPC** (Inter-Process Comm.)</span></td><td><span>Shared Memory &amp; Queues</span></td><td><span>Eigene System V IPC-Objekte und POSIX Message Queues (Prozesse aus verschiedenen IPC-Namespaces können nicht direkt über Shared Memory kommunizieren).</span></td></tr><tr><td><span>**USER** (User IDs)</span></td><td><span>Benutzer &amp; Gruppen (UID/GID)</span></td><td><span>Ein normaler Benutzer auf dem Hostsystem kann **Root (UID 0)** innerhalb seines User-Namespaces sein (wichtig für die Sicherheit!).</span></td></tr><tr><td><span>**CGROUP**</span></td><td><span>Control Groups</span></td><td><span>Sichtbarkeit der eigenen Cgroup-Hierarchie (Ressourcen-Limits wie CPU/RAM).</span></td></tr><tr><td><span>**TIME**</span></td><td><span>Systemzeit</span></td><td><span>Abweichende Systemzeiten/Uhrzeiten (z. B. für Testumgebungen mit simulierten Datumswerten).</span></td></tr></tbody></table>

</div>### 3. Wie Namespaces technisch funktionieren

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-im-kernel-ist-jeder-"><div>Im Kernel ist jeder Prozess durch eine Struktur namens `task_struct` repräsentiert. Diese Struktur enthält Zeiger auf die jeweiligen Namespaces, zu denen der Prozess gehört.</div>  
</div>#### System Calls zur Steuerung:

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-es-gibt-drei-prim%C3%A4re"><div>Es gibt drei primäre Systemaufrufe (System Calls) in C, um mit Namespaces zu interagieren:</div>  
1. <div>**`clone()`**: Erstellt einen neuen Kind-Prozess (ähnlich wie `fork()`), kann aber über Flags (z. B. `CLONE_NEWNET`, `CLONE_NEWPID`) direkt neue Namespaces für das Kind anlegen.</div>
2. <div>**`unshare()`**: Erlaubt einem bereits laufenden Prozess, sich von seinen bisherigen Namespaces zu lösen und neue zu erstellen.</div>
3. <div>**`setns()`**: Klinkt einen Prozess in einen bereits existierenden Namespace ein (das nutzt z. B. `docker exec`, um sich in den Namespace eines laufenden Containers einzuklinken).</div>

</div>### 4. Praxistest: Namespaces auf der Kommandozeile ausprobieren

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-du-kannst-namespaces"><div>Du kannst Namespaces direkt mit dem Utility-Befehl `unshare` in deiner Linux-Shell testen.</div>  
</div>#### Beispiel 1: Einen eigenen Hostnamen-Namespace (UTS) erstellen

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-"></div><div class="code-block ng-tns-c25623069-56 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash"><div class="formatted-code-block-internal-container ng-tns-c25623069-56"><div class="animated-opacity ng-tns-c25623069-56"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-56 ng-star-inserted"><span class="ng-tns-c25623069-56">Bash</span><div class="buttons ng-tns-c25623069-56 ng-star-inserted"></div></div></div></div></div>```
# Erstelle ein neues UTS-Namespace und starte darin eine Bash
sudo unshare --uts bash

# Ändere den Hostnamen innerhalb des Namespaces
hostname isolierter-host

# Überprüfe den Namen:
hostname
# Output: isolierter-host

```

<div class="code-block ng-tns-c25623069-56 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1"><div class="formatted-code-block-internal-container ng-tns-c25623069-56"><div class="animated-opacity ng-tns-c25623069-56"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-wenn-du-nun-ein-zwei"><div>*Wenn du nun ein zweites Terminal auf deinem Rechner öffnest und `hostname` eingibst, siehst du weiterhin deinen ursprünglichen Hostnamen.*</div>  
</div>#### Beispiel 2: Einen eigenen Prozess-Namespace (PID) erstellen

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--2"></div><div class="code-block ng-tns-c25623069-57 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash-1"><div class="formatted-code-block-internal-container ng-tns-c25623069-57"><div class="animated-opacity ng-tns-c25623069-57"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-57 ng-star-inserted"><span class="ng-tns-c25623069-57">Bash</span><div class="buttons ng-tns-c25623069-57 ng-star-inserted"></div></div></div></div></div>```
# Erstelle einen neuen PID- und Mount-Namespace
sudo unshare --pid --mount-proc --fork bash

# Welches ist die PID dieses Prozesses im Namespace?
ps aux

```

<div class="code-block ng-tns-c25623069-57 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--3"><div class="formatted-code-block-internal-container ng-tns-c25623069-57"><div class="animated-opacity ng-tns-c25623069-57"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-du-wirst-sehen%2C-dass"><div>*Du wirst sehen, dass deine `bash` plötzlich die **PID 1** hat und du keine anderen Prozesse deines echten Rechners mehr sehen kannst.*</div>  
</div>### 5. Namespaces vs. Cgroups vs. Chroot: Wo liegt der Unterschied?

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-oft-werden-diese-beg"><div>Oft werden diese Begriffe im Zusammenhang mit Containern zusammengeworfen. Sie erfüllen jedoch unterschiedliche Aufgaben:</div>  
- <div>**Namespaces = Isolierung *(Was kann ich sehen?)*:** Sie bestimmen, welche Ressourcen (Netzwerke, Prozesse, Dateien) ein Prozess überhaupt wahrnehmen kann.</div>
- <div>**Cgroups (Control Groups) = Limitierung *(Was darf ich nutzen?)*:** Sie begrenzen, wie viel CPU, Arbeitsspeicher, I/O-Bandbreite oder Disk-Performance ein Prozess nutzen darf.</div>
- <div>**Chroot = Pfad-Sperre *(Wo darf ich hin?)*:** Ein älterer Mechanismus, der lediglich das Root-Verzeichnis (`/`) für einen Prozess ändert. (Mount-Namespaces sind die moderne, viel sicherere Weiterentwicklung davon).</div>

</div>> <div>**Ein Docker-Container ist im Grunde nichts anderes als ein ganz normaler Linux-Prozess, für den der Kernel mehrere Namespaces und Cgroups kombiniert hat.**</div>

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-linux-namespaces-sin-1"><div>Linux Namespaces sind die Zauberei hinter der Container-Revolution. Sie sorgen dafür, dass Prozesse gegeneinander abgeschottet werden, ohne dass dafür ein schwerfälliger Hypervisor oder ein zweites Betriebssystem (wie bei einer virtuellen Maschine) geladen werden muss. Das macht Container extrem leichtgewichtig und schnell.</div></div><div id="bkmrk--4"></div><div id="bkmrk-user-namespaces-geh%C3%B6"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>**User Namespaces** gehören zu den mächtigsten Sicherheitsfeatures des Linux-Kernels. Sie ermöglichen die Trennung und Zuordnung (Mapping) von Benutzer- und Gruppen-IDs (UIDs/GIDs) zwischen dem Host-System und dem isolierten Namespace.</div>  
<div>Kurz gesagt: **Ein Prozess kann innerhalb seines User Namespaces volle Root-Rechte (UID 0) besitzen, ist aber auf dem eigentlichen Host-System ein völlig gewöhnlicher, privilegienloser Benutzer (z. B. UID 1000).**</div>  
</div></div>### 1. Das Kernprinzip: UID/GID Mapping

<div id="bkmrk-das-herzst%C3%BCck-der-us"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Das Herzstück der User Namespaces ist das sogenannte **UID Mapping**. Der Linux-Kernel übersetzt dabei die Benutzer-IDs dynamisch an den Grenzen des Namespaces.</div>  
<div>Ein vereinfachtes Mapping-Schema sieht so aus:</div>  
</div></div><div class="code-block ng-tns-c25623069-65 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-plaintext"><div class="formatted-code-block-internal-container ng-tns-c25623069-65"><div class="animated-opacity ng-tns-c25623069-65"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-65 ng-star-inserted"><span class="ng-tns-c25623069-65">Plaintext</span><div class="buttons ng-tns-c25623069-65 ng-star-inserted"></div></div></div></div></div>```
[ Innerhalb des User Namespaces ]    --->    [ Auf dem Host-System ]
  UID 0   (Root im Container)       --->      UID 1000  (Dein normaler User)
  UID 1   (Sub-User 1)              --->      UID 100001
  UID 2   (Sub-User 2)              --->      UID 100002

```

<div class="code-block ng-tns-c25623069-65 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--5"><div class="formatted-code-block-internal-container ng-tns-c25623069-65"><div class="animated-opacity ng-tns-c25623069-65"></div></div></div><div id="bkmrk-wenn-ein-prozess-im-"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Wenn ein Prozess im Container versucht, eine Datei zu erstellen, sieht das für den Prozess im Container so aus, als gehöre sie `root` (UID 0). Schaust du dir dieselbe Datei jedoch vom Host-System aus an, gehört sie in Wahrheit dem Benutzer `1000`.</div>  
</div></div>#### Wo wird das konfiguriert?

<div id="bkmrk-der-kernel-verwaltet"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Der Kernel verwaltet dieses Mapping über zwei Dateien im `/proc`-Dateisystem des jeweiligen Prozesses:</div>  
- <div>`/proc/<PID>/uid_map`</div>
- <div>`/proc/<PID>/gid_map`</div>

<div>Dort ist nach folgendem Muster hinterlegt, wie die UIDs übersetzt werden:</div><div>`ID-inside-NS   ID-outside-NS   Length`</div>  
<div>Beispiel: `0 100000 65536` bedeutet:</div>  
- <div>UID `0` im Namespace entspricht UID `100000` auf dem Host.</div>
- <div>Es werden insgesamt `65536` fortlaufende UIDs gemappt (also von UID 0–65535 im Container auf UID 100000–165535 auf dem Host).</div>

</div></div>### 2. Warum das herkömmliche Docker ein Sicherheitsrisiko war

<div id="bkmrk-in-der-klassischen-d"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>In der klassischen Docker-Architektur läuft der Docker-Daemon (`dockerd`) als echter **Root-User auf dem Host-System**.</div>  
<div>Wenn du einen Standard-Container startest, ist der Prozess im Container standardmäßig ebenfalls als Root (UID 0) unterwegs – und zwar **ohne** User-Namespace-Mapping:</div>  
- <div>**Container Root (UID 0) == Host Root (UID 0)**</div>

</div></div>#### Das Gefahrenszenario (Container Escape):

<div id="bkmrk-gelingt-es-einem-ang"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Gelingt es einem Angreifer durch eine Sicherheitslücke im Anwendungscode oder im Kernel, aus dem Container auszubrechen (ein sogenannter *Container Escape*), landet er direkt auf dem Host-System. Da seine UID auf dem Host ebenfalls `0` ist, hat er sofort die **vollständige Kontrolle über den gesamten Server**.</div>  
</div></div>### 3. Wie Rootless Docker mit User Namespaces maximale Sicherheit schafft

<div id="bkmrk-bei-rootless-docker-"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Bei **Rootless Docker** (sowie nativ bei Podman) läuft schon der Docker-Daemon selbst als unprivilegierter Benutzer (z. B. UID 1000) auf dem Host. Wenn nun ein Container gestartet wird, kommt zwingend ein neuer **User Namespace** zum Einsatz.</div>  
<div>Das bietet drei entscheidende Sicherheitsvorteile:</div>  
</div></div>#### A. Keine Host-Root-Rechte bei einem Container-Escape

<div id="bkmrk-bricht-ein-angreifer"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Bricht ein Angreifer aus einem Rootless-Container aus, sieht der Host-Kernel seine Aktionen nicht als `root`, sondern als gewöhnlicher Benutzer (z. B. UID 1000 oder UID 100000). Der Angreifer kann:</div>  
- <div>Keine Systemdateien wie `/etc/shadow` lesen oder verändern.</div>
- <div>Keine neuen Kernel-Module laden.</div>
- <div>Keine Festplatten neu partitionieren oder das System herunterfahren.</div>
- <div>Keine Prozesse anderer Host-Benutzer manipulieren.</div>

</div></div>#### B. Unprivilegierte Erstellung von Namespaces

<div id="bkmrk-normalerweise-erford"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Normalerweise erfordert das Erstellen von Netzwerk- oder Mount-Namespaces Root-Rechte. **User Namespaces sind die einzige Ausnahme:** Ein normaler Benutzer darf ein neues User Namespace erstellen und erlangt *innerhalb* dieses Namespaces die Rechte (Capabilities) zum Erstellen aller anderen Namespace-Typen (NET, MNT, PID etc.).</div>  
<div>Dadurch können normale Benutzer vollwertige Container starten, **ohne dass dafür jemals ein Root-Prozess beteiligt sein muss**.</div>  
</div></div>#### C. Schutz vor Privilege Escalation über Suid-Binaries oder Sockets

<div id="bkmrk-sollte-im-container-"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Sollte im Container eine SUID-Datei (wie `passwd` oder `sudo`) missbraucht werden, um im Container Root-Rechte zu erlangen, bleibt dieser Rechtegewinn strikt auf die Grenzen des User Namespaces beschränkt.</div>  
</div></div>### 4. Einschränkungen von User Namespaces &amp; Rootless Docker

<div id="bkmrk-obwohl-user-namespac"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr"><div>Obwohl User Namespaces die Sicherheit drastisch erhöhen, bringen sie bauartbedingte Einschränkungen mit sich:</div>  
1. <div>**Privilegierte Ports (&lt; 1024):** Ein Rootless-Container kann auf dem Host standardmäßig keine Ports unterhalb von 1024 (z. B. Port 80 oder 443) direkt anbinden, da dies auf dem Host weiterhin dem echten Root vorbehalten ist (lässt sich via Kernel-Parameter `net.ipv4.ip_unprivileged_port_start` anpassen).</div>
2. <div>**Dateirechte auf Mounts:** Wenn Host-Verzeichnisse in den Container gemountet werden (*Bind Mounts*), muss das UID-Mapping berücksichtigt werden. Dateien, die auf dem Host dem normalen User gehören, werden im Container eventuell als fremde UID angezeigt, wenn das Mapping nicht exakt passt.</div>
3. <div>**Cgroup v2 erforderlich:** Für eine vollständige Ressourcenbegrenzung (CPU, RAM) in Rootless-Umgebungen wird zwingend ein modernes Linux-System mit **Cgroup v2** vorausgesetzt.</div>

</div></div><div id="bkmrk-user-namespaces-entk"><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-user-namespaces-entk-1"><div>User Namespaces entkoppeln die Macht der Root-Rechte innerhalb einer isolierten Umgebung von den tatsächlichen Rechten auf dem zugrundeliegenden Betriebssystem. Sie verwandeln das Konzept von Docker vom *"Alles-oder-Nichts-Prinzip"* (Root-Daemon) hin zu einem echten **Least-Privilege-Modell**.</div><div class="attachment-container unknown"></div></div></div>

# System Load

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-die-system-load-%28ode"><div>Die **System Load** (oder *Load Average*) eines Linux-Servers gibt an, wie stark die Systemressourcen – primär die CPU und I/O-Wartezeiten – über einen bestimmten Zeitraum ausgelastet sind. Sie misst die **durchschnittliche Anzahl von Prozessen, die sich im Zustand "ausführbar" (runnable) oder "nicht unterbrechbar" (uninterruptible) befinden**.</div>  
</div>### Die 3 Werte der Load Average

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-wenn-man-befehle-wie"><div>Wenn man Befehle wie `uptime`, `top` oder `w` ausführt, sieht man drei Zahlenwerte für die Load Average:</div>  
</div><div class="code-block ng-tns-c25623069-272 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-plaintext"><div class="formatted-code-block-internal-container ng-tns-c25623069-272"><div class="animated-opacity ng-tns-c25623069-272"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-272 ng-star-inserted"><span class="ng-tns-c25623069-272">Plaintext</span><div class="buttons ng-tns-c25623069-272 ng-star-inserted"></div></div></div></div></div>```
load average: 0.75, 1.20, 2.05

```

<div class="code-block ng-tns-c25623069-272 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-"><div class="formatted-code-block-internal-container ng-tns-c25623069-272"><div class="animated-opacity ng-tns-c25623069-272"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-diese-drei-werte-rep"><div>Diese drei Werte repräsentieren den geglätteten Durchschnitt der Load über drei verschiedene Zeitintervalle:</div>  
1. <div>**1 Minute** (0.75)</div>
2. <div>**5 Minuten** (1.20)</div>
3. <div>**15 Minuten** (2.05)</div>

<div>Anhand der Entwicklung lässt sich erkennen, wohin die Tendenz geht:</div>  
- <div>**Steigend** (z. B. 0.50 <span class="math-inline">$\\rightarrow$</span> 1.20 <span class="math-inline">$\\rightarrow$</span> 2.50): Die Last nimmt aktuell zu.</div>
- <div>**Fallend** (z. B. 2.50 <span class="math-inline">$\\rightarrow$</span> 1.20 <span class="math-inline">$\\rightarrow$</span> 0.50): Das System kühlt sich gerade ab.</div>

</div>### Was bedeuten die Prozess-Zustände genau?

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-linux-z%C3%A4hlt-f%C3%BCr-die-"><div>Linux zählt für die Berechnung der Load zwei Prozess-Zustände im Kernel:</div>  
1. <div>**Running / Runnable (`R`):** Prozesse, die entweder gerade auf einer CPU ausgeführt werden oder darauf warten, von der CPU Zeit zugewiesen zu bekommen (Prozessorschlange).</div>
2. <div>**Uninterruptible Sleep (`D`):** Prozesse, die auf eine I/O-Ressource warten (z. B. Lesen/Schreiben auf der Festplatte/SSD, Dateizugriffe über NFS, Netzwerk-I/O). Während sie warten, können sie nicht unterbrochen werden.</div>

</div>> <div>**Wichtig:** Eine hohe Load bedeutet nicht zwangsläufig, dass die CPU zu 100 % ausgelastet ist. Eine langsame oder blockierte Festplatte kann viele Prozesse in den `D`-Zustand versetzen und die Load extrem in die Höhe treiben, obwohl die CPU fast nichts zu tun hat (*I/O Wait*).</div>

### Wie interpretiert man die Zahl? (CPU-Kerne berücksichtigen)

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-eine-nackte-load-zah"><div>Eine nackte Load-Zahl lässt sich nur im Kontext der **Anzahl der verfügbaren CPU-Kerne (bzw. Threads)** bewerten.</div>  
- <div>**1 CPU-Kern:**</div>  
    
    - <div>**Load = 1.00:** Der Kern ist zu genau 100 % ausgelastet. Jeder Prozess bekommt sofort Rechenzeit.</div>
    - <div>**Load = 0.50:** Der Kern ist zu 50 % ausgelastet.</div>
    - <div>**Load = 2.00:** Das System läuft über der Kapazität. Durchschnittlich wartet 1 Prozess darauf, verarbeitet zu werden (50 % Überlastung).</div>
- <div>**4 CPU-Kerne:**</div>  
    
    - <div>**Load = 4.00:** Alle 4 Kerne sind optimal zu 100 % ausgelastet.</div>
    - <div>**Load = 2.00:** Die CPU-Kapazität ist etwa zu 50 % ausgelastet.</div>
    - <div>**Load = 8.00:** Die CPU-Kapazität ist doppelt überlastet.</div>

<table><thead><tr><td>**Zustand**</td><td>**1 CPU-Kern**</td><td>**4 CPU-Kerne**</td><td>**Interpretation**</td></tr></thead><tbody><tr><td><span>**Unterauslastet**</span></td><td><span>&lt; 0.70</span></td><td><span>&lt; 2.80</span></td><td><span>Das System hat reichlich Reserven.</span></td></tr><tr><td><span>**Optimal**</span></td><td><span>0.70 – 1.00</span></td><td><span>2.80 – 4.00</span></td><td><span>Hohe Effizienz ohne Wartezeiten/Staus.</span></td></tr><tr><td><span>**Überlastet**</span></td><td><span>&gt; 1.00</span></td><td><span>&gt; 4.00</span></td><td><span>Prozesse müssen warten; Reaktionszeiten steigen.</span></td></tr></tbody></table>

<div>Die Anzahl der verfügbaren logischen Kerne lässt sich auf dem Server wie folgt abfragen:</div>  
</div><div class="code-block ng-tns-c25623069-273 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-bash"><div class="formatted-code-block-internal-container ng-tns-c25623069-273"><div class="animated-opacity ng-tns-c25623069-273"><div class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-273 ng-star-inserted"><span class="ng-tns-c25623069-273">Bash</span><div class="buttons ng-tns-c25623069-273 ng-star-inserted"></div></div></div></div></div>```
nproc

```

<div class="code-block ng-tns-c25623069-273 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1"><div class="formatted-code-block-internal-container ng-tns-c25623069-273"><div class="animated-opacity ng-tns-c25623069-273"></div></div></div><div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--2"></div>### Der Unterschied zwischen CPU-Auslastung (%) und Load

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-cpu-auslastung-%28in-%25">- <div>**CPU-Auslastung (in %):** Misst rein die verbrauchte Rechenzeit der CPU in einem bestimmten Moment. Sie kann maximal 100 % pro Kern erreichen.</div>
- <div>**System Load:** Ist ein kontinuierlicher Indikator, der auch **Warteschlangen** abbildet. Sie ist nach oben offen (eine Load von 50.0 auf einem System mit 4 Kernen zeigt eine extreme Überlastung an).</div>

</div>### Diagnose-Befehle zur Überprüfung

<div class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-um-herauszufinden%2C-w"><div>Um herauszufinden, warum die Load hoch ist, bieten sich folgende Terminal-Werkzeuge an:</div>  
1. <div>**`uptime` / `w`:** Schneller Überblick über die 1-, 5- und 15-Minuten-Load.</div>
2. <div>**`top` / `htop`:** Zeigt Echtzeit-Prozesse, CPU-Auslastung sowie den Zustand `%wa` (*I/O-Wait*).</div>
3. <div>**`dstat` / `iostat`:** Hilft festzustellen, ob eine Festplatte oder SSD der Flaschenhals ist.</div>

</div>