Kategória: Debian Linux

Zmenené: 16. január 2012

Kvóty využitia disku

V prípade serverov, kde diskový priestor zdieľa veľa používateľov sa ľahko môže stať, že sa jeden (alebo niekoľkí) utrhnú a začnú miesto na disku nie využívať, ale doslova zneužívať. Je úplne jedno či tak robia vedome alebo vďaka svojej neznalosti, pretože takýmto konaním začnú obmedzovať ostatných. Skôr alebo neskôr prídete na to, že každodenné sledovanie využitia disku je neefektívne a pracné a budete hľadať spôsob ako nespratníkov obmedziť.

Moderné operačné systémy majú spôsob ako obmedziť využívanie disku a v prípade Linuxu je možné obmedziť jednak celkové miesto na disku, ktoré je používateľovi k dispozícii (počet blokov), tak i počet súborov. V článku popíšem ako s takýmto systémom kvót v Linuxe (konkrétne v Debiane, ale inde je to obdobné) pracovať, ako ho pripraviť i ako ho sledovať.

Potreba obmedzovania počtu súborov súvisí so súborovými systémami, ktoré majú pevne nastavený počet súborov a tento počet sa nastavuje pri ich vytvorení (formátovaní).

Terminológia

Pri popise i nastavovaní kvót súborového systému sú používané niektoré termíny, ktorých význam je dobré správne chápať, preto ich krátke zhrnutie:

Počet blokov

Obmedzuje množstvo použitého miesta (veľkosť súborov) na disku v blokoch. Systém kvót používa 1 kB bloky, bez ohľadu na veľkosť bloku použitú súborovým systémom, takže nastavenie tohoto limitu sa počíta relatívne ľahko:

  • 1 MB = 1024 (1 024 kB)
  • 1 GB = 1449616 (1 024 * 1 024 kB)

Počet súborov (inodov)

Obmedzuje počet súborov. Počet súborov (inodov) príslušného súborového systému možno zistiť pomocou nástroja df:

df -i /home
Súborový systém        I-uzly    IPouž      IVoľ  IPou% Pripojený na
/dev/sda9            94767360     1039   94766321    1% /home

Nie všetky súborové systémy však takto počet súborov zobrazia, napr. ReiserFS (nemusí to nutne znamenať, že počet inodov nie je obmedzený):

df -i /inde
Súborový systém        I-uzly    IPouž      IVoľ  IPou% Pripojený na
/dev/sdb2                   0        0         0      - /inde

Odporúčam nastavenie maximálneho počtu súborov nepodceňovať, hoci vhodné hodnoty možno zistiť asi len praxou.

Mäkký limit (Soft Limit)

Udáva maximálne využitie disku používateľa/skupiny na príslušnej partícii. Avšak, ak je nastavená povolená doba (grace period), vystupuje ako hranica, pri ktorej je používateľ upozornený na blížiace sa prekročenie kvóty po jeho uplynutí. Počas povolenej doby je prekročenie mäkkého limitu tolerované (až po pevný limit), ale po jej uplynutí je kvóta považovaná za prekročenú a viac už používateľ nemôže nič zapísať (ale ani zmazať a musí zasiahnuť administrátor).

Pevný limit (Hard Limit)

Pevný limit vstupuje do hry, len ak je nastavená povolená doba a udáva absolútnu hranicu využitia disku, ktorú príslušný používateľ nemôže prekročiť.

Povolená doba (Grace Period)

Povolená doba je časový limit, počas ktorého môže používateľ naďalej zapisovať na disk, i keď prekročil mäkký limit, a to až do veľkosti pevného limitu. Ak nie je nastavená (=0) je aj mäkký limit považovaný za maximálnu hranicu.

Príprava

Príprava nasadenia kvót spočíva v nainštalovaní potrebného softvéru, výbere súborových systémov a ich inicializácii.

Inštalácia

Nutným minimom je jadro so zapnutou podporou kvót (jadro v Debiane má podporu zapnutú) a balík quota:

aptitude install quota

Samotný balík quota nainštaluje všetko potrebné na sledovanie kvót, spolu s konfiguračným súborom /etc/default/quota, v ktorom možno oi. nastaviť či majú byť používateľom denne posielané emaily s upozornením na prekročenie kvóty (voľba run_warnquota). Nastavenie tejto voľby je určite užitočné, keď máte nastavený poštový systém, ale ak nie a stroj plní funkciu napr. lokálneho súborového systému, považujem zapínanie tejto voľby za zbytočné a upozorňovanie je potrebné riešiť iným spôsobom.

Výber súborového systému

