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.