Linux'ta bir dosya sistemi sürücüsü sürücüsünü nasıl uygularım? [kapalı]


15

Yeni bir dosya sistemi icat ettiğimi ve şimdi bunun için bir dosya sistemi sürücüsü oluşturmak istediğimi varsayalım.

Bu dosya sistemi sürücüsünü nasıl uygulayabilirim, bu bir çekirdek modülü kullanılarak mı yapılır?

Dosya sistemi sürücüsü sabit diske nasıl erişebilir, dosya sistemi sürücüsü sabit diske erişmek için kod içermelidir veya Linux tüm dosya sistemi sürücüleri tarafından kullanılan sabit diske erişmek için bir aygıt sürücüsü içerir mi?

Yanıtlar:


24

Evet, Linux'taki dosya sistemleri çekirdek modülleri olarak uygulanabilir. Ancak, düzenli bir kullanıcı alanı işleminin bir dosya sistemi sürücüsü gibi davranmasına izin verebilen FUSE (USErspace'deki Dosya Sistemi) arayüzü de vardır. Yeni bir dosya sisteminin prototipini oluşturuyorsanız, önce FUSE arayüzünü kullanarak uygulamak test ve geliştirmeyi kolaylaştırabilir. Dosya sisteminin iç kısımları FUSE formunda çalıştıktan sonra, performansı optimize edilmiş bir çekirdek modülü sürümünü uygulamaya başlayabilirsiniz.

