HOWTO zu Quota (Plattenplatz-Beschränkung)

(C) 2008-2013 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
              OSTC Open Source Training and Consulting GmbH
              www.ostc.de

$Id: unix-quota-HOWTO.txt,v 1.18 2019/11/26 19:37:07 tsbirn Exp $

Dieses Dokument beschreibt Grundlagen und Einsatz von Quota-Mechanismen
(Plattenplatzbeschränkungen) für Benutzer eines UNIX/Linux-Systems.

Inhaltsverzeichnis

1) Einführung
2) Einrichten
3) Hinweise
4) Kommando

1) Einführung   (Toc)

Mit Quota wird für einzelne Benutzer und/oder einzelne Gruppen pro Dateisystem
(Partition) festgelegt, wieviel Plattenplatz (Blöcke) sie belegen und wieviele
Dateien (Inodes) sie anlegen dürfen. Es gibt 2 Limits pro Benutzer/Gruppe und
pro Dateisystem (Partition):

  * SOFT LIMIT: Darf für einen bestimmten Zeitraum überschritten werden
                ("GRACE PERIOD"), danach wird es zum "HARD LIMIT".
  * HARD LIMIT: Kann prinzipiell nicht überschritten werden.

Ist das "HARD LIMIT" erreicht, können keine Dateien mehr angelegt bzw.
vergrößert, sondern nur noch gelöscht werden (ACHTUNG: Oft ist dann nicht
einmal mehr eine Anmeldung an der grafischen Oberfläche möglich, da hierbei
Dateien angelegt oder Plattenplatz verbraucht werden).

Das "SOFT LIMIT" darf für eine gewisse einstellbare Zeit ("GRACE PERIOD")
überschritten werden, nach Ablauf dieser Zeit wird es zum "HARD LIMIT". D.h. es
müssen dann Dateien verkleinert/gelöscht werden, bis das "SOFT LIMIT" wieder
unterschritten wird, damit wieder ordentlich gearbeitet werden kann und die
GRACE PERIOD (GP) wieder von neuem startet.

  ======================================================== HARD LIMIT
                  _____                           _     /
                 /     \_____         __         / \   /
                /            \       /  \       /   \_/
  -------------/---------=====\-----/----\-----/---------- SOFT LIMIT
              /^         ^     \   /^    ^\   /
       _     / |.........|      \_/ |....| \_/
      / \   /  |         |          |    |
     /   \_/   GP        |         GP    GP noch
    /          startet   |    startet    nicht abgelaufen
   /                    GP     erneut
  /             abgelaufen
  ======================================================== 0

Der Support von Quota ist im LINUX-Kern integriert:

  * Für ext2/ext3/XFS-Dateisystem möglich (ReiserFS mit Patch, JFS nicht!)
  * Pro Dateisystem (Partition) getrennt ein-/ausschaltbar
  * Pro Benutzer und Gruppe getrennt ein-/ausschaltbar und konfigurierbar
  * Pro Dateisystem (Partition) die "GRACE PERIOD" getrennt festlegbar
  * Für Plattenplatz (Datenblöcke) und Dateianzahl (Inodes) getrennt festlegbar

Die Quota-Datenbank gibt es in 2 Versionen ("convertquota" wandelt 1 -> 2 um).
Das neue Format "aquota" (advanced) hat folgende Erweiterungen:

  * Quota für root möglich
  * Quota für 32-Bit UID/GID möglich
  * Quota-Größe in Byte statt KByte möglich (für ReiserFS)
  * Unabhängig von der Hardware-Architektur
  * Quotadatei im Radixbaum-Format (einfache Baumstruktur)

2) Einrichten   (Toc)

