Przejdź do głównej zawartości

Quota w Linuksie

Ćwiczenie jest napisane pod współczesnego Ubuntu (22.04/24.04 LTS) i nie wymaga żadnego konkretnego hipervisora. Żeby nie ryzykować limitów na prawdziwym systemie plików /home, przygotowujemy osobny, mały system plików testowy z pliku obrazu podpiętego przez losetup — dokładnie tak samo jak w ćwiczeniach LVM i RAID w tym kursie.

1. Przygotowanie – instalacja pakietu quota

sudo apt update
sudo apt install quota

Współczesne jądro Linux ma wbudowaną obsługę quota (CONFIG_QUOTA, format quota_v2) – nie trzeba nic dodatkowo kompilować, wystarczy pakiet narzędzi użytkownika (quota, quotacheck, edquota, repquota...).

2. Przygotowanie testowego systemu plików

Tworzymy plik-obraz 500 MB, formatujemy jako ext4 i montujemy w /mnt/quota-lab:

mkdir -p ~/quota-lab && cd ~/quota-lab
truncate -s 500M disk.img
sudo losetup -fP disk.img
losetup -a # sprawdź przydzielony /dev/loopX

sudo mkfs.ext4 /dev/loop0 # podmień na faktyczny numer z losetup -a
sudo mkdir -p /mnt/quota-lab

Jeśli wolisz ćwiczyć bezpośrednio na /home lub innej istniejącej partycji produkcyjnej, pomiń ten krok i przejdź od razu do edycji /etc/fstab dla właściwego urządzenia — reszta ćwiczenia jest identyczna.

3. Wpisy w /etc/fstab

Loop devices nie mają stałego wpisu w /etc/fstab (numer /dev/loopX nie jest gwarantowany po restarcie), więc na potrzeby ćwiczenia montujemy ręcznie z opcjami usrquota,grpquota:

sudo mount -o usrquota,grpquota /dev/loop0 /mnt/quota-lab
mount | grep quota-lab

Na prawdziwej, stałej partycji (np. /dev/sdb1 montowanej jako /home) zamiast tego edytujesz /etc/fstab:

/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2

i stosujesz zmianę bez restartu systemu:

sudo mount -o remount /home
mount | grep /home

4. quotacheck – utworzenie plików quota

sudo quotacheck -cavugm

Znaczenie przełączników:

FlagaZnaczenie
-cutwórz pliki quota od zera (potrzebne przy pierwszym uruchomieniu / systemie plików bez wcześniejszej quoty)
-asprawdź wszystkie systemy plików wymienione w /etc/mtab, dla których włączono quotę
-vtryb szczegółowy (verbose)
-usprawdzaj limity użytkowników (aquota.user)
-gsprawdzaj limity grup (aquota.group)
-mnie przemontowuj systemu plików w tryb tylko do odczytu podczas sprawdzania

Jeśli montujesz konkretny punkt (jak /mnt/quota-lab), a nie chcesz przeszukiwać wszystkich systemów plików naraz, możesz podać go bezpośrednio: sudo quotacheck -cvugm /mnt/quota-lab.

Polecenie tworzy w katalogu głównym danej partycji pliki aquota.user i aquota.group, w których przechowywane są limity.

Sprawdź, czy pliki quota zostały utworzone:

ls -la /mnt/quota-lab | grep aquota

5. Włączenie quota

sudo quotaon -avug
quotaon -p /mnt/quota-lab # potwierdzenie, że quota jest aktywna

Historycznie (SysV init) uruchamiano quotę skryptami startowymi typu bootquota. Dziś na systemach z systemd quotaon jest wywoływane automatycznie przy montowaniu (obsługa quota jest częścią standardowego procesu mount), a ręczne quotaon -avug służy głównie do włączania jej "na gorąco" bez restartu, tak jak w tym ćwiczeniu.

Nowoczesna alternatywa: quota utrzymywana przez sam system plików (journaled quota)

Na ext4 można ominąć krok quotacheck po każdym niepoprawnym zamknięciu systemu, włączając księgowanie quoty bezpośrednio w systemie plików (quota_v2), zamiast trzymać je w plikach aquota.*:

sudo umount /mnt/quota-lab
sudo tune2fs -O quota /dev/loop0
sudo mount -o usrquota,grpquota /dev/loop0 /mnt/quota-lab

Wtedy jądro samo utrzymuje limity spójnie i quotacheck po restarcie nie jest potrzebny. Do celów dydaktycznych w tym ćwiczeniu używamy jednak klasycznej ścieżki quotacheck + aquota.user/aquota.group, bo lepiej pokazuje mechanizm działania.


6. Utworzenie testowego użytkownika

Do testów limitów potrzebny jest osobny użytkownik (np. testuser):

sudo adduser --home /mnt/quota-lab/testuser --no-create-home testuser
sudo mkdir -p /mnt/quota-lab/testuser
sudo chown testuser:testuser /mnt/quota-lab/testuser

7. Ustawienie limitów – edquota

Edytuj limity dla wybranego użytkownika:

sudo edquota -u testuser

