Bad sektor w dzienniku systemu plików ext4

Spis treści

Parę dni temu opisywałem jak udało mi się realokować uszkodzony sektor z dysku, który już przepracował dość długi okres czasu. Nie było to znowu jakoś specjalnie trudne, z tym, że cały problem dotyczył jakiegoś losowego sektora gdzieś w środku partycji. Jako, że domyślnym systemem plików na linuxie są te z rodziny ext (ext2, ext3, ext4) , oraz, że trzecia wersja tego systemu plików została wyposażona w dziennik (journal), to trzeba by się zastanowić, co w przypadku gdy taki uszkodzony sektor trafi się właśnie w dzienniku tego systemu plików?

Gdzie się kończy dziennik systemu plików ext4

W manualu narzędzia mkfs.ext4 możemy odnaleźć następujące zdanie:

The size of the journal must be at least 1024 filesystem blocks (i.e., 1MB if using 1k blocks, 4MB if using 4k blocks, etc.) and may be no more than 10,240,000 filesystem blocks or half the total file system size (whichever is smaller)

man mkfs.ext4

Zatem dziennik systemu plików ext4 nie może mieć mniej niż 4MiB (domyślnie blok ma 4K) i nie może być większy niż połowa systemu plików na partycji. Ile zatem taki dziennik zajmuje w naszym przypadku? Domyślnie jest to 128MiB , natomiast jeśli nie jesteśmy pewni, to zawsze możemy sprawdzić przy pomocy dumpe2fs :

# dumpe2fs /dev/sda2 | grep ^Journal
dumpe2fs 1.42.13 (17-May-2015)
Journal inode:            8
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             32M
Journal length:           8192
Journal sequence:         0x0000035f
Journal start:            0
2

Zatem w tym przypadku, dziennik zaczyna się na bloku 0 tej partycji i rozciąga się na kolejne 8192 bloki zajmując łącznie 32MiB. Zatem jeśli będzie problem z odczytem jakiegoś sektora poniżej 8192 lub 8192*(4096/512)=65536, w zależności od tego czy dysk posiada sektory 512 czy 4096 bajtowe, wtedy obrywa dziennik systemu plików ext4. Jako, że to na nim się opiera bezpieczeństwo plików, to prawdopodobnie system zacznie sypać błędami próbując odczytać ten dziennik, a to może uniemożliwić nawet start systemu.

Usuwanie i tworzenie dziennika

W przypadku gdyby jednak oberwało się dziennikowi systemu plików ext4, nie ma innej rady jak usunąć go i stworzyć jeszcze raz. Usuwanie dziennika sprowadza się do wydania poniższego polecenia, np. z jakiegoś systemu live:

# tune2fs -O ^has_journal /dev/sda2

Po tym kroku postępujemy dokładnie tak jak w przypadku zwykłego bad sektora. Gdy już realokujemy sektor, trzeba stworzyć dziennik na nowo:

# tune2fs -j /dev/sda2

I to w zasadzie wszystko.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.