O newfs i kończących się i-nodach

Posted on Tue 29 November 2005 in Ultra1 z NetBSD

Nie chcę się powtarzać, więc nie napiszę jak instalować NetBSD na SUN Ultrze 1. Instaluje się praktycznie tak samo jak na O2, bootując z CD-ROM lub po sieci.Opiszę za to ciekawy problem, który zatrzymał mnie na krótko w moim zwycięskim pochodzie ku szczytnemu celowi jakim jest...


...posiadanie serwera MySQL z obsługą fontów multibyte czyli np. UTF8. Howgh!

W trakcie pobierania aktualnych źródeł dla portsów, w NetBSD znajdują się one w katalogu /usr/pkgsrc pojawił się dziwny błąd informujący, że zabrakło miejsca na partycji podmontowanej pod /usr. Sprawdziłem za pomocą df ile tego miejsca jest, zdziwiony bo przecież źródełka zajmują niewiele, i okazało się że mam jeszcze przeszło 300MB wolnego!

"Kurka blada!" - pomyślałem, i zamiast uważnie przeczytać komunikat błędu, postanowiłem dodać miejsca, podłączając w miejsce /usr inną, większą partycję. Od tego momentu zaczęły się moje katusze ale i nauka.

Uruchomiłem disklabel w trybie interaktywnym na drugim dysku (sd1):

# disklabel -i sd1

Założyłem dwie nowe partycje, dysk ma 2GB więc podzieliłem je mniej więcej po równo. Podając rozmiar partycji użyłem skrótów m - na oznaczenie megabajtów, więc disklabel sam za mnie dopasował rozmiary partycji w odpowiednich jednostkach, a przynajmniej tak sądziłem. Zapisałem nową etykietę dysku i wyszedłem z disklabela. Zainicjowałem nowy system plików (FFS) na partycjach:

# newfs sd1a ; newfs sd1b

i podmountowałem partycję sd1a pod katalog /mnt/sd1a.

Nadeszła kolej na przerzucenie zawartości /usr na nową partycję. Zgodnie z sugestiami na stronach NetBSD użyłem w tym celu pax. Wydałem komendy:

# cd /usr
# pax -rw -pe . .../mnt/sd1a
I wtedy maszyna zrobiła prask! i padła na pysk, przechodząc w tryb dbd>.
Pięknie, @#$$%%!, pięknie!

Zrebootowałem Ultrę, fsck-nąłem sd1a i ponownie podmontowałem. Jak tylko spróbowałem skasować cokolwiek na tej partycji, następował identyczny zwis. Zacząłem oglądać disklabel dysku sd1, żeby upewnić się, że wszystko jest w porządku. Chyba nie było. Ale komputer nadal się zawieszał przy dowolnej operacji zapisu na dysku sd1.

W końcu, po wielu próbach, wpadła mi do głowy myśl, że przyczyną moich kłopotów może być brak partycji swap. W trakcie jej dodawania, zauważyłem że mam kłopoty z rozmiarami partycji. Czasem początek jednej i koniec drugiej partycji nachodziły na siebie, o czym informował mnie disklabel. Zaprzągłem do wyliczania rozmarów bc i używając danych nt. dysku jakie wyświetlał mi disklabel podałem w końcu odpowiednie ilości cylindrów każdej z partycji, tak że nie miałem wątpliwości, że są prawidłowe i nie nachodzą na siebie.

I to było to! Mogłem kopiować i kasować pliki na nowych partycjach, a system zachowywał się znakomicie. Mogłem więc przystąpić do przenoszenia /usr na nowy dysk. Znów użyłem pax i tym razem, po paru minutach miałem kopię /usr w nowym miejscu. Zmieniłem wpis w /etc/fstab, tak by wskazywał na nowe miejsce, zrobiłem restart i miałem nowy-stary system.

Teraz zależało mi na ściągnięciu pkgsrc czyli portsów. Użyłem w tym celu skryptu, znów zaczerpniętego ze stron www NetBSD:

# cat ~/bin/fetch-CVS_pkgsrc.sh
export CVSROOT="anoncvs@anoncvs.NetBSD.org:/cvsroot"
export CVS_RSH="ssh"
cd /usr
cvs checkout -P pkgsrc

CVS rozpoczął pobieranie plików i przez kilkanaście minut wszystko szło dobrze. Do czasu. Znów pojawił błąd z informacją o braku miejsca. Fsck! O co chodzi?

Tym razem postanowiłem uważnie przeczytać treść komunikatu:

/: create/symlink failed, no inodes free
mknod: rsd1a: no space left on device
NO INODES FREE!!! Cholera, jak mogłem to przegapić! O ja debil. Szybkie czytanie man newfs uświadomiło mi co się stało. A dobiła mnie statystyka wyświetlona przez df -hi.
Rzeczywiście, wyczerpała się pula inodów i mimo, że miejsce na dysku było, filesystem nie mógł przydzielić im miejsca adresowego.

Odmontowałem partycję i ponownie zainicjowałem za pomocą newfs tym razem tak:

# newfs -b 4096 -i 2k sd1a

Tak dal pewności ustawiłem mały rozmiar bloku, bo plików na tej partycji będzie dużo ale będą małe, w ten sposób chyba mniej miejsca zmarnują. Rozmiar i-noda ustawiłem na najmniejszą wartość czyli 2 kilobajty, coby ich wbród było.

Chyba pomogło... ;-)