Zum Einrichten von Quota die folgenden Schritte als "root" in genau dieser
Reihenfolge durchführen:

  1. Die Quota-Grundfunktionen müssen im LINUX-Kern eingebaut sein, d.h.
       zcat /proc/config.gz | grep -i "quota"     # oder
       cat /boot/config*    | grep -i "quota"
     muß folgende Ausgabe produzieren:
       CONFIG_XFS_QUOTA=y      # Bei XFS
       CONFIG_QUOTA=y          # Bei ext2/ext3
       CONFIG_QUOTACTL=y       #
     Ansonsten den LINUX-Kern mit aktiviertem Eintrag
       [*] Quota support
     neu übersetzen, installieren und mit ihm neu booten.

  2. Quota-Kontroll-Programme + alle man-pages installieren:
       Paket "quota" suchen und installieren
     Evtl. prüfen ob vorhanden:
       rpm -qa | grep -i "quota"    # -> sollte Ergebnis liefern
       dpkg -l | grep -i "quota"    # -> sollte Ergebnis liefern

  3. In "/etc/fstab" die mit Quota zu überwachenden Dateisysteme festlegen:
     Dazu im 4. Feld (die Trennung der Felder erfolgt durch Leerzeichen!) der
     zu überwachenden Dateisysteme (nicht alle müssen überwacht werden) die
     Attribute "usrquota" und/oder "grpquota" (Schreibweise beachten!) zu
     den bereits vorhandenen Attributen (meist "defaults") hinzufügen (keine
     Leerzeichen, Trennung durch Komma!), z.B.:

       /dev/sda1    /        ext2    defaults,usrquota,grpquota    1    1
       /dev/sda2    /home    ext2    defaults,usrquota,grpquota    1    1

  4. Die neuen Mount-Optionen "usrquota" und "grpquota" dem Kern bekannt machen:

       mount -o remount -a       # o=option, a=all

  5. Die Quota-Verwaltungsdateien mit richtigen Rechten pro Partition anlegen
     und Verwaltungsinformationen pro Benutzer/Gruppe (und Partition) sammeln:

       quotacheck -acfugv    # a=all filesystems in /etc/fstab, c=create,
                             # f=force, u=user, g=group, v=verbose
                             # -> (a)quota.user + (a)quota.group

     Dieser Vorgang dauert je nach Plattengröße relativ lange. Im jeweiligen
     "Mount-Point" der Dateisysteme (z.B. "/"=/dev/sda1 und "/home"=/dev/sda2)
     sind anschließend die Binärdateien "(a)quota.user" und "(a)quota.group"
     vorhanden und mit den Quota-Verwaltungsinformationen gefüllt. Je nach
     Quota-Version heißen die Dateien:

       1) Alt: quota.user, quota.group   (ext2/3, ReiserFS; NICHT XFS)
       2) Neu: aquota.user, aquota.group (ext2/3, ReiserFS; NICHT XFS)

  6. Den Quota-Dämon "quotad" in den Runleveln 3 + 5 hinzufügen, so dass er
     bei jedem Neustart des Systems aktiviert wird. Alternativ

       chkconfig -a quotad                                 # A) a=add     oder
       insserv quotad                                      # B)           oder
       ln -s ../quotad /etc/init.d/rc5.d/S99quotad         # C) manuell   oder
       ln -s ../quotad /etc/init.d/rc5.d/K00quotad
       ln -s ../quotad /etc/init.d/rc3.d/S99quotad
       ln -s ../quotad /etc/init.d/rc3.d/K00quotad
       YaST                                                # D) GUI

     Den Quota-Dämon starten/stoppen/Status ermitteln/neu starten:

       /etc/init.d/quotad start                            # Allgemein
       /etc/init.d/quotad stop
       /etc/init.d/quotad status
       /etc/init.d/quotad restart
       rcquotad start                                      # SuSE
       rcquotad stop
       rcquotad status
       rcquotad restart

     Auf der Kommandozeile Quota einschalten (bzw. ausschalten) mit:

       quotaon -a      # a=all
       quotaoff -a     # a=all

  7. Für einen Benutzer oder eine Gruppe (z.B. USER/GROUP) die beiden Limits
     setzen ("edit quota"):

       edquota -u USER     # u=user
       edquota -g GROUP    # g=group

     Startet (leider) den Vi/Vim mit einer (temporären) Datei folgenden Inhalts:

       Disk quotas for user tsbirn (uid 1000):
         Filesystem   blocks    soft   hard   inodes   soft   hard
         /dev/sda1    6431556      0      0       36      0      0
         /dev/sda2     123456      0      0   134536      0      0

     Die Zahlen "0" bedeuten, derzeit sind keine Beschränkung aktiv. Diese mit
     den gewünschten Limits (Anzahl 1024-Byte Datenblöcke bzw. Anzahl I-Nodes)
     überschreiben und ":wq" zum Speichern + Verlassen des Vi/Vim drücken. Die
     Limits müssen mindestens so groß sein wie der derzeit erreichte Wert
     (Spalte "blocks" und "inodes"):

	 Falls ein anderer Editor gewünscht wird (z.B. "gedit", "kwrite"), dann vor
     Aufruf von "edquota" die Variable EDITOR/VISUAL belegen und exportieren:

       EDITOR=/opt/kde3/bin/kwrite edquota ...   # auf 1 Zeile
       export EDITOR=/opt/kde3/bin/kwrite        # auf 2 Zeilen
       edquota ...                               #  "  "   "

  8. Die "GRACE PERIOD" festlegen (pro Partition EINE Einstellung für ALLE
     Benutzer und Gruppen):

       edquota -t     # t=time

     Startet den Vi/Vim mit einer (temporären) Datei folgenden Inhalts:

       Grace period before enforcing soft limits for users:
       Time units may be: months, weeks, days, hours, minutes, seconds
         Filesystem             Block grace period     Inode grace period
         /dev/sda1                     7days                  7days
         /dev/sda2                     7days                  7days

	 "7days" bedeutet, nach 7 Tagen ständiger Überschreitung des "SOFT LIMIT"
     wird es zum "HARD LIMIT". "0" bedeutet keine zeitliche Beschränkung aktiv.
     "7days" gegen die Gewünschte (z.B. "2hours", "30minutes", "120seconds")
     austauschen und ":wq" zum Speichern + Verlassen des Vi/Vim drücken.

  9. Quota-Limits von Benutzer "USER"/Gruppe "GROUP" für andere
     Benutzer/Gruppen kopieren:

       edquota -u -p USER USER_LIST      # p=propagate/prototype = weitergeben
       edquota -g -p GROUP GROUP_LIST    # p=propagate/prototype = weitergeben

     Wobei "USER_LIST" eine Liste der gewünschten Benutzer ist, die bei vielen
     Benutzern nicht per Hand (Tippfehler, Benutzer vergessen), sondern
     möglichst automatisch erzeugt werden sollte. Analog ist "GROUP_LIST" eine
     Liste von Gruppennamen.

     Dazu gibt es eine Reihe von Möglichkeiten, die fast alle auf "Kommando-
     Substitution" (Backquotes `...` oder $(...)!) basieren und anstelle von
     "USER_LISTE/GROUP_LISTE" anzugeben sind (die mit "-" gekennzeichneten sind
     nur sinnvoll, wenn ALLE Benutzer einen Namen der Form "user..." haben bzw.
     ALLE Benutzer Mitglied der Gruppe "users" sind):

       *  $(ls -d /home/* | sed 's/.*\///')
       -  $(cut -d: -f1 /etc/passwd | grep "^user" | sed "s/:.*//")
       -  $(grep "users:" /etc/group | cut -d: -f4 | sed 's/,/ /g')
       *  $(awk -F: '$3 > 100 && $3 < 10000 { print $1 }' /etc/passwd)

 10. Eine Alternative zum Setzen der Limits direkt über die Kommandozeile
     für einzelne Benutzer, Gruppen und Dateisysteme (kein Editor-Aufruf):

       setquota -u USER  BLOCKSOFT BLOCKHARD INODESOFT INODEHARD DEV/MOUNTPOINT
       setquota -g GROUP BLOCKSOFT BLOCKHARD INODESOFT INODEHARD DEV/MOUNTPOINT
       setquota -u -p PROTOUSER USER DEV/MOUNTPOINT
       setquota -g -p PROTOGROUP GROUP DEV/MOUNTPOINT
       setquota -t BLOCKGRACE INODEGRACE DEV/MOUNTPOINT

 11. Weitere Alternative zum Setzen der Limits direkt über die Kommandozeile
     für einzelne Benutzer, Gruppen und Dateisysteme (kein Editor-Aufruf).

       quotatool -u USER  -b BLOCKS -l NUM DEV/MOUNTPOINT   # HARD LIMIT
       quotatool -u USER  -b BLOCKS -q NUM DEV/MOUNTPOINT   # SOFT LIMIT
       quotatool -u USER  -i INODES ...
       quotatool -u USER  -t GRACEPERIOD DEV/MOUNTPOINT
       quotatool -g GROUP ...

 12. Quota prüfen und bei Überschreiten eine Warnung an diese Benutzer/Gruppen
     schicken (meist per "cron" durchgeführt):

       warnquota

     "warnquota" verwendet folgende Konfigurationsdateien:

       /etc/warnquota.conf   # Konfiguration (MAIL_CMD,  FROM, SUBJECT, CC_TO, SUPPORT, PHON>E, CHARSET)
       /etc/quotagrpadmins   # Verantwortlicher Benutzer pro (Quota)ruppe
       /etc/quotatab         # Abbildung Gerätenamen -> sinnvole Begriffe

 13. Quota-Statistik ausgeben:

       quotastats

 14. Eine Übersicht über die aktuellen Quota-Daten aller Dateisysteme und
     Benutzer bzw. Gruppen erstellen ("report quota")

       repquota -a           # a=all file systems
       repquota -a -u        # u=user (default)
       repquota -a -g        # g=groups

 15. Jeder Benutzer kann die eigenen Quota-Daten für alle Dateisysteme abrufen:

       quota           # Benutzer-Quota des eigenen Accounts (analog u=user)
       quota -u        # Benutzer-Quota des eigenen Accounts (u=user)
       quota -g        # Gruppen-Quota aller eigenen Gruppen (g=group)
       quota -u USER   # Benutzer-Quota (nur root erlaubt!)
       quota -g GROUP  # Gruppen-Quota (nur eigene Gruppen/nur root erlaubt!)

     Dies ergibt z.B.:

       Disk quotas for user tsbirn (uid 1000):
        Filesystem  blocks   quota   limit    grace  files  quota limit grace
         /dev/sda1 6431556  20000000 10000000           36   5000  9000
         /dev/sda2  123456      0           0 134536     0      0     0 134536

     Sind die Spalten "grace" leer, so ist das "SOFT LIMIT" derzeit nicht
     überschritten. Ansonsten steht ein "*" in der jeweiligen Spalte.

*  Folgende Meldungen werden auf der Kommandozeile beim Überschreiten eines
   "SOFT LIMIT" angezeigt:

       sda1: warning, user block quota exceeded.
       sda1: warning, user file quota exceeded.

   Beim Überschreiten eines "HARD LIMIT" werden folgende Meldungen angezeigt
   und der Vorgang abgebrochen:

       sda1: warning, user block quota exceeded.
       sda1: warning, user file quota exceeded.

3) Hinweise   (Toc)

