Witaj na blogu prowadzonym przez Sebana. Spisuję tutaj swoje uwagi na różny temat. Przeważają tematy związane z Internetem, popieranymi przeze mnie rozwiązaniami dotyczącymi wykorzystania komputerów, oraz kilka innych.

I-węzeł

26 sierpnia 2006 | Klucze: linux
5 komentarzy. trackback

Na początku tygodnia miałem problem z brakiem miejsca na jednej z moich partycji. Problem nie byłby może aż tak wielki gdyby nie fakty, że partycja ta jest montowana jako ,,/``. Za nic nie mogłem sobie z tym poradzić przez dwa dni.

inode

I-węzeł (inode) jest to struktura danych opisująca pliki zapisane na dysku. I-węzeł zawiera informacje o: typie pliku, właścicielu, grupie, długości pliku, adresie, liczbie dowiązań i kilka innych informacji. Długość pliku to nic innego jak jego wielkość, ilość zajmowanego miejsca na dysku. Adres to numer sektora w którym znajduje się plik. Adresem są sektory dysku, w których należy szukać segmentów pliku (zwykle te sektory mają wielkość 512 bajtów). Liczba dowiązań jest to ilość skojarzonych ,,kopii" pliku ze zbiorem danych. Trochę dziwaczne, ale pokażę o co chodzi.
Najpierw utworzę plik, skopiuję go, a potem utworzę do niego dowiązanie symboliczne i twarde. seban@syrius:~/inode% touch plik
seban@syrius:~/inode% cp plik plik_kopia
seban@syrius:~/inode% ln -s plik symboliczne
seban@syrius:~/inode% ln plik dowiazanie
Tworząc plik skojarzyłem z inodem zbiór danych na dysku, plik jest pusty więc mało w nim tych informacji. Kopia jest to odtworzenie tych samych danych w innym miejscu - innym i-węźle. Kopia została skojarzona z innym i-węzłem i plik_kopia ma inny adres niż plik. Dowiązanie symbolicze jest to jakby skrót do pliku do którego tworzy się dowiązanie. Wszystkie operacje, edycja, zmiany będą odbywały się na pliku do którego prowadzi dowiązanie symboliczne. Główną różnicą jest ilość zajmowanego miejsca (dowiązanie symboliczne zajmuje 4 bajty), oraz fakt iż dowiązanie symboliczne zajmuje oddzielny i-węzeł. Dowiązanie twarde jest to taka kopia pliku, który zajmuje ten sam i-węzeł co plik z którym skojarzone jest dowiązanie. Sprawdzić ilość dowiązań można dzięki poleceniu ls -l -rw-r--r-- 2 seban seban 0 2006-08-26 19:15 dowiazanie
-rw-r--r-- 2 seban seban 0 2006-08-26 19:15 plik
-rw-r--r-- 1 seban seban 0 2006-08-26 19:15 plik_kopia
lrwxrwxrwx 1 seban seban 4 2006-08-26 19:16 symboliczne -> plik
Ilość dowiązań to liczba przed właścicielem, druga kolumna od lewej strony. By potwierdzić moje słowa o i-węzłach tych plików można zajrzeć w polecenie ls -i seban@syrius:~/inode% ls -i
1180218 dowiazanie 1180218 plik 1180407 plik_kopia 1180497 symboliczne
Są cztery pliki, trzy numery inodów. dowiazanie i plik mają taki sam numer i-węzła, plik_kopia i symboliczne mają inne numery swoich i-węzłów.

Problem

Mój problem polegał na tym, że polecenie df -h pokazywało prawie 700 megabajtów wolnego miejsca na partycji, a system nie mógł tworzyć nowych plików. Długo nie mogłem poszukać rowiązania, ale po wklepaniu polecenia df -i doznałem szoku. /dev/sda2 1.3M 1.3M 0 100% / Wszystkie węzły niemalże milion trzysta tysięcy były zajęte. Pozostało tylko poszukać niepotrzebne pliki, które zajmują inody.

Rozwiązanie

Chwilę szukałem po systemie i znalazłem w katalogu /var/spool/exim4 przyczynę braku i-węzłów. W katalogach input i msglog było łącznie ponad milion plików! Szczerze mówiąc to prawie się nie zastanawiałem co to za pliki i do czego są tam potrzebne. Po usunięciu plików z tych katalogów pojawiło się więcej miejsca na dysku i dużo więcej wolnych i-węzłów.
Napisałem sobie skrypt, który wyszukuje katalogi z największą liczbą plików, oraz wyszukuje puste pliki i katalogi. Skrypt jest ogólnie dostępny i można go dowolnie używać.


KOMENTARZE

26 sierpnia 2006 | Nivertius |

Bardzo ładny wpis, niesamowicie mi się podoba. No, wiem, że próżne, ale musiałem to powiedzieć, bo wzbudził we mnie bardzo pozytywne emocje ;-)

26 sierpnia 2006 | Nivertius |

Ah, jeszcze malutkie dopowiedzenie - link symboliczny nie zawsze zajmuje 4 bajty, zawsze zajmuje tyle ile bajtów zajmuje jego cel. Tzn. jeżeli linkujemy do 'asdf' to zajmuje 4, ale ten sam link będzie zajmował 6, jeżeli będziemy linkować do './asdf' a jeszcze jeden przykład - linkowanie do roota będzie zajmować 1 bajt. Tak więc zajmuje tyle ile w sobie zawiera ;-)

26 sierpnia 2006 | grzywacz |

Hej, to ja, naczelny czepialski Jabby. :P A więc: "Długość pliku to nic innego jak jego wielkość, ilość zajmowanego miejsca na dysku" - nie prawda, można mieć plik o długości 2GB zajmujący kilka bajtów: dd if=/dev/zero of=/tmp/ZOMG count=1 bs=1 seek=1GB Ćwiczenie: porównać wynik "ls -lh" i "du -hs" na tym pliku. "Adresem są sektory dysku, w których należy szukać segmentów pliku (zwykle te sektory mają wielkość 512 bajtów)" - sprzętowo tak, ale system plików operuje na blokach 4kB, bo taki jest rozmiar strony pamięci w architekturze x86. Znakomicie ułatwia to operacje w rodzaju buforowania. "Liczba dowiązań jest to ilość skojarzonych ,,kopii" pliku ze zbiorem danych." - no nie, liczba dowiązań to "liczba nazw" tego samego pliku, nie "kopii". "Główną różnicą jest ilość zajmowanego miejsca" - główna różnica jest taka, że dowiązanie twarde to odniesienie (referencja) do numeru i-węzła, zaś symboliczne odnosi się do nazwy pliku w drzewie katalogowym. Ponieważ numer i-węzła jest unikatowy tylko w obrębie jednego systemu plików, to nie można robić twardych dowiązań między różnymi FSami. A co do rozwiązania, to raczej zająłbym się eximem, a nie kasowaniem tworzonych przez niego na wariata plików. :D

26 sierpnia 2006 | grzywacz |

Bu, dlaczego osrało łamanie linii w moim komentarzu? :(

26 sierpnia 2006 | seban |

Pierwsza uwaga: nie wiedziałem Co do różnić pomiędzy i-węzłami brakowało mi trochę słów na określenie tego. Co do Exima: nie działa od dłuższego czasu, to jakieś starocie były o których zapomniałem. Dzięki za pochwały i uwagi, na naczelnego czepialskiego można zawsze liczyć ;-)