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, formatquota_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
/homelub innej istniejącej partycji produkcyjnej, pomiń ten krok i przejdź od razu do edycji/etc/fstabdla 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:
| Flaga | Znaczenie |
|---|---|
-c | utwórz pliki quota od zera (potrzebne przy pierwszym uruchomieniu / systemie plików bez wcześniejszej quoty) |
-a | sprawdź wszystkie systemy plików wymienione w /etc/mtab, dla których włączono quotę |
-v | tryb szczegółowy (verbose) |
-u | sprawdzaj limity użytkowników (aquota.user) |
-g | sprawdzaj limity grup (aquota.group) |
-m | nie 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 systemdquotaonjest wywoływane automatycznie przy montowaniu (obsługa quota jest częścią standardowego procesu mount), a ręcznequotaon -avugsł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 docelowybs=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:
- Na koncie użytkownika, do którego chcemy wysłać wiadomość, włącz odbiór
komunikatów:
mesg y
- Sprawdź nazwę jego terminala:
who
- Z drugiej sesji/terminala wyślij wiadomość do konkretnego użytkownika i
terminala:
write testuser pts/1
- 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 timer — write/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
- Instalacja pakietu
quota(sudo apt install quota). - Przygotowanie testowego systemu plików (loop device + ext4) lub użycie
realnej partycji (np.
/home). - Dodanie
usrquota,grpquotaprzy montowaniu / w/etc/fstab+mount -o remount. quotacheck -cavugm– wygenerowanie plikówaquota.user/aquota.group(lubtune2fs -O quotajako nowocześniejsza alternatywa bezaquota.*).quotaon -avug– włączenie mechanizmu.edquota -u <user>– ustawienie limitów soft/hard dla blocks i inodes,edquota -t– ustawienie grace period.- Testy:
touch plik{1..102}(inodes),dd if=/dev/zero of=plik bs=1M count=N(blocks) — wykonywane jako testowy użytkownik. - Weryfikacja:
quota -u <user>,repquota -a. - Obserwacja:
journalctl -kf/tail -f /var/log/syslog, opcjonalnie demonstracjamesg/write; w produkcji –warnquota. - Sprzątanie:
quotaoff, odmontowanie,losetup -d, usunięcie testowego użytkownika.