Po nainštalovaní balíka je teba nastaviť voľby pripájania súborových systémov v súbore /etc/fstab tak, aby boli príslušné súborové systémy pripájané so sledovaním kvót. Nie je potrebné zapínať kvóty na všetkých súborových systémoch (partíciách), ale stačí na tých, kde si používatelia ukladajú dáta, pretože jednak využitie systémových adresárov (ak ich máte na samostatných partíciách) by si mal ustrážiť správca systému iným spôsobom, ale hlavne môže dôjsť k situácií, že používateľovi nebude doručený ani email, pretože pri prekročení kvót bude odopretý zápis aj poštovému serveru…

Pozor na kvóty koreňového adresára (/), ľahko sa môže stať, že systém nenaštartuje, kvôli chýbajúcim modulom v initrd…

Výber súborových systémov, ktoré budú používať kvóty docielite pridaním volieb jeho pripojenia. K dispozícii je niekoľko možností:

  • userquota – zapína používateľské kvóty
  • groupquota – zapína skupinové kvóty
  • quota – zapína používateľské i skupinové kvóty

Tieto voľby zapínajú sledovanie kvót pre súborové systémy bez žurnálovania, kde sa predpokladá kontola kvót pri každom spustení…

  • usrjquota=<súbor> – zapína žurnálované používateľské kvóty
  • grpjquota=<súbor> – zapína žurnálované skupinové kvóty
  • jqfmt=vfsv0 – nastavuje verziu kvót (verzia 2)

Tieto voľby sú pre žurnálované súborové systémy, ako ext3, ext4, či ReiserFS a vyžadujú zadanie mena súboru s údajmi o využití disku. Pretože použitie žurnálovaných súborových systémov je dnes viac ako bežné, budem pokračovať práve ich nastavením. Hoci môžete použiť ľubovoľné mená súborov, je vhodné použiť predvolené: aquota.user na používateľské kvóty a aquota.group na skupinové.

Na zapnutie kvót súborového systému stačí upraviť voľby pripojenia v /etc/fstab, kde môžete na začiatku mať niečo takéto:

# /home was on /dev/sda2 during installation
UUID=fa0219cf-1465-4b5d-b6ce-afbcb0b8425d /home    reiserfs default  0 1

Všetko, čo je potrebné, je pridať príslušné voľby kvót (zapínam používateľské i skupinové kvóty, ale je možné zapnúť ich aj jednotlivo):

# /home was on /dev/sda2 during installation
UUID=fa0219cf-1465-4b5d-b6ce-afbcb0b8425d /home    reiserfs  default,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0  0 1

Po úprave volieb pripojenia je potrebné znova pripojiť dotknuté súborové systémy, čo môžete dosiahnuť reštartovaním systému, ale za vhodnejší spôsob považujem opätovné pripojenie súborového systému, pretože takto priamo uvidíte prípadné chybové hlásenia:

mount -o remount /home

V prípade adresára, ktorý nie je používaný môžete zvoliť aj jeho odpojenie a nasledovné pripojenie, ale v prípade, že to robíte za behu systému, môžete používateľom spôsobiť problémy… Nakoniec, samozrejme, skontrolovať výsledok:

mount | grep /home /etc/fstab
/dev/disk/by-uuid/ on /home type reiserfs (rw,noatime,notail,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0)

Po úspešnom nastavení kvót jednotlivým súborovým systémom ostáva ešte ich inicializácia:

quotacheck -guma

Tento príkaz inicializuje všetky súborové systémy, ktoré majú zapnuté kvóty a v ich koreni vytvára príslušné súbory aquota.*. Ak chcete inicializovať len konkrétny prípojný bod, jednoducho pridajte na koniec príkazu meno prípojného bodu (napr. /home). Jednotlivé voľby znamenajú:

  • -a – prikazuje prechádzať všetky súborové systémy so zapnutými kvótami
  • -m – prepisuje predvolené odmietnutie skenovania pripojených RW partícií
  • -u a -g – udávajú skenovanie využitia disku podľa UID resp. GID
  • -v – nastavuje podrobnejší výstup (ak chcete vedieť čo sa deje…)

Nakoniec ostáva kvóty zapnúť:

quotaon -agu

Čím dôjde k zapnutiu kvót na všetkých súborových systémoch, ktoré sú pripojené so zapnutým sledovaním kvót. Voľby tohoto príkazu majú rovnaký význam ako pri quotacheck a pri oboch príkazoch možno nahradiť voľbu -a menom konkrétneho zariadenia (napr. /dev/sda1).

Ovládanie sledovania kvót