* Es muss gelten: SOFT LIMIT <= HARD LIMIT.

* XFS speichert die Quota-Informationen nicht in sichtbaren Dateien, sondern
  in Form von Metaoptionen. Quota-Accounting MUSS beim Montieren eines
  Dateisystems eingeschalten werden. Limit-Enforcing kann danach jederzeit
  ein- und ausgeschaltet werden.

* Falls ein Benutzer sowohl selbst als auch für eine seiner Gruppen Quota
  eingestellt hat, haben die Quota auf Benutzerebene höhere Priorität.

* Für einen Benutzer sind Quota für mehrere seiner Gruppen möglich, die
  Gruppe mit den kleinsten Quotawerten zählt.

* Für "root" kann im alten Format kein Quota aktiviert werden, im neuen schon.

* Für jeden neu angelegten Benutzer müssen die Quota-Limits manuell eingestellt
  werden, das System macht das nicht automatisch. Am Besten daher ein Skript
  (z.B. "add_quota_user.sh") erstellen, mit dem in Zukunft ALLE neuen Benutzer
  angelegt werden (analog für Gruppen).

* Setzt die root z.B. folgenden Befehl in die Datei "/etc/profile", so werden
  jedem Benutzer beim Einloggen seine aktuellen Quota-Informationen angezeigt,
  wenn er eines der beiden Limits überschritten hat:

    quota | grep "\\*"    # "*"=Limit überschritten

