Disk Quotas begrenzen den Speicherplatz, den einzelne Benutzer oder Gruppen auf einem Dateisystem verwenden können. Dies verhindert, dass einzelne Benutzer den gesamten Speicher belegen.

Quota-Konzepte

Arten von Limits

| Limit | Beschreibung | |-------|--------------| | Soft Limit | Warnung, temporär überschreitbar | | Hard Limit | Absolutes Maximum | | Grace Period | Zeit für Soft-Limit-Überschreitung |

Block vs. Inode Quotas

Block Quota:  Begrenzt Speicherplatz (KB, MB, GB)
Inode Quota:  Begrenzt Anzahl der Dateien

Installation

Pakete installieren

# Debian/Ubuntu
apt install quota quotatool

# CentOS/RHEL
dnf install quota

Kernel-Unterstützung prüfen

grep -i quota /boot/config-$(uname -r)
# CONFIG_QUOTA=y
# CONFIG_QUOTACTL=y

Quota aktivieren

fstab anpassen

# /etc/fstab

# Für ext4 (User und Group Quota)
/dev/sda1  /home  ext4  defaults,usrquota,grpquota  0  2

# Für XFS
/dev/sda1  /home  xfs   defaults,uquota,gquota      0  2

# Nur User Quota
/dev/sda1  /home  ext4  defaults,usrquota           0  2

Dateisystem remounten

# Remount
mount -o remount /home

# Oder Neustart
reboot

# Prüfen
mount | grep quota

Quota-Dateien erstellen (ext4)

# Quota-Dateien erstellen
quotacheck -cug /home

# Bestehende prüfen und aktualisieren
quotacheck -avug

# Optionen:
# -c  Erstellen
# -u  User Quota
# -g  Group Quota
# -a  Alle Dateisysteme
# -v  Verbose

Quota aktivieren

# Quota einschalten
quotaon /home

# Alle aktivieren
quotaon -a

# Status prüfen
quotaon -p /home

Benutzer-Quota setzen

Mit edquota

# Quota für Benutzer bearbeiten
edquota -u username

# Editor öffnet sich:
Disk quotas for user username (uid 1000):
  Filesystem    blocks    soft    hard  inodes  soft  hard
  /dev/sda1          0  500000 1000000       0  10000 15000

Werte erklärt

blocks:  Aktuell verwendet (in KB)
soft:    Soft Limit (in KB) - 500MB
hard:    Hard Limit (in KB) - 1GB
inodes:  Aktuelle Dateianzahl
soft:    Soft Limit Dateien
hard:    Hard Limit Dateien

Mit setquota

# Quota setzen (Block soft/hard, Inode soft/hard)
setquota -u username 500000 1000000 10000 15000 /home

# Nur Block-Quota
setquota -u username 500000 1000000 0 0 /home

# In MB/GB (quotatool)
quotatool -u username -bq 500M -l 1G /home

Quota kopieren

# Von einem Benutzer auf andere kopieren
edquota -p template_user user1 user2 user3

# Auf alle Benutzer anwenden
edquota -p template_user $(awk -F: '$3 >= 1000 {print $1}' /etc/passwd)

Gruppen-Quota

Quota für Gruppe setzen

# Mit edquota
edquota -g groupname

# Mit setquota
setquota -g groupname 5000000 10000000 50000 100000 /home

Gruppen-Quota prüfen

# Quota einer Gruppe
quota -g groupname

# Alle Gruppen
repquota -g /home

Grace Period

Anzeigen

edquota -t

# Editor zeigt:
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem    Block grace period     Inode grace period
  /dev/sda1           7days                 7days

Setzen

# Mit setquota
setquota -t 604800 604800 /home  # 7 Tage in Sekunden

# Oder mit edquota -t interaktiv

Quota überwachen

Benutzer-Quota anzeigen

# Eigene Quota
quota

# Bestimmter Benutzer
quota -u username

# Verbose
quota -v -u username

Alle Quotas anzeigen

# Alle User auf /home
repquota /home

# Alle Dateisysteme
repquota -a

# Nur User über Limit
repquota -a | grep -E "^\+"

# Schön formatiert
repquota -s /home

Beispiel-Ausgabe

*** Report for user quotas on device /dev/sda1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   50000       0       0          1000     0     0
user1     --  250000  500000 1000000          5000 10000 15000
user2     +-  550000  500000 1000000  6days   8000 10000 15000

XFS-spezifische Quotas

XFS Project Quotas

# /etc/fstab
/dev/sda1  /data  xfs  defaults,uquota,gquota,pquota  0  2

Project-Quota einrichten

# Projekt-Verzeichnis definieren
echo "1:/data/projekt1" >> /etc/projects
echo "projekt1:1" >> /etc/projid

# Projekt initialisieren
xfs_quota -x -c 'project -s projekt1' /data

# Limit setzen
xfs_quota -x -c 'limit -p bsoft=1g bhard=2g projekt1' /data

XFS-Quota verwalten

# Status
xfs_quota -x -c 'report -h' /data

# User-Quota
xfs_quota -x -c 'limit -u bsoft=500m bhard=1g username' /data

# Freier Speicher
xfs_quota -x -c 'free' /data

Quota-Warnungen

Mail bei Überschreitung

# /etc/warnquota.conf

