Większość systemów plików w linuksie pozwala na ustawienie quoty na dwóch poziomach: na użytkownika lub na grupę użytkowników. W wielu przypadkach taki podział jest sensowny i wystarczający. Ale zdarzają się scenariusze, w których to za mało.

Dobrym przykładem jest serwer FTP z wirtualnymi kontami użytkowników. Czyli usługa serwera działa jako pewien nieuprzywilejowany użytkownik systemowy (przeważnie ftp) przypisany do nieuprzywilejowanej grupy (np. nogroup). Konta użytkowników serwera FTP są zdefiniowane w bazie danych lub serwerze LDAP. Takie konta nazywa się wirtualnymi ponieważ po autoryzacji w pewnym systemie (bazie danych, LDAP’ie) działają z uprawnieniami pewnego systemowego konta (w tym przypadku ftp) - nie ma więc odzwierciedlenia pomiędzy użytkownikami korzystającymi z ftp a kontami systemowymi.

Problemem w takim układzie jest to, że nie można rozróżnić poszczególnych użytkowników wirtualnych, ponieważ wszystkie operacje są wykonywane przez systemowego użytkownika ftp i to on jest właścicielem wszystich plików utworzonych przez użytkowników wirtualnych.

Rozwiązania są dwa:

  • sewer FTP ma zaimplementowaną obsługę quot dla użytkowników wirtualnych, z czego możemy skorzystać,
  • tworzymy quotę na katalog domowy użytkownika wirtualnego.

Mnie bardziej odpowiadała druga metoda.

O ile mi wiadomo w ext3 nie można tworzyć quoty per katalog, na moje szczęscie taką możliwość oferuje xfs, z którego korzystałem.

Jeżeli jeszcze nie masz dysku sformatowanego jako xfs to jest to dobry moment aby to zrobić:

# sdaX zastap nazwa urzadzenia ktore TY chcesz sformatowac
mkfs.xfs /dev/sdaX

# aby dzialala quoata per katalog trzeba zamonowac
# dysk z opcja prjquota
mount /dev/sdaX /mnt/ftp -o prjquota

Logika quot per katalog w xfs’ie jest taka, że najpierw tworzymy projekt z powiązanym z nim id, a później wiążemy poprzez id projekt z katalogiem. Przez co quota nałożona na projekt ma zastosowanie do katalogu. Konfiguracja projektów i przypisanych im katalogów znajduje się w dwóch plikach: /etc/projid i /etc/projects.

Utwórzymy teraz projekt i konfigurację dla niego:

# nazwa projektu i jego id - w naszym przypadku
# konto uzytkownika romana :)
echo ftproman:10 >> /etc/projid

# projektowi z id 10 przypisujemy katalog /mnt/ftp/roman
echo 10:/mnt/ftp/roman >> /etc/projects

Pozostało uruchomić quotę wpisująć komendy:

# wiazemy projekt z punktem montowania
xfs_quota -x -c 'poject -s ftproman' /mnt/ftp

# ustawiamy wlasiwa quote 1 gigabajt dla projektu
xfs_quota -x -c 'limit -p bhard=1g ftproman' /mnt/ftp

To tyle - quota na katalog jest założona i działa. Aby zobaczyć jaka część miejsca jest już wykorzystana wystarczy uruchomić polecenie:

xfs_quota -x -c 'report -h /mnt/ftp'

Project quota on /mnt/ftp (/dev/sda3)
                        Blocks
Project ID   Used   Soft   Hard Warn/Grace
---------- ---------------------------------
ftproman     1,5M      0     1G    00 [------]

Dla kolejnych użytkowników musimy tworzyć kolejne wpisy.