/var enthält alle Daten, die sich während des Betriebs laufend ändern — im Gegensatz zu den (weitgehend statischen) Inhalten von /usr. Dazu zählen Log-Dateien, Paket-Caches, Mail- und Print-Queues, Datenbank-Dateien und Server-Daten. /var ist auf produktiven Systemen der häufigste Grund für volle Festplatten — wer Logs nicht rotiert oder Docker-Container nicht aufräumt, hat hier schnell zweistellige Gigabyte angesammelt.
Was ist /var?
/var (kurz für „variable") ist im FHS (Kapitel 5) klar abgegrenzt: alles, was sich zur Laufzeit verändert und für das System persistent bleiben muss, gehört hier hin. Die FHS-Definition betont drei Eigenschaften:
- Variable Daten — wachsen, schrumpfen und ändern sich während des Betriebs.
- System-weit relevant — keine User-spezifischen Daten (die liegen in
/home). - Persistent über Reboots — anders als
/tmpoder/run.
/var und /usr ergänzen sich konzeptionell:
| Aspekt | /usr | /var |
|---|---|---|
| Inhalt | Programme, Bibliotheken, Doku | Logs, Caches, Datenbanken, Queues |
| Veränderung | Nur per Paketmanager (Updates) | Ständig zur Laufzeit |
| Read-only mountbar? | Ja, FHS-Vorgabe | Nein, muss schreibbar sein |
| Backup-Häufigkeit | Selten — wiederherstellbar via Repos | Sehr oft — enthält wichtige Zustandsdaten |
| Größenordnung | Stabil nach Installation | Wächst mit Betriebszeit |
In atomaren / image-basierten Distributionen (Fedora Silverblue, NixOS) ist /var der schreibbare Persistenz-Layer über dem read-only /usr. Auf Servern mit Container-Workload landet hier auch der Großteil des Daten-Volumens (z. B. /var/lib/docker oder /var/lib/containers).
Die wichtigsten Unterverzeichnisse
/var hat eine klar definierte interne Struktur — fast jeder Unterordner hat eine spezifische Rolle:
| Pfad | Zweck | Typische Inhalte |
|---|---|---|
/var/log | Log-Dateien aller Services und des Kernels | syslog, auth.log, nginx/access.log |
/var/lib | Persistenter Anwendungs-Zustand (Datenbanken, Paket-DB) | mysql/, dpkg/, docker/, postgresql/ |
/var/cache | Wiederherstellbare Caches — können ohne Datenverlust gelöscht werden | apt/, dnf/, man/ |
/var/spool | Warteschlangen (Mail, Print, Cron, At) | mail/, cups/, cron/ |
/var/tmp | Temporäre Dateien, die einen Reboot überstehen sollen | Wird nicht beim Boot geleert (anders als /tmp) |
/var/run | Prozess-IDs, Sockets während der Laufzeit (heute meist Symlink auf /run) | *.pid, *.sock |
/var/lock | Lock-Dateien (heute meist Symlink auf /run/lock) | LCK..* |
/var/mail (/var/spool/mail) | Eingehende Mail-Spool pro User | <username> Mailbox-Dateien |
/var/www | Web-Inhalte (Apache/Nginx-Default — distributionsabhängig) | HTML, PHP, Web-Apps |
/var/backups | Tägliche Backups wichtiger Konfiguration (Debian/Ubuntu) | dpkg.status.<n>.gz, passwd.bak |
/var/opt | Variable Daten zu Software in /opt | Selten genutzt |
In der Praxis sind drei Unterordner für den Speicherplatz am kritischsten: /var/log, /var/cache und /var/lib. Beim Erstkontakt mit einem fremden System lohnt der Blick zuerst dort.
sudo du -sh /var/* 2>/dev/null | sort -hr | head -10
# 14G /var/lib
# 4.2G /var/log
# 2.1G /var/cache
# 380M /var/spool
# ...
# Tiefer in /var/lib reinschauen
sudo du -sh /var/lib/* 2>/dev/null | sort -hr | head -10
# 12G /var/lib/docker
# 1.8G /var/lib/postgresql
# 200M /var/lib/dpkg
# .../var/log und Log-Rotation
/var/log ist das Sammelbecken aller Service- und System-Logs. Auf modernen systemd-Distributionen kommt das Journal (binäres Log-Format unter /var/log/journal/) als Zentralspeicher hinzu, parallel zu den klassischen Text-Logs.
Wichtige Dateien (Distributions-abhängig):
| Datei | Inhalt |
|---|---|
/var/log/syslog (Debian/Ubuntu) bzw. /var/log/messages (RHEL/Fedora) | Allgemeine System-Meldungen |
/var/log/auth.log (Debian) bzw. /var/log/secure (RHEL) | Authentifizierungs-Logs (sudo, ssh, login) |
/var/log/kern.log | Kernel-Meldungen (dmesg als Live-View) |
/var/log/dpkg.log, /var/log/apt/history.log | Paket-Aktionen |
/var/log/nginx/, /var/log/apache2/ | Webserver pro Vhost |
/var/log/journal/ | systemd-Journal (binär, mit journalctl lesen) |
Logs wachsen unkontrolliert, deshalb ist Log-Rotation Pflicht. Auf den meisten Distributionen erledigt das logrotate (täglich via Cron), für das systemd-Journal existieren eigene Limits.
# logrotate-Konfiguration anschauen
cat /etc/logrotate.conf
ls /etc/logrotate.d/ # pro Service eine Drop-In-Konfiguration
# Trockenlauf, ohne tatsächlich zu rotieren
sudo logrotate -d /etc/logrotate.conf 2>&1 | head -40
# journald-Konfiguration
cat /etc/systemd/journald.conf
# SystemMaxUse=4G, SystemKeepFree=15%, MaxRetentionSec=2week, ...
# aktuelle Journal-Größe
journalctl --disk-usage
# Archived and active journals take up 1.4G in the file system.
# Journal manuell aufräumen (nach Größe oder Zeit)
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=7dPraxis-Tipp: bei akut vollem /var/log zuerst journalctl --disk-usage prüfen und ggf. mit --vacuum-time reduzieren — das geht meist schnell und ist rückwärtskompatibel.
/var/lib — der persistente Anwendungs-Zustand
Hier wird's spannend für Server-Workloads: /var/lib enthält den State aller Anwendungen, die persistente Daten halten. Eine PostgreSQL-Datenbank lebt unter /var/lib/postgresql/<version>/main/, MySQL/MariaDB unter /var/lib/mysql/, Docker mit allen Images, Containern und Volumes unter /var/lib/docker/.
Was du in /var/lib typischerweise findest:
| Pfad | Anwendung | Typische Größe |
|---|---|---|
/var/lib/docker | Container-Engine | 5–500 GB je nach Workload |
/var/lib/containers | Podman / Buildah | analog Docker |
/var/lib/postgresql | PostgreSQL-Cluster | abhängig von DB-Größe |
/var/lib/mysql | MySQL/MariaDB | abhängig von DB-Größe |
/var/lib/redis | Redis-Snapshots / AOF | wenige MB bis GB |
/var/lib/dpkg (Debian/Ubuntu) | Paketmanager-Datenbank | 100–500 MB |
/var/lib/rpm (Fedora/RHEL) | RPM-Datenbank | 50–300 MB |
/var/lib/apt/lists | Heruntergeladene Repo-Indizes | 100–500 MB |
/var/lib/systemd | systemd-State, Random-Seed | wenige MB |
/var/lib/snapd | Snap-Pakete und ihre Daten | je Snap einige hundert MB |
Wichtig: /var/lib ist nicht zum manuellen Aufräumen geeignet. Wer dort Dateien löscht, beschädigt typischerweise eine laufende Datenbank oder einen Container-State. Das jeweilige Tool (docker system prune, apt clean, snap remove) ist immer der richtige Weg.
# Docker: ungenutzte Images, Container, Volumes, Netzwerke
sudo docker system df # was wird wofür belegt?
sudo docker system prune -a # alles ungenutzte weg
sudo docker volume prune # ungenutzte Volumes (vorsichtig!)
# APT: Cache leeren
sudo apt clean # alle .deb-Files in /var/cache/apt
sudo apt autoremove # nicht mehr benötigte Abhängigkeiten
# Logs des Journals
sudo journalctl --vacuum-size=200MBackup-Strategie für /var
/var ist neben /etc und /home der wichtigste Backup-Pfad — hier liegen die Datenbanken, Mail-Spool und Server-Daten. Aber: nicht alles unter /var ist sinnvoll zu sichern.
| Pfad | Backup? | Begründung |
|---|---|---|
/var/log | Ggf. komprimiert archivieren | Forensik bei Vorfällen, aber wachsend |
/var/lib/postgresql, /var/lib/mysql | Niemals direkt sichern | Live-DB ist inkonsistent — pg_dump, mysqldump oder LVM/Btrfs-Snapshot nutzen |
/var/lib/docker | Selten sinnvoll | Images via Registry, Volumes separat |
/var/cache | Nein | Per Definition wiederherstellbar |
/var/spool | Ja (Mail!) | Eingehende Mails könnten verloren gehen |
/var/www | Ja | Web-Inhalte, sofern nicht aus Git deploybar |
/var/backups | Nein | Sind selbst Backups |
Faustregel: für jede Anwendung in /var/lib gibt es einen anwendungs-spezifischen Backup-Mechanismus, der konsistente Snapshots liefert. Den verwenden — nicht das Verzeichnis selbst kopieren.
Praxis: Speicherprobleme in /var lösen
# Welche Top-Level-Unterordner verbrauchen am meisten?
sudo du -sh /var/* 2>/dev/null | sort -hr
# Welche einzelnen Dateien sind besonders groß?
sudo find /var -type f -size +500M 2>/dev/null -exec ls -lh {} \;
# Logs der letzten 7 Tage in MB
sudo find /var/log -type f -mtime -7 -name "*.log" \
-exec du -h {} + | sort -hr | head -20
# Was wuchs in den letzten 24 Stunden?
sudo find /var -type f -mtime -1 \
-exec du -h {} + 2>/dev/null | sort -hr | head -20# 1. Kurzfristig: alte Logs aus dem Journal entfernen
sudo journalctl --vacuum-time=2d
# 2. APT-Cache leeren (ohne dauerhaften Schaden)
sudo apt clean
# 3. Bei Docker: Aufräumen
sudo docker system prune -af --volumes
# 4. Mit ncdu interaktiv durch /var navigieren
sudo ncdu /var
# 5. Logrotate manuell anstoßen
sudo logrotate -f /etc/logrotate.confInteressantes
/var sollte auf produktiven Servern eine eigene Partition sein
Vor allem auf Mail-Servern, Datenbank-Hosts und Container-Hosts: wenn /var volläuft, läuft / mit voll und das System wird unbedienbar. Eine eigene Partition oder ein eigenes LVM-Volume für /var (oder zumindest /var/log und /var/lib/docker) verhindert das. Bei der Installation auf produktiven Systemen lohnt sich diese Trennung.
Journald hat eingebaute Limits — aber nur, wenn man sie konfiguriert
Auf den meisten Distributionen ist SystemMaxUse= im journald nicht gesetzt, also fast unlimitiert. Die Empfehlung: SystemMaxUse=2G (oder kleiner) in /etc/systemd/journald.conf und journalctl --vacuum-size einmalig anstoßen. Spart auf Dauer mehrere Gigabyte.
/var/tmp überlebt den Reboot — /tmp nicht
Klassische Fehlerquelle: /tmp wird auf systemd-Distributionen oft als tmpfs (RAM-Disk) gemountet und beim Reboot geleert. Wer dort eine wichtige Datei zwischenparkt, verliert sie beim Neustart. /var/tmp ist die richtige Wahl für temporäre Daten, die einen Reboot überstehen sollen — bleibt nach dem Reboot erhalten.
docker system prune ist mächtiger als gedacht
docker system prune -a --volumes löscht alle ungenutzten Container, Images, Netzwerke und Volumes — das kann auf Build-Servern schnell mehrere zehn Gigabyte freigeben. Aber Vorsicht: auch Images, die du noch brauchen könntest, werden weggeworfen. Vorher genau prüfen mit docker system df und docker images.
Datenbank-Daten direkt kopieren ist (fast) immer falsch
cp -r /var/lib/postgresql /backup/ auf einer laufenden DB führt zu inkonsistenten Backups. Postgres bietet pg_dump (logisch) oder pg_basebackup (physisch, mit WAL); MySQL bietet mysqldump oder Percona XtraBackup. Wer per Filesystem-Snapshot sichert, sollte vorher FLUSH TABLES WITH READ LOCK (MySQL) bzw. pg_start_backup (Postgres) nutzen.
Mail-Spool kann viele Stunden Mails enthalten
Auf Mail-Servern landen eingehende Nachrichten zuerst in /var/spool/mail/<user> oder /var/spool/postfix/. Wer einen Mail-Server umzieht, muss diese Spool-Verzeichnisse mitnehmen — sonst gehen schon empfangene, aber noch nicht abgerufene Mails verloren.
Weiterführende Ressourcen
Externe Quellen
- Filesystem Hierarchy Standard 3.0 — /var
- systemd-journald.service Manpage
- logrotate Manpage
- Docker Storage Documentation
- Linux man-pages: hier(7) — Verzeichnisstruktur