2010-02-03 33 views
7

Bir üniversite projesi olarak, bir dosya içinden temel bir dosya sistemi uygulamam gerekiyor. Peki bunun için nasıl giderim? Bilmem gereken şeyler neler? Gereksinimler arka planda bir daemon sürecine sahip olmayı içerir. Ayrıca bu sistemi kullanan uygulamalar, aşağıdaki yeteneklere sahip olmalıdır bir Unix alan soketiTemel dosya sistemi uygulama

dosya sistemini kullanarak sunucusuna bağlanmak gerekir: boyutlarıyla birlikte saklanan

  1. Listesi dosyalarını. o yardımcı olabilir
  2. oluşturma dosyaları
  3. Dosyaları sil
+0

Burada bazı varsayımlar yapabilir miyiz: Gerçek bir dosya sistemi oluşturmuyoruz: yani, şeyleri görmek için normal ls veya dir komutlarını kullanmayı beklemiyoruz. Bunun yerine dosyaları bir soket üzerinden özel bir arabirim üzerinden gösteren bir hizmet uyguluyoruz. Hem sunucuyu hem de istemci kütüphanelerini yazıyoruz. Sunucu verileri tek bir dosyada saklanır. Bu doğru mu? –

+0

Benzer biraz daha genel soru: http://stackoverflow.com/questions/4714056/how-to-implement-a-very-simple-filesystem –

cevap

0

Bunu yapmanın en basit yolu, verileri depolamak için bir şablon oluşturmak ve dosyaları ram'a ayırmak, elbette ki bu en verimli değil.

şey gibi ... diğerinin

BAZI/YER/Dosya adı >>> burada dosyanın içerikleri, falan filan < < < BAZI/DİĞER/YER/File2Name >>> içerikleri regex >>> biten tüm satırları bulmak kullanarak, bir dizin dışarı listelemek için buraya < < <

sonra

dosyası, daha sonra (aranan klasördeki eğik çizgiler sayısına dayalı) X. eğik çizgi kadar ayrıştırın ve doBüyük/küçük harf duyarlı bir arama olup olmadığını, büyük/küçük harfe duyarlı olup olmadığına göre. Tabii ki, onu belleğe yüklemekten bahsettiğim gibi, muhtemelen bir çok daha basit olan bir anahtar-değer hashtagini araştırabilirsiniz.

1

Bir dosya sistemi, dosyalar için bir veritabanıdır. İhtiyacınız olan temel şey bayt ofsetlerini ve dosya uzunluklarını saklamak için bir arama tablosu. Dosya adları ayrıca tabloda saklanabilir veya her ofsette ilk birkaç bayta depolanabilir. Dosya sisteminizi sabit bir boyutta yaparsanız, çok daha kolay olacaktır.

Bu, FAT dosya sisteminin nasıl çalıştığıyla benzer olacaktır.

http://en.wikipedia.org/wiki/Database_storage_structures da en düşük düzeyde dosya sistemleri ve veritabanları çok benzer olduğundan bir göz atabilirsiniz.

3

Burada, yüceltilmiş bir paylaşılan bellek bölümü (xenstore) tarafından desteklenen çok temel bir FUSE uygulamasının an example'u var. Onun sürdürdüğüm orijinal xenstore FUSE dosya sisteminin bir çatalı.

Ayrıca, FUSE uygulamalarında hata ayıklama yaparken Valgrind'in nasıl daha fazla yardımcı olacağını göstermek için bir kod da bulacaksınız.

açabilir oluşturmak// okuma/yazma/truncate için fonksiyonları yazma/getattr/vs ve (satır numaraları bağlantılı örnekten vardır) onları kaynaştırmak geçmek:

343 static struct fuse_operations const xsfs_ops = { 
    344 .getattr = xsfs_getattr, 
    345 .mknod = xsfs_mknod, 
    346 .mkdir = xsfs_mkdir, 
    347 .unlink = xsfs_rm, 
    348 .rmdir = xsfs_rmdir, 
    349 .truncate = xsfs_truncate, 
    350 .open = xsfs_open, 
    351 .read = xsfs_read, 
    352 .write = xsfs_write, 
    353 .readdir = xsfs_readdir, 
    354 .create = xsfs_create, 
    355 .destroy = xsfs_destroy, 
    356 .utime = xsfs_utime, 
    357 .symlink = xsfs_symlink, 
    358 .init = (void *)xsfs_init 
    359 }; 

Gördüğünüz gibi, onun son derece kendini açıklayıcı. Küçük bir arama, FUSE uygulamalarının da birçok temel dosya destekli örneğini bulmaya neden olur.

Çekirdeğe yeterince aşina olmak için yeterli zamanınız olmadıkça, tamamen kullanıcı alanında yapmanız önerilir.

İlgili konular