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 |
  +---------------------+-----------------------------------------------------+