Linux disk quota
Z jakiś powodów zapragnąłem ustawić w Linuksie limity na użycie dysku. Pominę opis poszukiwania informacji w Internecie, ale w skrócie – z nieznanych mi powodów w zdecydowanej przewadze opisywane są jakieś starocie. W artykule pokrótce jak to wygląda w aktualnych wersjach jądra.
Kiedyś
Kiedyś było tak: poza filesystemem XFS, informacje o użyciu dysku i inodach był zapisywany w aplikach quota.user
i quota.group
. Potem coś poprawiono i nowe pliki nazywają się aquota.user
i aquota.group
.
Żeby limitowanie działało, dysk należy zamontować z opcjami usrquota
i grpquota
. Kolejna nowość wprowadziła usprawnienie dotyczące sposobu rejestrowania aktualnego użycia dysku dla użytkownika. Opcje montowania zmieniły się na usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv1
i dzięki temu pliki ze zużyciem dysku aktualizowane razem ze zmianami w plikach i przechodzą przez journal.
Potem trzeba uruchomić
sudo quotacheck -cugv /mnt/
i po
sudo quotaon -ug /mnt
możliwość limitowania dysku jest włączona.
Ale quotacheck
wypisało mi komunikat:
quotacheck: Your kernel probably supports ext4 quota feature but you are using external quota files. Please switch your filesystem to use ext4 quota feature as external quota files on ext4 are deprecated.
I tak dowiedziałem się, że ext4 wspiera pliki limitów jako ukryte inody, tylko trzeba tę opcję włączyć.
A tak to wygląda teraz
Zatem, jak to wygląda w na nowym jądrze.
Założenia: mam dysk... np. /dev/loop30
, montuję go na /mnt
.
Kernel został zbudowany z opcjami * CONFIGQUOTA=y * CONFIGQUOTA_TREE=m
Mamy narzędzia do obsługi limitów (np. apt install quota
na Ubuntu)
Mamy niezbędne moduły kernela (sudo modprobe quota_v2
działa).
Procedura jest następująca:
Tworzę filesystem (ext4):
sudo mkfs.ext4 /dev/loop30
Włączam wewnętrzną obsługę limitów (to jest ta najnowsza nowość)
sudo tune2fs -O quota /dev/loop30
Feature quota
oznacza: “Enable internal file system quota inodes”
A teraz jeszcze jedno: można mieć nie tylko limity per user i per grupa ale również limit per projekt. Nie mam pojęcia jak działa to ostatnie, ale można je wszystkie niezależnie włączać i wyłączać (patrz man tune2fs
):
sudo tune2fs -Q usrquota,grpquota,prjquota /dev/loop30
Można sprawdzić, że limity zostały włączone wywołując:
sudo tune2fs -l /dev/loop30 | grep "Filesystem features"
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize quota metadata_csum project
Obecność słowa “quota” oznacza, że feature jest włączony.
Kolejny krok: montowanie filesystemu:
sudo mount -o usrquota,grpquota,prjquota /dev/loop30 /mnt
Pewnie dobrze jest sobie ten mountpoint wpisać do /etc/fstab, ale chodzi po prostu o to, żeby włączyć dla tego dysku odpowiednie zliczanie limitów.
Żadnych plików limitów w /mnt nie widać, ale możemy uruchomić
sudo repquota /mnt
I zobaczymy zużycie tego dysku przez użytkownika root (bo tylko jego obiekty są na razie w tym katalogu).
Przy okazji, repquota
z parametrem -g
pokaże limity dla grup, a -P
limity dla projektów (jak ustalę jak zrobić taki projekt, to na pewno to opiszę).
Limity można ustawić poleceniami setquota
i edquota
(ale to już standard – każdy manual opisuje jak to zrobić).
Wygląda na to, że jeśli użyliśmy podczas montowania opcji usrquota, grpquta etc, to limity są od razu egzekwowane (bez konieczności włączania ich za pomocą quotaon
), co można sprawdzić używając opcji -p
:
sudo quotaon -p /mnt
Limity grupy na /mnt (/dev/loop30) są włączone
Limity użytkownika na /mnt (/dev/loop30) są włączone
Limity project na /mnt (/dev/loop30) są włączone
I działa.
Linki:
- (trochę stare już) https://wiki.archlinux.org/title/disk_quota
- (trochę nowsze) https://www.digitalocean.com/community/tutorials/how-to-set-filesystem-quotas-on-ubuntu-20-04
- (magiczny feature, o którym tak niewiele) https://ext4.wiki.kernel.org/index.php/Quota
Kontakt ze mną: @ark_r@mastodon.social