Po inicializácii kvót ich môžete jednoducho zapínať alebo vypínať pomocou príkazov quotaon a quotaoff a ich voľby sú obdobné ako pri nástroji quotacheck. Ak sa v tom, ktoré kvóty máte zapnuté a ktoré vypnuté stratíte, pomôže voľba -p:

quotaon -ap
group quota on / (/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d) is on
user quota on / (/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d) is off

Pamätajte, že keď na nejakú dobu vypnete kvóty (quotaoff), môže byť potrebné pred ich zapnutím (quotaon) znova spustiť nástroj qutoacheck, aby došlo k zosúladeniu aktuálneho stavu súborového systému s kvótami. Za príkaz môžete pridať meno prípojného bodu súboru zariadenia (napr. /home) namiesto voľby -a, čím bude ovládanie sledovanie kvót len na tomto zariadení.

Správa kvót

Na správu systému kvót je k dispozícii viac nástrojov. Ako základný sa javí nástroj quota, ktorý zobrazí informácie o kvóte konkrétneho používateľa/skupiny:

quota -v slavko
Disk quotas for user slavko (uid 1000):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d
                     54       0       0              16       0       0

Výstup je v tomto prípade rozdelený do dvoch riadkov (zalamovanie možno potlačiť pomocou -w). V prvom stĺpci je identifikátor súborového systému (tu pomocou UUID), nasledovaný dvomi skupina stĺpcov, jednou pre miesto na disku a druhou pre počet súborov. Obe tieto skupiny obsahujú rovnaké údaje (v poradí):

  • skutočne použité
  • mäkký limit
  • pevný limit
  • zvyšok povolenej doby (tu prázdne, pretože nie je prekročený žiadny limit)

Tento nástroj umožňuje zobraziť nie len kvóty používateľa, ale aj skupiny (voľba -g), ale vždy len jednotlivo. Ak chcete získať komplexný prehľad o nastavení a využití kvót, poslúži nástroj repquota. Tento nástroj zobrazuje rovnaké údaje ako nástroj quota, ale pre všetkých používateľov/skupiny na danom súborovom systéme:

repquota -a
*** Report for user quotas on device /dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1224037       0       0          49916     0     0
...
slavko    --      54       0       0             16     0     0

Myslím, že význam jednotlivých stĺpcov možno pochopiť z ich hlavičky, zastavím sa ale pri druhom stĺpci, ktorý aktuálne má hodnotu „–”, tieto dva spojovníky (mínus) udávajú, že nebola prekročená kvóta ani počtu blokov (prvý) ani počtu súborov (druhý). V prípade prekročenia niektorého limitu je príslušné mínus zmenené na plus, napr:

                       Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
...
slavko    +-      58      20     200 14days      16     0     0
...

V tomto výpise vidno, že došlo k prekročeniu limitu veľkosti súborov (prvé plus) a používateľ môže mäkký limit prekračovať ešte 14 dní. Ďalšou úlohou správy je nastavovanie kvót jednotlivým používateľom a skupinám. Na tento účel slúžia nástroje edquota a setquota. Na začiatku nemá používateľ nastavené žiadne kvóty:

quota slavko
Disk quotas for user slavko (uid 1000): none

Dôležité môže byť aj informovanie používateľov, prípadne administrátorov, o prekročení kvót, na čo poslúži nástroj warnquota. Tento nástroj môže byť spúšťaný denne pomocou úlohy cron (nastavenie v /etc /default/quota) alebo manuálne…

Použitie nástrojov

quota

Ako prvý znova spomeniem nástroj quota, pretože je to jediný nástroj, ktorý môžu používať aj bežní používatelia, a to dvomi spôsobmi:

  • zobrazenie stavu kvót svojho účtu – prosté spustenie bez parametrov
  • zobrazenie stavu kvót skupín, ktorých je používateľ členom – použitím voľby -g, ak je pridané aj meno skupiny, je vypísaný stav tejto skupiny
quota -g
Disk quotas for group cdrom (gid 24): none
Disk quotas for group floppy (gid 25): none
Disk quotas for group audio (gid 29): none
Disk quotas for group dip (gid 30): none
Disk quotas for group video (gid 44): none
Disk quotas for group plugdev (gid 46): none
Disk quotas for group users (gid 100): none
Disk quotas for group slavko (gid 1000): none

Pokiaľ by bol používateľ príliš zvedavý a chcel by sa dozvedieť o kvótach skupiny, ktorej členom nie je, či o kvótach iného používateľa, má smolu:

quota mysql
quota: mysql (uid 105): Permission denied
quota -g mysql
quota: mysql (gid 108): Permission denied

Ďalšie nástroje, ktoré tu spomeniem sú určené na použitie správcom systému (root), preto k nim bežný používatelia prístup nemajú…

