O newfs i kończących się i-nodach
Posted on Tue 29 November 2005 in Ultra1 z NetBSD • 3 min read
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...
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
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
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... ;-)