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