edquota

Kvóty je možné nastaviť jednotlivým používateľom i skupinám a slúži na to príkaz edquota, ktorý otvorí predvolený textový editor, v ktorom možno nastaviť jednotlivé limity.

Predvolený editor si môže každý používateľ nastaviť pomocou premennej prostredia $EDITOR, prípadne ho administrátor môže nastaviť pre celý systém pomocou systému alternatív Debianu.

Jeden používateľ

Úpravu nastavenia kvóty používateľa možno spustiť pomocou pomocou príkazu edquota -u používateľ. V súbore možno definovať kvóty pre každý súborový systém, kde sú používateľské kvóty zapnuté. Význam jednotlivých stĺpcov je podobný výpisu príkazu quota -v, s tým rozdielom, že v súbore sú len stĺpce pre skutočné využitie a mäkké a pevné limity miesta na disku a počtu súborov:

Disk quotas for user slavko (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/disk/by-uuid/skratene       54        200        250         16        0        0

V tomto konkrétnom prípade som nastavil mäkký limit blokov na 200 a pevný na 250. Limity počtu súborov nastavené nie sú. Po uložení súboru si možno výsledok skontrolovať nástrojom quota:

Disk quotas for user slavko (uid 1000):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d
                     54     200     250              16       0       0

Na tomto výpise vidíte, že používate slavko s UID=1000 má na danom súborovom systéme vytvorených 16 súborov s celkovou veľkosoťu 54 kB a že nemá nastavené limity počtu súborov (obe hodnoty majú 0), ale zato má nastavený mäkký (200 x 1 kB = 200 kB) i pevný limit (2505 x 1 kB = 250 kB) počtu blokov (veľkosti súborov). Viem, že 200 kB i 250 kB sú smiešne nízke hodnoty, ale zato sa jednoducho testujú…

Jedna skupina

Podobne ako používateľovi možno nastaviť kvótu aj skupine používateľov, tentokrát pomocou voľby edquota -g skupina, nastavenie je úplne rovnaké ako v prípade používateľa.

Hromadné nastavenie kvót

Spôsob, popísaný vyššie, je vhodný na nastavenia jednotlivcov. Ak potrebujete nastaviť kvóty viacerým používateľom možno využiť voľbu -p, ktorá umožňuje kopírovať nastavenie kvót od iného používateľa. Napríklad nastavenie kvót všetkým používateľom, ktorých UID je 1000 a vyššie zaistí príkaz:

edquota -p slavko $(awk -F: '$3 > 999 {print $1}' /etc/passwd)

Prípadne nastavenie kvót pre členov skupiny users:

edquota -p slavko $(members users)

Nastavenie povolenej doby

Doteraz popísané použitie edquota bolo o nastavení jednotlivcov (hoci i hromadne). Povolená doba (grace period) sa nastavuje pre celý systém (všetkých používateľov) pomocou príkazu edquota -t:

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/disk/by-uuid/skrátené     7days                  7days

Je však možné nastaviť povolenú dobu aj jednotlivcom, pomocou edquota -T používateľ:

Times to enforce softlimit for user slavko (uid 1000):
Time units may be: days, hours, minutes, or seconds
  Filesystem                         block grace               inode grace
  /dev/disk/by-uuid/skrátené            unset                     unset

Ako som už spomínal vyššie, povolená doba (ak je nastavená) mení správanie mäkkého limitu a umožňuje jeho prekročenie po povolenú dobu. Po uplynutí tejto doby je ďalší zápis do súborového systému odmietnutý… Povolená doba môže byť zadaná v sekundách, minútach, hodinách alebo dňoch. V uvedenom výpise je systémová povolená doba nastavená na 7 dní a používateľ nemá nastavenú dobu.

setquota

Nástroj setquota slúži na neinteraktívne nastavenie kvót a je vhodný najmä na nastavovanie kvót pomocou rôznych skriptov. Pri jeho použití je treba pamätať, že vždy musíte nastaviť hodnoty všetkých limitov, teda pre tie, ktoré nechcete zapínať treba zadať 0:

setquota slavko 200 250 0 0 -a

Uvedený príklad nastavuje kvóty používateľovi slavko, pričom nastavuje mäkký (200) a tvrdý (250) limit veľkosti súborov, vypína sledovanie počtu súborov a nastavuje to pre všetky súborové systémy. Ak chcete nastaviť kvóty len pre konkrétny súborový systém, jednoducho na konci nahraďte voľbu -a menom prípojného bodu:

setquota slavko 200 250 0 0 /home

Vypnúť sledovanie kvót daného používateľa možno nastavením hodnoty 0 pre všetky kvóty:

setquota slavko 0 0 0 0 -a

V prípade nastavovania kvót skupiny je postup rovnaký, len meno skupiny treba uviesť voľbou -g (pretože implicitne je predpokladaná voľba -u) :

setquota -g users 1000 1000 0 0 -a

Pomocou nástroja setquota možno nastavovať aj povolené doby, a to ako aj systémovú dobu:

setquota -t 1209600 1209600

…tak aj povolené doby jednotlivcov:

setquota -T slavko 1209600 1209600
setquota -T -g users  1209600 1209600

Treba však dať pozor, že v oboch prípadoch je nutné zadať čas udaný ako počet sekúnd (1209600 s = 14 dní).

warnquota

Nástroj warnquota slúži na zasielanie upozornení o prekročení kvóty. Po inštalácii je všetko pripravené na pravidelné denné posielanie emailov, ale predvolene je toto posielanie vypnuté. Na jeho zapnutie je potrebné nastaviť premennú run_warnquota v súbore /etc/default/quota na hodnotu true. Samozrejme, príkaz možno spustiť aj manuálne.

  • /etc/warnquota.conf – konfiguračný súbor
  • /etc/quotatab – popis zariadení
  • /etc/quotagrpadmins – administrátori skupín

V konfiguračnom súbore /etc/warnquota.conf možno nastaviť podrobnosti posielaného emailu a niektoré ďalšie informácie, ktorá by mali pomôcť používateľovi vyriešiť jeho problém s prekročenou kvótou:

MAIL_CMD = "/usr/sbin/sendmail -t"
FROM     = "root(at)localhost"
SUBJECT  = Prekročená kvóta
CC_TO    = "root(at)localhost"
SUPPORT  = "root(at)localhost"
PHONE    = "01 23 456"
CHARSET  = UTF-8

Ak posielanie emailov zapnete, iste bude vhodné tieto nastavenia prispôsobiť svojej potrebe, teda zdať reálne emailové adresy, či číslo telefónu…

Súbor /etc/quotatab slúži na nahradenie mena zariadenia niečim oveľa popisnejším, aby aj menej znalý používateľ chápal, kde prekročil kvótu (pamätajte, že takým používateľom /dev/disk/by-uuid/... veľa nepovie…). Východzie email vyzerá takto:

We noticed that you are in violation with the quotasystem
used on this system. We have found the following violations:

/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d

                        Block limits               File limits
Filesystem           used    soft    hard  grace    used  soft  hard  grace
/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d
               +-     246     200     300  6days      17     0     0

Po pridaní pomenovania do súboru /etc/quotatab:

/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d:Disk F:

Už email povie používateľom trochu viac:

...
Disk F: (/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d)

                        Block limits               File limits
Filesystem           used    soft    hard  grace    used  soft  hard  grace
/dev/disk/by-uuid/fa0219cf-1465-4b5d-b6ce-afbcb0b8425d
               +-     246     200     300  6days      17     0     0

„Disk F” je historické pomenovanie, ktoré je v práci zaužívané ešte z dôb Win98 a aby som to používateľom zbytočne nekomplikoval, je zdieľané pripájané s týmto menom, hoci už dávno nie je na disku F…

Konfiguračný súbor /etc/quotagrpadmins slúži na nastavenie používateľa, ktorému má byť poslaný email v prípade prekročenia skupinovej kvóty. Zmysel tohoto konfiguračného súboru je jednoduchý – v prípade prekročenia kvóty skupiny neexistuje spôsob ako informovať daného používateľa, ktorý prekročenie spôsobil. A i keby na to systém existoval, nie vždy môže za prekročenie kvóty ten používateľ, ktorý zápis prekročenie kvóty spôsobil a posielanie emailov všetkým členom je neužitočné… Preto môže správca v tomto súbore definovať ktorému používateľovi má byť, v prípade prekročenia kvóty, poslaný email. Zápis je veľmi jednoduchý:

skupina:používateľ

Takže, ak dôjde k prekročeniu kvóty skupiny skupina, dostane email používateľ používateľ, napríklad:

users:slavko

Takže o prekročení skupinovej kvóty skupiny users bude informovaný používateľ slavko.

Záver

Správa používateľských kvót je veľmi účinný nástroj na zjednodušenie života nie len správcovi, ale najmä používateľom, pretože im nikto nezneprístupní disk, len oni sami. Privítal by som ešte nejaký pekná grafický nástroj, ktorý by využitie kvót prehľadne zobrazil, napríklad vo webovom prehliadači, ale o žiadnom neviem.