* Eine regelmäßige Überprüfung der Quota-Informationen sollte entweder beim
  Booten oder als Cron-Job aktiviert werden:

    quotacheck -avug      # a=all, v=verbose, u=user, g=group

  Diese Information kann z.B. genutzt werden, um Anwendern, die ihr "Soft
  Limit" überschritten haben, täglich automatisch eine Mail mit einem
  entsprechenden Hinweis zu schicken.

* Weitere Dokumentation enthalten die man-Pages zu:
  + fstab(5), mount(2), mount(8)
  + quota(1), quotaon(8), quotaoff(8)
  + edquota(8), repquota(8), quotacheck(8)
  + setquota(8), quotastats(8), warnquota(8), quotatool(8)
  + quotactl(2)
  + convertquota(8)

* Fehlende Manpages:
  + Konfigurationsvariable von "warnquota.conf"
  + Bedeutung und Format von "quotagrpadmins"
  + Bedeutung und Format von "quotatab"

4) Kommandos   (Toc)

  +---------------------+-----------------------------------------------------+
  | Kommando            | Bedeutung                                           |
  +---------------------+-----------------------------------------------------+
  | mount -o usrquota   | Beim Mounten Benutzer-Quota-Überwachung aktivieren  |
  | mount -o grpquota   | Beim Mounten Grouppen-Quota-Überwachung aktivieren  |
  | convertquota        | Quota-Datenbank umwandeln: altes -> neues Format    |
  | quotacheck          | Quota-Datenbank aufbauen                            |
  | quotaoff            | Quota-Überwachung ausschalten                       |
  | quotaon             | Quota-Überwachung einschalten                       |
  +---------------------+-----------------------------------------------------+
  | edquota             | Quota-Limits für Benutzer/Gruppe per Editor setzen  |
  | quotatool           | Quota-Einstellungen per Kommandozeile verwalten     |
  | setquota            | Quota-Einstellungen per Kommandozeile verwalten     |
  +---------------------+-----------------------------------------------------+
  | quotastats          | Quota-Statistik ausgeben                            |
  | quota               | Quota-Übersicht ausgeben                            |
  | repquota            | Quota-Übersicht ausgeben                            |
  | warnquota           | Warnung (Mail) bei überschrittenem Quota generieren |
  +---------------------+-----------------------------------------------------+