Inodes on XFS

It’s quite rare to have problems with XFS and inodes exhaustion. Mostly because XFS doesn’t have inode limit in a manner known from other filesystems – it’s using some percentage of whole filesystem as a limit and in most distributions it’s 25%. So it’s really huge amount of inodes. But some tools and distributions lowered limit ex. 5% or 10% and there you could have problems more often.
You could check what is you limit by issuing xfs_info with drive and searching for imaxpct value:

root@zombi:~# xfs_info /srv/backup/
metadane=/dev/mapper/slow-backup isize=256    agcount=17, agsize=2621440 blks
        =                       sectsz=512   attr=2
data    =                       bsize=4096   blocks=44564480, imaxpct=25
        =                       sunit=0      swidth=0 blks
naming  =version 2              bsize=4096  
 ascii-ci=0
log     =internal               bsize=4096   blocks=20480, version=2
        =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime=brak                   extsz=4096   blocks=0, rtextents=0

In this case I have 25% and it could be changed dynamically with xfs_growfs -m XX where XX is new percentage of volume capacity.
It’s also possible to change imaxpct on creation time by adding option -i maxpct=XX.

Quota na katalog w XFS’ie

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.