Çekirdek alanı içinde bir dosya sistemi uygulamak hakkında bazı temel bilgiler. Oldukça eskidir (1996'dan itibaren!), Ancak bu en azından yapmanız gereken şeyler için temel bir fikir vermelidir.

FUSE yoluna gitmeyi seçerseniz, burada libuse, FUSE arayüzünün kullanıcı alanı tarafının referans uygulamasıdır.

Çekirdek modülü olarak dosya sistemi sürücüsü

Temel olarak, dosya sistemi sürücü modülünüzün başlatma işlevinin yalnızca bir register_filesystem()işlevi çağırması ve bu işlevi parametre olarak dosya sistemi sürücünüzde dosya sisteminizi tanımlamanın ilk adımı olarak kullanılacak işlevi tanımlayan bir işlev işaretçisi içeren bir yapı vermesi gerekir. yazın ve monte edin. Bu aşamada başka bir şey olmaz.

Bir dosya sistemi bağlanırken ve dosya sistemi türü sürücünüzle eşleşecek şekilde belirtilirse veya dosya sistemi türü otomatik algılama gerçekleştirilirse, çekirdeğin Sanal Dosya Sistemi (kısaca VFS) katmanı bu işlevi çağırır. Temel olarak "İşte, standart bir Linux blok cihazının çekirdek düzeyinde bir gösterimine bir işaretçi. Bir göz atın, işleyebileceğiniz bir şey olup olmadığına bakın ve sonra bana ne yapabileceğinizi söyleyin."

Bu noktada, sürücünüzün dosya sistemi için doğru sürücü olduğunu doğrulamak için ihtiyaç duyduğu her şeyi okuması ve ardından sürücünüzün bu belirli dosya sistemiyle yapabileceği daha fazla işlev için işaretçiler içeren bir yapı döndürmesi gerekir. Veya dosya sistemi sürücüsü diskteki verileri tanımıyorsa, uygun bir hata sonucu döndürmesi gerekir ve daha sonra VFS kullanıcı alanına bir hata bildirir veya - dosya sistemi otomatik algılama yapılıyorsa - başka bir dosya sistemine sorar denemek için sürücü.

Çekirdekteki diğer sürücüler standart blok aygıt arabirimini sağlar, bu nedenle dosya sistemi sürücüsünün donanım desteği uygulaması gerekmez. Temel olarak, dosya sistemi sürücüsü, verilen aygıt işaretçisi ile standart çekirdek düzeyindeki işlevleri kullanarak disk bloklarını okuyabilir ve yazabilir.

VFS katmanı, dosya sistemi sürücüsünün VFS katmanı için bir dizi standart işlevi sunmasını bekler; VFS katmanının dosya sistemiyle anlamlı bir şey yapması için bunlardan birkaçı zorunludur, diğerleri isteğe bağlıdır ve böyle bir isteğe bağlı işleve bir işaretçi yerine NULL döndürebilirsiniz.


1
Bu, soruyu tamamen yanıtlamak için oldukça iyi bir yanıt olsa da, blok cihaz katmanının dosya sistemi katmanının üzerine inşa etmesi için sağladığı işlevsellik hakkında da biraz söylemeniz gerekir.
1919'da kasperd

Ben "burada standart bir blok cihazı için bir işaretçi" bit, ama iyi bir nokta ile ima: Ben bunu genişlettim.
telcoM

Bu cevap, özellikle hangi sırada ne olduğuna dair açıklama ilahi. Tüm "linux nasıl çalışır" için böyle açıklamaları olan bir tür kitap / web sitesi var mı?
Adam Barnes

İlginizi çekebilir Linux Çekirdek Dahili veya Linux Aygıt Sürücüleri, 3. Baskı . Ve elbette, gerçek kaynak kodunu okuma seçeneği var.
telcoM


0

Evet, bu tipik olarak çekirdek modülü olarak yüklenebilen veya çekirdeğe derlenebilen bir çekirdek sürücüsü kullanılarak yapılır.

Benzer dosya sistemi sürücülerini ve burada nasıl çalıştıklarını kontrol edebilirsiniz .

Bu sürücüler büyük olasılıkla depolama aygıtlarına bayt blokları olarak erişmek için dahili çekirdek işlevlerini kullanır, ancak blok aygıtlarındaki ve karakter aygıtları klasörlerindeki sürücülerin maruz kaldığı blok aygıtlarını da kullanabilirsiniz .


0

Bir kullanıcı-arazi dosya sistemi oluşturmak veya bir çekirdek modülü yazmak için sigortayı kullanabilirsiniz. Bir dil seçeneğiniz olduğundan ve çekirdeği (ve dolayısıyla tüm sistemi) çökmeyeceği için sigorta ile yapmak daha kolaydır.

Çekirdek modülleri daha hızlı olabilir, ancak optimizasyonun ilk kuralı şudur: Çalışma kodunu test edene kadar bunu yapmayın. İkincisi şöyle: Çok yavaş olduğuna dair kanıt olana kadar yapmayın. Üçüncüsü: Daha hızlı / daha küçük hale getirdiğine dair kanıtınız yoksa saklamayın.

Ve evet, çekirdeğin zaten donanım için sürücüleri var, bunları yeniden uygulamıyorsunuz.


FUSE'nin performanstan başka önemli dezavantajları vardır: Kök dosya sisteminiz için kullanmak zordur. (Belki bir initrd ile mümkündür, ancak FUSE ikilisi önyüklemeden sonra serbest bırakılamaz çünkü hala ramdisk'ten yürütülecektir.)
Peter Cordes

1
@PeterCordes Serbest bırakılamadı , ancak bu bağlantı kaldırılamayacağı anlamına gelmiyor. Hala bir referans varsa, initramfs'den çıkıp çıkmadığınız ve alttaki ikili silmenizden bağımsız olarak bellekte saklanacaktır.
orman

@forest: doğru, bu nedenle initrd'i sonradan çıkaramazsınız pivot_root, çünkü initramfs'de hala meşgul inode'lar vardır.
Peter Cordes

Bir /initinitramfs tarafından başlatılan normal /init, pivot_root'tan sonra kontrolü gerçek kök FS'lere aktarmak için (sanırım) yürütülür /init. Ancak, kök FS'ye erişim çekirdeğe yanıt veren FUSE işlemine bağlıysa, bir FUSE ikili dosyası yürütme ile değiştirilemez. Belki de ilk olarak pagecache'i hazırlayarak, ancak bu kulağa güvenilir gelmez.
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.