Gestione delle quote disco

Loris Tissino

29 marzo 2010

Impostare e gestire le quote disco

Spesso capita, in un sistema multiutente, di dover limitare lo spazio su disco disponibile per ogni singolo utente o gruppo.

Le quote disco (per utente e/o per gruppo) possono essere abilitate sui singoli filesystem innestati (non sulle directory).

Per attivare in maniera permanente le quote disco è necessario agire sul file /etc/fstab.

Ad esempio, potrebbe essere presente una voce come

/dev/hdc0 /home/users  ext3  defaults,usrquota,grpquota 0  0

Più avanti vedremo un esempio su un disco fittizio che possiamo usare per delle prove.

Concetti importanti relativi alle quote disco

È bene distinguere:

Il comando Quota

Con il comando quota si può verificare qual è la situazione del singolo utente o gruppo.

$ quota
Disk quotas for user loris (uid 1000): 
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/loop1    3516*   3000    4000   6days       2       0       0        

$ sudo quota -u jackie
Disk quotas for user jackie (uid 2000): 
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/loop1    1005*   1000    1500   7days       1       0       0        

(N.B.) Il comando indicato, così come quelli presentati successivamente, funziona a patto di avere una partizione o un disco innestato (mounted) con le quote attivate e definite. Nell'esercitazione che segue vengono date indicazioni in merito.

I comandi Quotaon e Quotaoff

Con i comandi quotaon e quotaoff si può abilitare e disabilitare, rispettivamente, la gestione delle quote sui filesystem precedentemente configurati.

$ sudo quotaon -v --all
/dev/loop1 [/home/discoq]: group quotas turned on
/dev/loop1 [/home/discoq]: user quotas turned on

$ sudo quotaoff -v --all
/dev/loop1 [/home/discoq]: group quotas turned off
/dev/loop1 [/home/discoq]: user quotas turned off

quotaon di solito è attivato automaticamente al boot grazie alla configurazione degli script di avvio in /etc/init.d, che si possono anche chiamare direttamente:

$ sudo /etc/init.d/quota start
 * Checking quotas...                                         [ OK ] 
 * Turning on quotas...                                       [ OK ] 
$ sudo /etc/init.d/quota stop
 * Turning off quotas...                                      [ OK ] 

Il comando Quotacheck

Con il comando quotacheck si controlla la coerenza del database delle quote: eventuali problemi vengono segnalati e, se possibile, risolti.

È raccomandabile eseguire quotacheck con le quote disattivate:

$ sudo quotaoff -av
/dev/loop1 [/home/discoq]: group quotas turned off
/dev/loop1 [/home/discoq]: user quotas turned off

$ sudo quotacheck -aguv
quotacheck: Scanning /dev/loop1 [/home/discoq] done
quotacheck: Checked 3 directories and 4 files

$ sudo quotaon -av
/dev/loop1 [/home/discoq]: group quotas turned on
/dev/loop1 [/home/discoq]: user quotas turned on

Il comando Edquota

Con il comando edquota si impostano le quote degli utenti e dei gruppi.

Si tratta di un comando interattivo, che avvia l'editor di riferimento:

Disk quotas for user loris (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/loop1                     3516       3000       4000          2        0        0
~
~ 
~
"/tmp//Edp.aCpxrAo" 3L, 217C

Per ogni utente/filesystem, si possono impostare i limiti soft e hard (sia per i blocchi, sia per gli inode), avendo come riferimento le quantità attualmente impegnate.

Il comando Setquota

Il comando setquota permette di impostare gli stessi limiti di edquota, ma senza interattività:

$ sudo setquota -u loris 3000 4000 0 0 /home/discoq

Sforamento quota

Se si eccede il proprio limite, le operazioni di scrittura vengono bloccate:

$ dd if=/dev/zero of=grandefile count=5000
loop1: write failed, user block limit reached.
dd: writing to `grandefile': Disk quota exceeded
963+0 records in
962+0 records out
492544 bytes (493 kB) copied, 0.0593655 seconds, 8.3 MB/s

Se non si supera la quota disponibile di inode, si possono ancora creare file (vuoti).

Attenzione: non sempre il fallimento della scrittura che fallisce per motivi di quota superata viene chiaramente indicato.

Impostazione del Grace period

La durata del Grace period può essere impostata interattivamente con edquota -t o da riga di comando con setquota -t.

Rapporto con Repquota

Con il comando repquota si può avere un rapporto sullo stato di uso del disco:

$ sudo repquota -a
*** Report for user quotas on device /dev/loop1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --    1501       0       0              5     0     0       
loris     +-    4000    3000    4000  6days       6     0     0       
jackie    +-    1005    1000    1500  6days       1     0     0          

Quote disco - esercitazione (1)

Per potersi esercitare senza creare appositamente una partizione vera, è possibile creare un file su disco che verrà considerato a tutti gli effetti come una partizione:

$ sudo dd count=20000 if=/dev/zero of=/home/discovirtuale
20000+0 records in
20000+0 records out
10240000 bytes (10 MB) copied, 0.857081 seconds, 11.9 MB/s

$ sudo mkfs.ext3 -F /home/discovirtuale
mke2fs 1.40-WIP (14-Nov-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2512 inodes, 10000 blocks
...
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Quote disco - esercitazione (2)

Per abilitare la gestione delle quote disco, il file /etc/fstab deve contenere una riga dove questo supporto è dichiarato. Ad esempio, si potrebbe aggiungere una riga come la seguente:

/home/discovirtuale /home/discoq  ext3  defaults,usrquota,grpquota 0  0

Il disco creato e formattato può essere innestato in una directory vuota con il comando mount.

$ sudo mount -o loop /home/discoq
# l'opzione -o loop è necessaria perché in questo caso si tratta di un file

Se per il file system è abilitato il journaling, si possono usare le opzioni usrjquota e grpjquota:

... defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0

La voce jqfmt serve a specificare il formato per il file delle quote, da usare al posto di quello di default.

Quote disco - esercitazione (3)

La radice del file system innestato, su cui opera la gestione delle quote, deve contenere i due file (o uno solo, dipende dalle esigenze) aquota.user e aquota.group, leggibili solo da root.

$ sudo touch /home/discoq/aquota.user
$ sudo touch /home/discoq/aquota.group
$ sudo chmod 600 /home/discoq/aquota.*

Se si desidera che gli utenti possano verificare la loro situazione autonomamente, i permessi dovranno essere impostati a 644.

Quote disco - esercitazione (4)

Per inizializzare i due file, si usa il programma quotacheck.

$ sudo quotacheck -avug
quotacheck: Scanning /dev/loop1 [/home/discoq] done
quotacheck: Checked 3 directories and 4 files

Nota: alla prima esecuzione, viene emesso un warning, perché i file sono vuoti. Dopo l'inizializzazione, non lo sono più:

$ ls -l /home/discoq/aquota.*
-rw------- 1 root root 6144 2007-12-09 21:02 /home/discoq/aquota.group
-rw------- 1 root root 6144 2007-12-09 21:02 /home/discoq/aquota.user

Quote disco - esercitazione (5)

Per attivare il controllo delle quote, si usa quotaon:

$ sudo quotaon /home/discoq

Si può ottenere un rapporto sullo stato corrente con repquota:

$ sudo repquota -v /home/discoq
*** Report for user quotas on device /dev/loop1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --    1500       0       0              4     0     0       

Statistics:
Total blocks: 6
Data blocks: 1
Entries: 1
Used average: 1.000000