JFFS2 Dosya Sistemi

Journalling Flash FileSystem'in 2. versiyonudur. David Woodhouse tarafından geliştirilmiş olup 2.4.10 kernel versiyonundan itibaren Linux kaynak kodu ile birlikte dağıtılmaya başlanmıştır.

Blok tabanlı aygıtlar üzerinde değil, raw flash aygıtlar üzerinde çalışır. Journal desteğiyle çalıştığı için, ani güç kesintilerinden sonra dosya sistemini kararlı bir yapıya döndürebilmektedir. Kendisinden önceki ilk versiyona göre aşağıdaki ek özelliklere sahiptir:

  • NAND flash desteğimo

  • Hard link oluşturabilme desteği

  • Dosya sistemini sıkıştırılmış formda kullanma desteği

  • Performansı artıran yeni garbage collection mekanizması

Dezavantajları

Aşağıda sıralanan temel sebeplerden ötürü JFFS2 kullanımı günümüzde oldukça azalmıştır:

  • Tüm node'ların mount işlemi sırasında taranması ihtiyacı gerektiğinden, flash kapasitelerinin GigaByte seviyelerine ulaşması nedeniyle çok uzun mount süreleri gerektirmesi

  • Çok sayıda küçük dosyanın yazılması durumunda sıkıştırma desteğinin negatif bir etki üretmesi

  • Bellekte her node için bir veri yapısı tuttuğundan kullanılan alan arttıkça bellek kullanımının artması ve performansın düşmesi

  • Tamamen senkron çalışan bir dosya sistemi olduğundan yazma işlemleri doğrudan flash ortama yapılır. Çok sayıda dosya üzerinde küçük değişiklikler yapıldıkça sıkıştırma işlemleri de tekrar yapılır, zamanla fragmentation artar, performans düşer.

Yukarıda sayılan nedenler yüzünden yerini büyük oranda UBIFS'e bırakmasına karşılık, dosya sistemi için ayrılmış alanın çok küçük olduğu senaryolarda (örneğin konfigürasyon işlemleri için 1 MB'lık bir bölüm ayırmış olabilirsiniz), UBIFS overhead'i fazla olduğundan birinci alternatif olmaktadır.

Kullanım

Bir MTD bölümü JFFS2 formatında veri içermese dahi, blok tipi aygıt ismi üzerinden jffs2 türünde doğrudan mount edilmeye çalışıldığında işlem başarılı olur, ancak bu yöntem önerilmez.

Bunun yerine öncelikle ilgili MTD bölümünün flash_erase ile silinmesi gereklidir:

flash_erase /dev/mtd8 0 0

Sonra mount işlemi aşağıdaki gibi gerçekleştirilebilir:

mount -t jffs2 /dev/mtdblock8 /mnt

flash_erase ile yapılan silme işleminin MTD'nin istenilen bölümüne ait karakter aygıt dosyası üzerinden, mount işleminin ise gene MTD'nin aynı bölümüne ait blok aygıt dosyası üzerinden gerçekleştirildiğine dikkat ediniz.

Not: jffs2 dosya sistemi raw flash çiplerine özel üretilmiş olmasına rağmen ilgili MTD bölümünü mount uygulamasına mtdblock emülasyonu üzerinden gösteriyor olmamız, tamamen mount uygulamasının blok tabanlı aygıt arayüzleri ile çalışmasından kaynaklanmaktadır. Mount sonrası jffs2 tarafından mdtblock emülasyon katmanı kullanılmaz.

Yukarıdaki örnekte mount işlemi sonrası /mnt dizini altına kopyalama yapmak suretiyle ilgili bölüme yazılabilir.

Dosya Sisteminin Yazılması

Bir MTD bölümünü flash_erase ile silip jffs2 türünde mount ettikten sonra standart yöntemlerle kopyalama yaparak ilerlemek yerine, dosya sistemini başka bir yerde oluşturup, tüm dosya sistemine ait jffs2 imajını hazırlayıp tek seferde kopyalamak da mümkündür.

Bunun için flash_erase ile ilgili MTD bölümü silindikten sonra, nandwrite ile imajın yazılması sağlanır:

flash_erase /dev/mtd8 0 0
nandwrite -p /dev/mtd8 /tmp/jffs.image

Ardından ilgili bölüm mount edildiğinde, imaj içerisinde yer alan verilere ulaşılabilecektir:

mount -t jffs2 /dev/mtdblock8 /mnt

İmaj Oluşturma

Geliştirme yapılan bilgisayardaki bir dizin hiyerarşisini jffs2 imajına çevirmek için, mtd-utils paketinden çıkan mkfs.jffs2 uygulaması kullanılır. Örnek kullanım:

mkfs.jffs2 -p -n -e 128 -d /dizin -o /tmp/jffs.img
  • -p parametresi ile eraseblock'ların sonuna dek padding yapılması sağlanır.

  • -n parametresi cleanmarker'ların konmaması gerektiğini belirtir. Cleanmarker özel bir JFFS2 node'udur ve blok silme işleminin düzgün tamamlandığını tutmak için kullanılır. NAND flash tiplerinde bu bilgi OOB alanında tutulduğundan cleanmarker node'larını istemiyoruz, NOR flash tiplerinde ise bu gereklidir.

  • -e parametresi ile eraseblock büyüklüğünü belirtiyoruz, kullanılan flash tipine göre doğru değerin ne olduğu öğrenilmelidir. Burada 128 KB verilmiştir.

Erase Block Summary

EBS hesaplamasının temel amacı mount süresinin kısaltılmasıdır.

Temel mantık, özet (summary) bilgilerinin her eraseblock sonunda tutulmasından ibarettir.

Bu sayede mount esnasında tüm node'ların taranmasına gerek kalmaz ve sadece özet bilgiler okunur.

mkfs.jffs2 ile oluşturulan imaj dosyasına summary bilgilerini eklemek için mtd-utils paketinden çıkan sumtool uygulaması kullanılır. Örnek:

sumtool -p -n -e 128 -i /tmp/jffs.img -o /tmp/jffs-summed.img

Bu yöntem hem NOR hem de NAND tipi flash'lar ile çalışmaktadır. NAND flash tiplerinde hız artışı daha çok olur.

Loopback Mount

Geliştirme yapılan PC mimarisindeki bilgisayarda muhtemelen raw flash aygıtı bulunmayacağından ötürü, jffs2 imajını bilgisayarımızda mount etmek için, MTD emülasyon modülünü kullanabiliriz. İzlenmesi gereken adımlar sırasıyla:

  • Eraseblock büyüklüğü bulunur ve byte cinsine çevrilir (128 Kb = 131072 byte)

  • losetup ile imaj dosyasından bir loopback device oluşturulur:

      $ sudo losetup /dev/loop0 /tmp/jffs.image
    
  • mtdblock modülü yüklenir:

      $ sudo modprobe mtdblock
    
  • block2mtd modülü aşağıdaki şekilde yüklenir:

      $ sudo modprobe block2mtd block2mtd=/dev/loop0,131072
    
  • Oluşan mtdblock aygıtı mount edilir:

      $ sudo mount -t jffs2 /dev/mtdblock0 /mnt
    

results matching ""

    No results matching ""