[RECAPTA] ZFS: i/o error – all block copies unavailable … i FreeBSD nie startuje…

Piątek – trzynastego… W zasadzie taki mógłby być tytuł tego wpisu. Kurier dwa razy z rzędu wywrócił się z paczkami, żonie urwał się front od zmywarki, a kolega odbierając auto po wymianie płynów nie odjechał już z warsztatu, bo strzelił mu pasek rozrządu… Oczywiście natłok piątkowo-trzynastkowych zdarzeń nie mógł też ominąć przynajmniej jednego z serwerów, o czym w ten wyjątkowy piątkowy wieczór jak zwykle poinformował mnie system monitoringu. Po krótkich oględzinach stwierdzam: ping jest, usługi – w tym SSH – nie działają. Szczęśliwie dostępna jest zdalna konsola. Odpalam, loguje… jest – mam ekran i klawiaturę. Login, hasło, szczęśliwie powitał mnie bash. No to sprawdzamy: dmesg -> zwis. Druga konsola:  ps auxw -> zwis. Następna konsola: vmstat -z -> zwis. Niema innej opcji, trzeba restartować.  Mija kilkanaście sekund. W międzyczasie szybkie sprawdzenie na ile aktualna jest kopia zapasowa. Konkluzja: Nie jest źle. Wracamy do pacjenta, który już powinien być uruchomiony, a tu przykra niespodzianka wprost z bootloadera:

FreeBSD/x86 boot
Default: zroot:/boot/kernel/kernel
boot:
ZFS: i/o error - all block copies unavailable

Przyznać muszę, że gdy pierwszy raz zobaczyłem ten błąd byłem równie zaskoczony co poważnie zmartwiony. Z pomocą szczątkowych – dostępnych na wtedy – informacji na szczęście udało mi się postawić diagnozę i znaleźć rozwiązanie problemu, którym na łamach niniejszego bloga chce się z Tobą podzielić. Jeżeli aktualnie problem dotknął Ciebie, to wiem, że chciałbyś jak najszybciej przywrócić serwer do działania. Bez zbędnego przedłużania wykonaj następujące kroki:

Krok 1: Pobierz aktualną wersję mfsBSD z http://mfsbsd.vx.sk/

Opcjonalnie możesz też wykorzystać po prostu tryb Fixit z oficjalnej dystrybucji, ale posługiwanie się mfsBSD jest moim zdaniem wygodniejsze i szybsze.

Krok 2: Zabootuj system z płytki i zaloguj się.

W przypadku mfsBSD dla root’a hasłem jest mfsroot

Krok 3: Wykonaj magiczne polecenia

UWAGA: W moim przypadku nazwa puli ZFS to zroot

# kldload opensolaris
# kldload zfs

# zpool import -R /zroot zroot
# zfs set mountpoint=/ zroot
# cd /zroot

Krok 4: Zwalniamy na dysku nieco miejsca (najlepiej żebyśmy mieli przynajmniej 20GB wolnej przestrzeni)

Krok 5: Jeszcze szczypta magii:

# cd /zroot
# cp -a boot boot2
# mv boot_20151113
# mv boot2 boot
# cd /

# zfs set mountpoint=legacy zroot
# zpool set bootfs=zroot zroot
# zpool export zroot

# reboot

Krok 6: Bootujemy z dysku i trzymamy kciuki… 🙂

Pomogło? Bardzo się cieszę. Ale co właściwie się stało i czemu powyższe polecenia załatwiają temat?

Problemem jest fragmentacja plików w katalogu /boot przy małej ilości miejsca na dysku. Nie wiedząc czemu system nie potrafi wtedy zabootować wyrzucając błąd jak powyżej (lub podobny). Po zwolnieniu miejsca i wykonaniu kopii katalogu /boot do /boot2 otrzymujemy już niepofragmentowaną kopię. Przez „mv” przypisujemy ją z powrotem pod starą nazwę i w ten sposób rozwiązujemy problem.

Jeżeli niniejszy wpis Ci pomógł, zostaw komentarz. Ciekawy jestem jak często ten problem jeszcze się zdarza.

Autor

Rafał Wilk

Administrator systemów Unixowych z 15 letnim doświadczeniem, specjalista od FreeBSD, Windows Admin, inżynier sieci i przedsiębiorca, a prywatnie myśliwy, niedzielny gracz i tata pięcioletniej Nadii.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *