/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:

  1. Variable Daten — wachsen, schrumpfen und ändern sich während des Betriebs.
  2. System-weit relevant — keine User-spezifischen Daten (die liegen in /home).
  3. Persistent über Reboots — anders als /tmp oder /run.

/var und /usr ergänzen sich konzeptionell:

Aspekt/usr/var
InhaltProgramme, Bibliotheken, DokuLogs, Caches, Datenbanken, Queues
VeränderungNur per Paketmanager (Updates)Ständig zur Laufzeit
Read-only mountbar?Ja, FHS-VorgabeNein, muss schreibbar sein
Backup-HäufigkeitSelten — wiederherstellbar via ReposSehr oft — enthält wichtige Zustandsdaten
GrößenordnungStabil nach InstallationWä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:

PfadZweckTypische Inhalte
/var/logLog-Dateien aller Services und des Kernelssyslog, auth.log, nginx/access.log
/var/libPersistenter Anwendungs-Zustand (Datenbanken, Paket-DB)mysql/, dpkg/, docker/, postgresql/
/var/cacheWiederherstellbare Caches — können ohne Datenverlust gelöscht werdenapt/, dnf/, man/
/var/spoolWarteschlangen (Mail, Print, Cron, At)mail/, cups/, cron/
/var/tmpTemporäre Dateien, die einen Reboot überstehen sollenWird nicht beim Boot geleert (anders als /tmp)
/var/runProzess-IDs, Sockets während der Laufzeit (heute meist Symlink auf /run)*.pid, *.sock
/var/lockLock-Dateien (heute meist Symlink auf /run/lock)LCK..*
/var/mail (/var/spool/mail)Eingehende Mail-Spool pro User<username> Mailbox-Dateien
/var/wwwWeb-Inhalte (Apache/Nginx-Default — distributionsabhängig)HTML, PHP, Web-Apps
/var/backupsTägliche Backups wichtiger Konfiguration (Debian/Ubuntu)dpkg.status.<n>.gz, passwd.bak
/var/optVariable Daten zu Software in /optSelten 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.

Bash Was frisst meinen /var-Speicher?
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):

DateiInhalt
/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.logKernel-Meldungen (dmesg als Live-View)
/var/log/dpkg.log, /var/log/apt/history.logPaket-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.

Bash Log-Rotation und Journal-Limits prüfen
# 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=7d

Praxis-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:

PfadAnwendungTypische Größe
/var/lib/dockerContainer-Engine5–500 GB je nach Workload
/var/lib/containersPodman / Buildahanalog Docker
/var/lib/postgresqlPostgreSQL-Clusterabhängig von DB-Größe
/var/lib/mysqlMySQL/MariaDBabhängig von DB-Größe
/var/lib/redisRedis-Snapshots / AOFwenige MB bis GB
/var/lib/dpkg (Debian/Ubuntu)Paketmanager-Datenbank100–500 MB
/var/lib/rpm (Fedora/RHEL)RPM-Datenbank50–300 MB
/var/lib/apt/listsHeruntergeladene Repo-Indizes100–500 MB
/var/lib/systemdsystemd-State, Random-Seedwenige MB
/var/lib/snapdSnap-Pakete und ihre Datenje 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.

Bash Docker und apt aufräumen
# 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=200M

Backup-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.

PfadBackup?Begründung
/var/logGgf. komprimiert archivierenForensik bei Vorfällen, aber wachsend
/var/lib/postgresql, /var/lib/mysqlNiemals direkt sichernLive-DB ist inkonsistent — pg_dump, mysqldump oder LVM/Btrfs-Snapshot nutzen
/var/lib/dockerSelten sinnvollImages via Registry, Volumes separat
/var/cacheNeinPer Definition wiederherstellbar
/var/spoolJa (Mail!)Eingehende Mails könnten verloren gehen
/var/wwwJaWeb-Inhalte, sofern nicht aus Git deploybar
/var/backupsNeinSind 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

Bash Disk-Usage-Schnelldiagnose von /var
# 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
Bash Wenn /var voll ist — Schnell-Hilfe
# 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.conf

Interessantes

/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

/ Weiter

Zurück zu Verzeichnisstruktur

Zur Übersicht