Raspberry Pi bilgisayarında, SD kartın elektronik sisteminde oluşan donanımsal sorunlardan veya kontrolsüz kapanmalardan (enerji kesilmesi) kaynaklı dosya sistemi hataları oluşabilmektedir. Bu hatalar bazen sistemin açılış yapamamasına neden olabilir. Linux’un dosya sistemi hiyerarşik olarak boot block, superblock, inode, dentry ve file gibi mantıksal kısımlardan oluşur. Bu kısımların tamamı disk üzerindeki mantıksal olarak ayrılmış kısımlarda saklanır.
Boot block: Diskin ilk birkaç sektörü üzerine yerleşen bu blok işletim sisteminin ön yüklemesini yapan bootstrap adındaki programın kayıtlı olduğu kısımdır. Bootstrap işletim sistemini tetikleyen basit bir programdır. Boot bloğu hasara uğradığında işletim sistemi başlayamaz ve çoğu durumda neden başlayamadığı hakkında bilgi mesajı da görüntülenemez.
Superblock: Dosya sistemi hakkında en üst düzeyde bilgi tutan ve hiyerarşinin en üstünde yer alan kısmıdır. Temel olarak dosya sisteminin türü, blok boyutu, blok sayısı, boş blok sayısı, inode tablolarının konumu gibi çok önemli bilgileri tutar. Bu nedenle diskin üzerinde birden fazla yedek kopyası bulundurulur. Onarım sırasında, bu kurtarma kayıtlarından faydalanılır.
Inode (index node): Dosyalar ve dizinler hakkında meta bilgileri tutan veri yapılarını işaret eder. Bu veri yapıları dosyanın erişim izinleri, boyutu, sahibi, erişim zamanları, silinme zamanı (dosyalar gerçekte silinmez), dosyanın disk üzerinde bulunduğu bloğun numarası ve dosyanın kilitli olup olmadığı (bir proses tarafından yazılması sırasında kilitlenir) gibi bilgiler içerir. Her dosyanın eşsiz bir inode numarası vardır (index node) ve bu numara inode bloklarında dosya hakkında tutulan veri yapısına erişmek için kullanılır. Yani, ilk akla geldiği gibi dosyaların meta bilgilerine erişmek için dosya ismi yerine inode numarası kullanılır. Inode’ların işaret ettiği veri yapıları içerisinde dosya adları tutulmaz bunun yerine dosya adlarını tutmak için dentry (directory entry) ya da dizin adı verilen yapılar kullanılır. Inode numarasının kendisi ya da işaret ettiği bloğun hasara uğraması durumunda dosya erişilmez olabilir.
Dentry (directory entry): Temel olarak inode ve file bloklarını birbirleri ile ilişkilendiren yapılardır. Dosya adları bu bloklar sayesinde ait oldukları veri (file) blokları ile ilişkilendirilir. Aynı zamanda dizin hiyerarşisi de bu bloklar sayesinde inşa edilir. Her bir dentry bir inode numarasını bir dosya adına ve bir üst dizine eşler.
File (data block): Dosyaların içeriğini oluşturan verilerin tutulduğu bloklardır. Bu bloklar bozulduğunda dosya tamamen veya kısmen kaybedilmiş olur.
Bozulan veri(file) bloklarının onarılması
En sık karşılaşılan durum başlangıcın ilk aşamalarında ekrana basılan “Kernel Panic : VFS :Unable to mount root fs on unknown-block” mesajıdır. Bu mesaj kök (/) dosya sisteminde yer alan bir veri bloğunun okunamadığını ve kök dizinin bağlanamadığını söyler. Böyle bir durumda (Kernel Panic) Raspberry Pi bilgisayarı açılışına devam edemez. Çoğu durumda bu hatayı tamir etmek mümkündür. Bunun için SD kartı, bir kart okuyucu ile başka bir Raspberry Pi bilgisayarına takarak hataları onarmak gerekir. SD kartı taktıktan sonra lsusb komutu ile kartın algılanıp algılanmadığına bakalım:
1 2 3 4 5 6 7 |
pi@raspberry:~ $ lsusb Bus 001 Device 006: ID 14cd:6700 Super Top Card Reader Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub |
Yukarıdaki lsusb çıktısında Super Top Card Reader adında bir USB aygıtının algılandığı gözükmektedir. Linux grafik kipinde çalışırken bir USB depolama aygıtı takıldığında otomatik olarak dosya sistemini bağlamaya çalışır. Linux literatüründe dosya sistemi aygıtları, veriler bloklar halinde okunup yazıldığından blok aygıtlar olarak da bilinirler. Bunu lsblk komutu çıktısından görebilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
pi@raspberry:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 7.4G 0 disk ├─sda1 8:1 1 41.8M 0 part /media/sda1 └─sda2 8:2 1 7.4G 0 part /media/sda2 mmcblk0 179:0 0 7.5G 0 disk ├─mmcblk0p1 179:1 0 41.8M 0 part /boot └─mmcblk0p2 179:2 0 7.4G 0 part / |
Yukarıdaki ekran çıktısında Raspberry Pi’a kart okuyucu ile bağlanan aygıtın, sda aygıt ismi ile ilişkilendirildiği, 1.9GB kapasiteye sahip olduğu ve içerisindeki bölümlerin (sda1 ve sda2) /media/ altındaki dizinler ile ilişkilendirildiği gözüküyor (Bağlanan dosya sistemlerinin detaylı bir listesini görmek için findmnt aracını kullanabilirsiniz). Dosya sisteminin onarımına başlamadan önce bu bağlantıların aşağıdaki gibi kaldırılması gerekir:
1 2 3 |
pi@raspberry:~ $ sudo umount sda1 pi@raspberry:~ $ sudo umount sda2 |
Dosya sistemleri üzerinde otomatik olarak hata taraması yapıp düzeltmek için fsck aracı aşağıdaki gibi çalıştırılabilir:
1 2 3 |
pi@raspberry:~ $ sudo fsck -fp /dev/sda1 pi@raspberry:~ $ sudo fsck -fp /dev/sda2 |
Bozulan superblock’ların onarılması
Daha ciddi dosya sistemi arızalarından birisi de bölüm tablosunun hasara uğramasıdır. Bu hata suberblock adı verilen meta bilgilerinin tutulduğu kayıt alanlarının hasara uğramasından kaynaklanır ve çok sayıda dosya kaybıyla sonuçlanabilir. Böyle bir hasarın çıktısını aşağıdaki dmesg çıktısında da görebilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
pi@raspberry:~ $ dmesg [31497.393080] blk_update_request: critical medium error, dev sda, sector 0 [31497.393090] Buffer I/O error on dev sda, logical block 0, async page read [31499.459741] blk_update_request: critical medium error, dev sda, sector 1 [31500.146394] blk_update_request: critical medium error, dev sda, sector 2 [31498.757486] Buffer I/O error on dev sda, logical block 0, async page read [31498.757540] sda: unable to read partition table[31500.146407] Buffer I/O error on sda, logical block 483312, async page read |
Yukarıdaki dmesg çıktısında, bağlanmaya çalışılan dosya sisteminin 0., 1. ve 2. sektörlerindeki verilerin fiziksel olarak hasara uğraması sonucunda, bölüm tablosunun (dosya yerleşim tablosunu içinde bulunduran alan) okunamadığı ve dosya sisteminin bağlanamadığı anlaşılmaktadır. Dosya yerleşim tablosu diskte kayıtlı dosyalar için çok hayati önemde bilgiler tutan bir tablodur ve disk üstünde superblock adı verilen bloklarda kayıtlıdır.
superblock hasara uğradığında; sadece veri bloğunun (file block) hasarlı olduğu duruma göre meta verisi tutulan birçok dosya kaybedilebilir veya duruma göre dosya sisteminin tamamı erişilmez olabilir. Bu daha ciddi bir hasar türüdür. fsck ile bu hata giderilmeye çalışıldığında işlemin başarısız olduğunu söyleyen aşağıdaki gibi bir uyarı mesajı görüntülenir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
pi@raspberry:~ $ sudo fsck -fy /dev/sda fsck from util-linux 2.29.2 e2fsck 1.43.4 (31-Jan-2017) fsck.ext2: Input/output error while trying to open /dev/sda The superblock could not be read or does not describe a valid ext2/ext3/ext4 filesystem. If the device is valid and it really contains an ext2/ext3/ext4 filesystem (and not swap or ufs or something else), then the superblock is corrupt, and you might try running e2fsck with an alternate superblock: e2fsck -b 8193 <device> or e2fsck -b 32768 <device> |
Bu durumda superblock’ların, yedeklerinin kullanılarak tamirin gerçekleştirilmesi gerekir. Yedek blokların nerede olduğunu görüntülemek için bir dosya sistemi oluşturma aracı olan mke2fs kullanılmalıdır. mke2fs aracı –n seçeneği ile kullanıldığında superblock yedeklerinin adreslerini listeler. Aşağıdaki komutu ve çıktısını inceleyin:
1 2 3 4 5 6 7 8 9 10 11 |
pi@raspberry:~ $ sudo mke2fs -n /dev/sda mke2fs 1.43.4 (31-Jan-2017) Creating filesystem with 483328 4k blocks and 120960 inodes Filesystem UUID: b3ec0c9d-921b-4133-bca4-e683aec0689a Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 |
Çıktıda arızalı superblock’ların 32768, 98304, 163840, 229376 ve 294912 numaralı bloklarda birer yedeklerinin olduğu görülmektedir. Bundan sonra yapılacak işlem yedeklerden biri kullanılarak hasarlı superblock’un yeniden oluşturulmasıdır. Yedeğin oluşturulması için e2fsck aracı aşağıdaki gibi kullanılabilir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
pi@raspberry:~ $ sudo e2fsck -b 32768 /dev/sda e2fsck 1.43.4 (31-Jan-2017) e2fsck: Invalid argument while trying to open /dev/sda The superblock could not be read or does not describe a valid ext2/ext3/ext4 filesystem. If the device is valid and it really contains an ext2/ext3/ext4 filesystem (and not swap or ufs or something else), then the superblock is corrupt, and you might try running e2fsck with an alternate superblock: e2fsck -b 8193 <device> or e2fsck -b 32768 <device> |
Yukarıdaki ekran çıktısı 32768 blok numaralı yedekten kurtarma yapılamadığını söylüyor. Bu durumda –b seçeneğine diğer superblock yedeklerinin blok numaralarını vererek işlemi tekrarlamalısınız.
Hatırlatma: Açılış sırasında dosya sistemi hatalarının otomatik olarak giderilmesini sağlayan ayar için kitabın “Dosya Sistemi Hatalarının Açılışta Otomatik Onarılmasını Sağlamak” başlıklı konusuna bakabilirsiniz.