Przyczyna problemu
Problemem okazuje się sposób, w jaki XFS przydziela i-węzły. W przeciwieństwie do większości systemów plików, alokacja następuje dynamicznie w miarę tworzenia nowych plików. O ile nie określono inaczej, i-węzły są ograniczone do wartości 32-bitowych, co oznacza, że muszą mieścić się w pierwszym terabajcie pamięci w systemie plików. Więc jeśli całkowicie wypełnisz pierwszy terabajt, a następnie powiększysz dysk, nadal nie będziesz w stanie tworzyć nowych plików, ponieważ i-węzłów nie można utworzyć na nowej przestrzeni.
Rozwiązanie 1 - zmień opcje montowania
Jednym z rozwiązań jest ponowne zamontowanie systemu plików za pomocą opcji montowania inode64
. Jednak niektóre aplikacje będą się w tym dziwnie zachowywać (np. MySQL), a NFS będzie bardzo zdezorientowany. Jeśli więc nie masz pewności, czy Twój system będzie działał z tą opcją, możesz przejść do następnej opcji.
Rozwiązanie 2 - przenieś pliki
Drugim rozwiązaniem jest znalezienie niektórych plików, które są obecnie przechowywane w pierwszym terabajcie, i przeniesienie ich do innego obszaru systemu plików.
Przeprowadzka według wieku
W naszym przypadku było to łatwe - system plików był używany od lat, więc mogliśmy po prostu znaleźć najstarsze pliki i przenieść je z systemu plików, a następnie przenieść z powrotem. Można to łatwo zrobić za pomocą funkcji find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
podał nam listę zawierającą rozmiar i nazwę katalogu dla wszystkich katalogów dokładnie 3 poziomy poniżej punktu montowania, które były starsze niż 2 lata. Następnie możemy posortować listę w celu znalezienia największych katalogów i użyć ich mv
do przeniesienia ich do innego systemu plików iz powrotem.
Przeprowadzka według grupy alokacji
Jeśli nie możesz po prostu przejść ze względu na wiek, np. Gdy wiele plików zostało utworzonych jednocześnie, nadal możesz znaleźć odpowiednie pliki do przeniesienia, ale zajmuje to trochę więcej czasu.
XFS ma grupy alokacji (inaczej AG ), zaczynając od 0. Możesz sprawdzić rozmiar bloku i liczbę bloków każdej AG, aby dowiedzieć się, które grupy znajdują się na pierwszym terabajcie xfs_info /path/to/mountpoint
. Lub możesz po prostu sprawdzić kilka pierwszych AG, aby zobaczyć, które z nich są pełne, a następnie je wyczyścić.
- Sprawdzanie wolnego miejsca w pierwszych czterech AG:
dla ag w `seq 0 1 5`; wykonaj echo w spacji AG AG; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep „total free”; gotowy
Jeśli łączna ilość wolnego miejsca w dowolnej grupie jest mniejsza niż 40, nie będzie można tworzyć w niej nowych plików.
- Znajdź pliki w tym AG
Wymaga to sprawdzenia metadanych dla każdego pliku w systemie plików. Zajmie to dużo czasu ... Oto sugestia:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Następnie możesz grep dla " 0 "
(to spacja, zero i inna spacja), aby znaleźć wszystkie pliki w AG 0, grep, " 1 "
aby znaleźć te w AG 1, itp ... Zacznij od AG 0, przenieś największe pliki (używając mv
, nie cp
!), a następnie z powrotem. Powtarzaj tę czynność, aż będziesz mieć dość wolnego miejsca.
Wynik
Po przeniesieniu wystarczającej liczby plików z / extra, a następnie z powrotem, w AG 0 było dużo miejsca i znów można było tworzyć nowe pliki.