Otworzy się edytor (domyślnie $EDITOR, np. nano na współczesnym Ubuntu — jeśli chcesz mieć pewność, ustaw sudo -E EDITOR=nano edquota -u testuser) z tabelą w postaci:

Disk quotas for user testuser (uid NNNN):
Filesystem blocks soft hard inodes soft hard
/dev/loop0 ... 20000 30000 ... 100 200
  • blocks – limit zajętości dysku (w blokach, zwykle 1 blok = 1 KB)
    • soft = 20000, hard = 30000
  • inodes – limit liczby plików
    • soft = 100, hard = 200

Soft limit – można go przekroczyć, ale system ostrzega i po upływie tzw. grace period (okresu karencji, ustawianego przez edquota -t) przestaje zezwalać na dalsze zapisy. Hard limit – wartość, której nigdy nie można przekroczyć.

Ustaw okres karencji (grace period):

sudo edquota -t

8. Testowanie limitu i-węzłów (liczby plików)

sudo -u testuser bash -c 'cd /mnt/quota-lab/testuser && touch plik{1..102}'
  • Utworzenie plików do ok. 100 (soft limit) powinno się udać.
  • Po przekroczeniu hard limitu (200) kolejne próby utworzenia pliku zakończą się błędem Disk quota exceeded.

Możesz powtórzyć test z inną nazwą, żeby zobaczyć zachowanie po przekroczeniu soft limitu (w trakcie grace period i po nim):

sudo -u testuser bash -c 'cd /mnt/quota-lab/testuser && touch plika{1..102}'

Sprawdź aktualne zużycie limitów:

sudo quota -u testuser

9. Testowanie limitu miejsca na dysku (blocks)

sudo -u testuser dd if=/dev/zero of=/mnt/quota-lab/testuser/plik bs=1M count=25
  • if=/dev/zero – źródło danych (same zera)
  • of=... – plik docelowy
  • bs=1M – rozmiar bloku (1 megabajt)
  • count=25 – liczba bloków (łącznie ok. 25 MB)

Dobierz count tak, aby przekroczyć soft/hard limit blocks i zaobserwuj komunikat o przekroczeniu quota (dd: error writing ...: Disk quota exceeded).

Sprawdź stan wszystkich użytkowników na danym systemie plików:

sudo repquota -a
sudo repquota /mnt/quota-lab

10. Obserwacja przekroczenia limitu w logach systemowych

Na współczesnym Ubuntu najwygodniej śledzić zdarzenia jądra (w tym komunikaty quota) przez journalctl:

journalctl -kf # -k: tylko komunikaty jądra, -f: follow (na żywo)

Klasyczne pliki logów (jeśli zainstalowany jest rsyslog) wciąż działają jako alternatywa:

tail -f /var/log/syslog # Debian/Ubuntu
tail -f /var/log/kern.log # komunikaty jądra

Powiadamianie użytkownika w konsoli (mechanizm write/mesg)

Jako dodatkowa (dziś już rzadko używana, ale dydaktycznie wygodna) demonstracja komunikacji między sesjami terminalowymi:

  1. Na koncie użytkownika, do którego chcemy wysłać wiadomość, włącz odbiór komunikatów:
    mesg y
  2. Sprawdź nazwę jego terminala:
    who
  3. Z drugiej sesji/terminala wyślij wiadomość do konkretnego użytkownika i terminala:
    write testuser pts/1
  4. Na drugim terminalu wykonaj tę samą operację w drugą stronę (test dwukierunkowej komunikacji).

W praktyce administratorzy o zbliżających się/przekroczonych limitach informują użytkowników automatycznie poleceniem warnquota (z tego samego pakietu quota, konfigurowanym w /etc/warnquota.conf), uruchamianym cyklicznie np. z cron/systemd timerwrite/mesg służy tu tylko do zilustrowania samej idei powiadomienia w czasie rzeczywistym.


11. Sprzątanie

sudo quotaoff -avug
sudo umount /mnt/quota-lab
sudo losetup -d /dev/loop0
rm -f ~/quota-lab/disk.img
sudo deluser testuser

Podsumowanie – kolejność czynności

  1. Instalacja pakietu quota (sudo apt install quota).
  2. Przygotowanie testowego systemu plików (loop device + ext4) lub użycie realnej partycji (np. /home).
  3. Dodanie usrquota,grpquota przy montowaniu / w /etc/fstab + mount -o remount.
  4. quotacheck -cavugm – wygenerowanie plików aquota.user/aquota.group (lub tune2fs -O quota jako nowocześniejsza alternatywa bez aquota.*).
  5. quotaon -avug – włączenie mechanizmu.
  6. edquota -u <user> – ustawienie limitów soft/hard dla blocks i inodes, edquota -t – ustawienie grace period.
  7. Testy: touch plik{1..102} (inodes), dd if=/dev/zero of=plik bs=1M count=N (blocks) — wykonywane jako testowy użytkownik.
  8. Weryfikacja: quota -u <user>, repquota -a.
  9. Obserwacja: journalctl -kf / tail -f /var/log/syslog, opcjonalnie demonstracja mesg/write; w produkcji – warnquota.
  10. Sprzątanie: quotaoff, odmontowanie, losetup -d, usunięcie testowego użytkownika.