MAIL_CMD = "/usr/sbin/sendmail -t"
FROM = "quota@server.de"
SUBJECT = Disk Quota Warnung
CC_TO = "admin@server.de"
MESSAGE = Sie haben Ihr Speicherlimit überschritten.|Bitte löschen Sie Dateien.
SIGNATURE = --| Ihr Admin-Team

Warnquota ausführen

# Manuell
warnquota

# Als Cronjob
echo "0 6 * * * root /usr/sbin/warnquota" >> /etc/crontab

Systemd Timer

# /etc/systemd/system/warnquota.timer

[Unit]
Description=Quota warning timer

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
# /etc/systemd/system/warnquota.service

[Unit]
Description=Check disk quotas and warn users

[Service]
Type=oneshot
ExecStart=/usr/sbin/warnquota

Quota-Skripte

Quota-Übersicht

#!/bin/bash
# quota-report.sh

echo "=== Quota-Report $(date) ==="
echo

for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
    usage=$(quota -u "$user" 2>/dev/null | tail -1 | awk '{print $2}')
    limit=$(quota -u "$user" 2>/dev/null | tail -1 | awk '{print $4}')

    if [ -n "$usage" ] && [ -n "$limit" ] && [ "$limit" != "0" ]; then
        percent=$((usage * 100 / limit))
        printf "%-20s %8s KB / %8s KB (%3d%%)\n" "$user" "$usage" "$limit" "$percent"
    fi
done

Benutzer über Limit

#!/bin/bash
# over-quota.sh

repquota -a 2>/dev/null | while read line; do
    if echo "$line" | grep -q "^[a-z].*+-"; then
        user=$(echo "$line" | awk '{print $1}')
        echo "WARNUNG: $user ist über dem Soft-Limit!"
    fi
    if echo "$line" | grep -q "^[a-z].*++"; then
        user=$(echo "$line" | awk '{print $1}')
        echo "KRITISCH: $user ist über dem Hard-Limit!"
    fi
done

Quota automatisch setzen

#!/bin/bash
# set-default-quota.sh

DEFAULT_SOFT=500000   # 500 MB
DEFAULT_HARD=1000000  # 1 GB
INODE_SOFT=10000
INODE_HARD=15000

for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
    current=$(quota -u "$user" 2>/dev/null | tail -1 | awk '{print $3}')
    if [ "$current" == "0" ]; then
        echo "Setze Quota für $user"
        setquota -u "$user" $DEFAULT_SOFT $DEFAULT_HARD $INODE_SOFT $INODE_HARD /home
    fi
done

Best Practices

Empfohlene Limits

# Standard-Benutzer
setquota -u user 500000 1000000 10000 15000 /home
# 500 MB Soft, 1 GB Hard, 10k/15k Dateien

# Power-User
setquota -u poweruser 2000000 5000000 50000 75000 /home
# 2 GB Soft, 5 GB Hard

# Entwickler
setquota -u developer 5000000 10000000 100000 150000 /home
# 5 GB Soft, 10 GB Hard

Grace Period

# 7 Tage sind Standard und sinnvoll
setquota -t 604800 604800 /home

# Kürzere Grace Period für striktere Kontrolle
setquota -t 86400 86400 /home  # 1 Tag

Troubleshooting

Quota funktioniert nicht

# Kernel-Support prüfen
grep QUOTA /boot/config-$(uname -r)

# Mount-Optionen prüfen
mount | grep quota

# Quota-Dateien neu erstellen
quotaoff /home
rm -f /home/aquota.user /home/aquota.group
quotacheck -cug /home
quotaon /home

"Disk quota exceeded"

# Benutzer-Nutzung prüfen
quota -u username

# Große Dateien finden
find /home/username -type f -size +10M -exec ls -lh {} \;

# Temporäres Limit erhöhen
setquota -u username 1000000 2000000 0 0 /home

Quota nicht aktuell

# Quota-Statistik aktualisieren
quotacheck -avug

# Bei XFS
xfs_quota -x -c 'off' /data
xfs_quota -x -c 'on' /data

Zusammenfassung

| Befehl | Funktion | |--------|----------| | quotaon | Quota aktivieren | | quotaoff | Quota deaktivieren | | edquota -u | User-Quota bearbeiten | | setquota | Quota per Kommando setzen | | quota -u | User-Quota anzeigen | | repquota | Quota-Report | | quotacheck | Quota-Dateien aktualisieren | | warnquota | Warnmails versenden |

| Limit-Typ | Beschreibung | |-----------|--------------| | Soft Limit | Warnung, Grace Period | | Hard Limit | Absolutes Maximum | | Block Quota | Speicherplatz | | Inode Quota | Dateianzahl |

| Dateisystem | Mount-Option | |-------------|--------------| | ext4 | usrquota, grpquota | | XFS | uquota, gquota, pquota |

Fazit

Disk Quotas sind essentiell für Shared-Hosting und Multi-User-Systeme. Die Kombination aus Soft- und Hard-Limits mit Grace Period bietet Flexibilität bei gleichzeitiger Kontrolle. Regelmäßige Reports und Warnmails helfen Benutzern, ihren Speicherverbrauch im Blick zu behalten. XFS bietet mit Project Quotas zusätzliche Möglichkeiten für Verzeichnis-basierte Limits.