flash bellekteki bir dosyayı güncellemek ve elektrik kesintisi ihtimali

turkuazaga

Kayıtlı Üye
Bir NAND flash bellekte, sistemin yapılandırma bilgilerini içeren bir text dosyası var. Yapılandırma değiştiğinde bu text dosyayı da güncellememiz gerekiyor. Ama şöyle birşey aklıma takılıyor. Tam bu text dosyaya veri yazıyorken elektrikler kesilirse ne olur? Aklıma gelen ihtimaller, flash'daki dosyalama sisteminin bozulması (şu anda JFFS kullanılıyor). Veya dosyanın yarım bilgiler içerecek şekilde kalması. Bu şekilde flash belleklere yazma yapılırken elektrik kesilmesi ihtimaline karşı ne tür tedbirler almak lazım?
 

taydin

Timur Aydın
Staff member
Öncelikle o JFFS filesystem'i hemen kaldır ve onun yerine UBIFS'i devreye al. UBIFS'te, yazma sırasında elektrik kesilmesi durumunda filesystem'in zarar görme ihtimali çok daha düşüktür. UBIFS'in tasarımındaki en önemli kriterlerden birisi bu idi ve yıllar boyu ortaya çıkan sorunlar da giderilmiştir.

Filesystem'i hallettikten sonra, gelelim config dosyasının güncellenmesine. Burada izlenmesi gereken prosedüre şu:
  1. Yeni bir dosya oluşturuyorsun ve bu dosyaya yeni config verilerini yazıyorsun
  2. Yazma işlemi bittikten sonra dosyayı kapatıyorsun.
  3. Yeni dosya ismini, asıl config dosyasının ismini alacak şekilde değiştiriyorsun. Bu aşamada, asıl config dosyası silinmiş oluyor ve yeni dosya, onun yerini alıyor.
İşletim sistemi (yani linux kernel), isim değiştirme işleminin tek adımda bitirileceğini garanti eder. Bu tip tek adımda biten, herhangi bir ara aşamada takılı kalması mümkün olmayan işlemlere "atomic operation" deniyor. O yüzden, bu prosedürü kullanırsan, elektrik kesilmesinin tam olarak nerede meydana geldiğine bağlı olarak, asıl config dosyası ya hiç değişmeden eski haliyle kalır, yada gene doğru bilgileri içeren güncellenmiş duruma gelir. Ama kesinlikle arada bir yerde, verilerin bir kısmı yazılmış bir kısmı yazılamamış durumda kalmaz.
 
Son düzenleme:

turkuazaga

Kayıtlı Üye
UBIFS desteği ekledim kernel'a, image'a da mtd-utils-ubifs ekledim ve yukarıdaki metodu denedim. Bazan yapılandırma dosyasının içini boş olarak buluyorum. Yani yukarıdaki işlem basamaklarını tamamlıyorum sonra da power off on yapıyorum ve yapılandırma dosyasına baktığımda 0 uzunlukta bir dosya olduğunu görüyorum. JFFS'de bu sorun olmuyordu.
 

taydin

Timur Aydın
Staff member
Performans nedeniyle UBIFS sistem hafızasını "cache" olarak kullanır. O yüzden yazma işlemi sonunda herşeyin diske gitmesini sağlaman lazım. Bunun için de hemen yazma işlemi sonunda fsync fonksiyonunu çağırabilirsin.
 
Top