Quota – limity przestrzeni dyskowej
Napisał: Patryk Krawaczyński
19/12/2009 w Administracja Brak komentarzy. (artykuł nr 207, ilość słów: 1428)
Q
uota jest pakietem, który definiuje limity wykorzystania przestrzeni na dysku. Podstawową ideą quoty jest to, że użytkownicy naszego systemu zmuszeni są do ograniczenia swoich zasobów i, co za tym idzie odebranie im ich zdolności do zabierania nieskończonej ilości pamięci dyskowej. Według naszego uznania możemy nałożyć ograniczenia na poszczególnych użytkowników czy wybrane grupy systemowe. Ograniczenia możemy nakładać na dwa sposoby: ilość i-węzłów (czyli plików) jaką może zapisać użytkownik oraz ilość bloków (w kilobajtach) jaką może zapisać użytkownik. Narzucenie takich limitów daje nam komfort przed obawą, że jeden z użytkowników wykorzysta całe dostępne miejsce na partycji, gdzie znajdują się także konta innych użytkowników, co czasami może nawet doprowadzić do błędów podczas ich logowania.
Obsługa quoty została zintegrowana już z jądrem Linuksa od wersji 1.3.8x, także z jej posiadaniem nie powinno być problemu. Jednak, aby mieć możliwość skorzystania z tego pakietu, musimy się upewnić, że jądro naszego systemu potrafi ją obsłużyć – musi lub musiało być skompilowane z zaznaczoną opcją Quota support (CONFIG_QUOTA [y]) – poprzez kompilacje jądra poleceniem “make menuconfig” lub “make xconfig” powinniśmy znaleźć i zaznaczyć menu: [x] Quota support. Teraz wystarczy skompilować oraz zainstalować oprogramowanie pozwalające zarządzać quotą. Jeśli oprogramowanie obsługujące pakiet quoty jest już zainstalowane na naszym systemie (większość dystrybucji Linuksa oferuje możliwość instalacji tego pakietu podczas instalacji samego systemu – w Slackware jest to pakiet quota w sekcji “A” – w systemie Debian – quota oraz dodatkowo quotatool) nie musimy nic więcej robić (fakt ten możemy sprawdzić np. poprzez wydanie komendy quotacheck
).
Po spełnieniu wszystkich warunków pozwalających nam na skorzystanie z mechanizmu quoty przyszedł czas na zmodyfikowanie skryptu inicjalizującego nasz system, aby sprawdzał quotę oraz włączał ją podczas startu systemu (w dystrybucji Slackware skrypt /etc/rc.d/rc.M jest standardowo przystosowany do tej funkcji). Oto przykładowy wycinek skryptu, który sam przeszukuje plik /etc/fstab w celu sprawdzenia czy zostały dodane flagi sugerujące uaktywnienie mechanizmu quoty na danej partycji. Jeśli tak – to nastąpi aktywacja limitów dyskowych nałożonych na daną partycję:
if grep -q quota /etc/fstab ; then for quotafs in $(awk '/quota/ {print $2}' /etc/fstab) ; do /bin/rm -f $quotafs/{a,}quota.{group,user}.new done if [ -x /sbin/quotacheck ]; then echo "Checking filesystem quotas: /sbin/quotacheck -avugm" /sbin/quotacheck -avugm fi if [ -x /sbin/quotaon ]; then echo "Activating filesystem quotas: /sbin/quotaon -avug" /sbin/quotaon -avug fi fi
Główną zasadą jaką musimy przestrzegać podczas włączania quoty – jest to, aby mechanizm ten był uaktywniany dopiero jak systemy plików odczytane z pliku /etc/fstab zostały zamontowane – w innym przypadku mechanizm quoty nie będzie działał. Dlatego skrypt ten powinien znajdować się na końcu pliku inicjalizującego system, lub po sekcji kiedy systemy plików są montowane.
Aktywowanie quoty zaczynamy od edycji pliku /etc/fstab. W zależności od tego czy chcemy nałożyć limit na poszczególnych użytkowników czy na grupę do opcji montowania danej partycji, na której mają być aktywne limity dopisujemy opcję: usrquota (dla poszczególnych użytkowników) lub grpquota (dla poszczególnych grup). Więc, aby możliwe było nałożenie ograniczenia przestrzeni dyskowej na katalogi domowe użytkowników, katalog /home musi znajdować się na oddzielnej partycji. Oto przykładowy wpis aktywujący limity dla poszczególnych użytkowników systemu:
/dev/hda7 /home ext4 defaults,rw,nosuid,nodev,usrquota 1 1
Oczywiście możemy dodać równocześnie opcję usrquota oraz grpquota. Teraz wystarczy stworzyć plik z danymi o quocie. W zależności od flag jakie dodaliśmy do montowania danej partycji tworzymy plik aquota.user – w przypadku umieszczenia flagi usrquota lub aquota.group – w przypadku umieszczenia flagi grpquota. Jeśli dodaliśmy obydwie flagi tworzymy dwa wymienione pliki. Pliki te powinny należeć do administratora systemu (root) – tylko on powinien posiadać możliwość ich zapisu i odczytu oraz powinny one znajdować się w podstawowym katalogu na partycji, którą chcemy objąć quotą. Czyli w przypadku partycji /home będą to polecenia:
touch /home/quota.user touch /home/quota.group chmod 600 /home/quota.* touch /home/aquota.user touch /home/aquota.group chmod 600 /home/aquota.*
Pierwsze trzy polecenia odnoszą się do systemu plików quoty w wersji pierwszej, a kolejne trzy do systemu plików quoty w wersji drugiej – którego aktualnie używają jądra Linuksa od wersji 2.4.x. W zależności jakiej wersji systemu quoty używamy należy wykonać odpowiednie komendy – aby zachować kompatybilność oraz zapobiec zbędnym komunikatom programu quotacheck można stworzyć wszystkie cztery pliki, później sprawdzając, które pliki są wykorzystywane.
Po tak wykonanych zabiegach wykonujemy restart systemu w celu wprowadzenia zmian jakich dokonaliśmy. Jeśli podczas startu systemu w sekcji odpowiedzialnej za zamontowanie “normalnej” quoty spotkamy się z komunikatem:
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
Możemy pokusić się o aktywację mechanizmu quoty z obsługą księgowania. Zaletą quoty z księgowaniem jest fakt, iż nie wymaga ona uruchamiania programu quotacheck po awaryjnym zamknięciu systemu (działa ona dla systemu plików ext3 oraz ext4). W tym celu wystarczy nasz wcześniejszy wpis dla partycji /home zmodyfikować na:
/dev/hda7 /home ext4 defaults,rw,nosuid,nodev,usrjquota=aquota.user,jqfmt=vfsv0 1 1
Teraz jesteśmy gotowi, aby przypisać limity użytkownikom. W celu ograniczenia wielkości przestrzeni dyskowej dla np. jednego użytkownika o loginie agresor wydajemy polecenie: “edquota -u agresor“. W tym momencie w oknie edytora widzimy informacje o całkowitej liczbie aktualnie używanych przez użytkownika bloków (w kilobajtach / KB ) oraz aktualnej liczby plików jaką użytkownik posiada na dysku (inodes):
/dev/hda7: blocks in use: 5027, limits (soft = 0, hard = 0) inodes in use: 27, limits (soft = 0, hard = 0)
Limity wielkości bloków (KB) oraz ilości plików nadajemy poprzez modyfikacje ich początkowych wartości. Istnieją dwa rodzaje ograniczeń: pierwszy to soft – jest to limit, który określa maksymalną objętość dysku jaką może wykorzystać użytkownik – limit ten może być przekroczony jeśli aktywna jest opcja grace period – czyli opcja, która określa czas przez który użytkownik może nadal zapisywać dane w stanie przekroczenia limitu. Drugim rodzajem jest hard (działa jedynie przy ustawieniu grace period) – określa absolutny limit na dysku, którego dany użytkownik nie może przekroczyć. Na przykład chcemy nałożyć limity dyskowe, które będą pozwalały użytkownikowi zapisać dane o objętości 5 MB (5120 KB) oraz umożliwiały posiadanie 500 plików:
/dev/hda7: blocks in use: 5027, limits (soft = 5120, hard = 0) inodes in use: 27, limits (soft = 500, hard = 0)
Standardowo grace period nie jest aktywne (czyli ustawione na 0), dlatego limitu (soft), który ustaliliśmy nie da się przekroczyć. Aby ukazać działanie opcji grace period stwórzmy limit pozwalający użytkownikowi zapisać dane o objętości 5 MB, posiadać 500 plików, lecz tylko przez 5 dni będzie on mógł posiadać oraz zapisywać dane o objętości 7 MB (7168 KB) oraz posiadać 1000 plików:
/dev/hda7: blocks in use: 5027, limits (soft = 5120, hard = 7168) inodes in use: 27, limits (soft = 500, hard = 1000)
Następnie wydajemy polecenie: “edquota -t” w celu określenia długości czasu, w którym będzie możliwy zapis danych przez użytkownika po przekroczeniu soft limitu:
Time units may be: days, hours, minutes, or seconds Grace period before enforcing soft limits for users: /dev/hda7: block grace period: 5 days, file grace period: 5 days
Takie ustawienie po przekroczeniu użytkownika 5 MB spowoduje, automatyczne uaktywnienie się hard limitu pozwalającego mu zapisać tylko i wyłącznie 7 MB oraz ograniczy jego przekroczenie limitu do 5 dni. Po 5 dniach użytkownik nie będzie w stanie zapisywać żadnych dodatkowych danych dopóki nie wróci do stanu określonego przez soft limit czyli mniejszego lub równego 5 MB. Podobnie ustawiamy quotę dla całej grupy z tą różnicą, że limity będą się tyczyły nie jednego użytkownika lecz wszystkich, którzy należą do danej grupy. W tym celu wydajemy polecenie: “edquota -g grupa, a jeśli chcemy zobaczyć wykaz wszystkich ustawień quoty wydajemy polecenie: “repquota -a“.
Bonus:Jeśli chcemy, aby użytkownik np. firedoll posiadał takie same ustawienia quoty jak użytkownik agresor to wystarczy, że wydamy polecenie: “edquota -p agresor firedoll“. Dodatkowo możemy spowodować, by quota była uaktualniana np. co dzień, a nie co restart systemu poprzez dodanie następującego skryptu do ścieżki crontaba znajdującej się w /etc/cron.daily/:
#!/bin/sh /sbin/quotaoff -a /sbin/quotacheck -avugmb /sbin/quotaon -avug
– typ pliku: zwykły, katalog lub plik urządzeń,
– identyfikator UID właściciela,
– wykaz bloków dyskowych i ich fragmentów tworzących plik.
I-węzeł możemy traktować jako swoisty identyfikator pliku na dysku, którym system posługuje się w celu odnalezienia żądanego pliku. Każdy plik na danej partycji ma przyporządkowany tylko jeden i-węzeł. Natomiast blok dyskowy to przechowująca informacje część przestrzeni na partycji. Rozmiar bloku definiowany jest przez użytkownika podczas podziału dysku na partycje. Może jednak zostać zmieniony przy użyciu programów modyfikujących dany system plików; w przeciwieństwie do i-węzłów, wiele bloków może należeć do jednego pliku.
Więcej informacji: Quota mini-HOWTO – /usr/doc/Linux-mini-HOWTOs/Quota