- Ders amaçlı dosya sistemi projesi ile ChiPy sunum hazırlıkları kesişince, Python ile FUSE tabanlı dosya sistemini adım adım oluşturan bir GitLab rehberi başlatıldı
- Derste kullanılan FIUnamFS, ardışık dosya ayırma kullanan, alt dizin desteği olmayan ve 1,44 MB disket boyutuyla sınırlı bir oyuncak dosya sistemi
- Altı dönem boyunca her dönem 30-40 öğrenciye ödev verilmesine rağmen FUSE implementasyonu teslim eden yalnızca bir öğrenci olduğu için, takip etmesi kolay Python FUSE materyallerine duyulan ihtiyaç arttı
- Yeni rehber, boş bir dosya sisteminden başlayıp sistem çağrılarını ve özellikleri ekleyen kademeli ödev biçiminde; RAM tabanlı okuma/yazma ve salt okunur passthrough implementasyonuna kadar konuları kapsıyor
- DNS, Markdown’ın anında derlenmesi, unzip ve yorumları kaldıran dosya sistemi gibi kısa örnekler de yer alıyor; böylece öğrenciler pratik örneklerle FUSE öğrenebiliyor
Ders projesinden doğan Python FUSE rehberi
- DebConf22’de Chicago Python User Group için sunum teklifi aldıktan sonra, DebConf24’te konu tekrar gündeme gelince Python sunumu için bir tema aranmaya başlandı
- Python’u ana dil olarak görmese de, öğrencilerin en iyi takip edebildiği dil olduğu için derste Python kullanılıyor
- Ders projesi olan FIUnamFS, “Facultad de Ingeniería, Universidad Nacional Autónoma de México”nun kısaltmasıdır ve Meksika Ulusal Özerk Üniversitesi Mühendislik Fakültesi derslerinde kullanılan bir dosya sistemidir
- Ardışık dosya ayırma temel alınır
- Alt dizinleri desteklemez
- Genellikle 1,44 MB disket boyutuyla sınırlıdır
- Belirtimi ve implementasyonu kolay bir oyuncak dosya sistemi olarak kullanılır
- Öğrencilerden basit bir menüden daha rafine bir arayüz oluşturmaları istenmişti; kullanıcıların farkında olmadan FIUnamFS kullanabilmesi için FUSE’un uygun olduğu düşünüldü
- Bu proje altı dönem boyunca dönem başına 30-40 öğrenciye verilmiş olsa da, gerçek bir FUSE implementasyonu teslim eden yalnızca bir öğrenci oldu
Mevcut materyallerin sınırları ve seçenekler
- Python FUSE örnekleri ve yazıları zaten vardı, ancak tek başına takip etmek için yetersiz kalan ya da eskimiş çok sayıda kaynak bulunuyordu
- Python’da kullanılabilecek FUSE arayüzü de tek bir standartta birleşmediği için nereden başlanacağını seçmek zorlaşıyor
GitLab rehberinin yapısı
- Yeni GitLab projesi a hand-holding guide to writing FUSE-based filesystems in Python, çalışan çeşitli FUSE dosya sistemi implementasyonlarını adım adım gösteriyor
- Bazıları RAM tabanlı çalışıyor
- Bazıları passthrough tabanlı implemente ediliyor
- FIUnamFS gibi implementasyonlar için sözde blok aygıtı tabanlı dosya sistemleri de eklenmesi planlanıyor
- Şu anda beş kademeli dosya içeriyor; en basit boş dosya sisteminden başlayıp sistem çağrılarını ve özellikleri tek tek ekliyor
- Öğrencilerin ilgisini çekebilecek kısa ve kullanışlı örnekler de yer alıyor
- Örnekler onlarca satır düzeyinde olduğu için derste ele alınmaları kolay;
uncommentfsise yorumları ve boşlukları otomatik olarak kaldırıyor
Sunum takvimi ve açık materyaller
- ChiPy sunumu 10 Ekim 2024 saat 18:30 GMT-6’da çevrim içi yapıldı
- Aynı konunun Jornadas Regionales de Software Libre ve nerdear.la’da da sunulması planlanıyor
- Sunumdan sonra video da yayımlandı
- ChiPy sunum videosu: A hand-holding guide to writing FUSE-based filesystems in Python
- İspanyolca sunum videosu: Aprendiendo y enseñando a escribir sistemas de archivo en espacio de usuario con FUSE y Python
1 yorum
Hacker News yorumları
libfuse GitHub’ındaki [0] içinde C/C++ için örnekler karmaşıklık düzeyine göre iyi düzenlenmiş
passthrough.c mevcut dosya sistemini yansıtıyor ama “performansı berbat” deniyor; passthrough_fh.c içinse “o kadar kötü değil” denmiş
passthrough_ll.c düşük seviyeli API ile uygulanmış ve “üçü arasında en az kötü olanı” deniyor; passthrough_hp.cc ise C++ ile yazılmış yüksek performanslı sürüm
Not ettiğim ilginç FUSE projeleri arasında büyük dosyaları bölme [1], ZFS artımlı anlık görüntülerini dosya olarak gösterme [2], şeffaf dosya sistemi sıkıştırması [3], arşivleri dosya sistemi olarak mount etme seçenekleri [4], [5] var
[0] https://github.com/libfuse/libfuse/tree/master/example
[1] https://github.com/seiferma/splitviewfuse
[2] https://github.com/UNFmontreal/zfs_fuse_snapshot
[3] https://github.com/FS-make-simple/fusecompress
[4] https://github.com/google/fuse-archive
[5] https://github.com/mxmlnkn/ratarmount
Her veri kümesinin mount noktasında
ls -Aile bile görünmeyen gizli bir.zfsklasörü var; var olduğuna inanıp doğrudancdetmeniz yeterliOnun altında
snapshotklasörü bulunur; içinde de ilgili veri kümesinin her anlık görüntüsü için klasörler ve anlık görüntüdeki dosyalar yer alırÖrneğin zrepl_20241011_010143_000 anlık görüntüsündeki
/etc/hosts,/.zfs/snapshot/zrepl_20241011_010143_000/etc/hostskonumundadırBu sihirli gizleme davranışını sevmiyorsanız
zfs set snapdir=visibleile normal bir klasör gibi görünmesini de ayarlayabilirsinizİlgili bağlantıları görmek güzel; bu konudaki sezgilerim biraz paslandı, faydasını gördüğünüz FUSE eğitimleri veya rehberleri varsa almak isterim
FUSE’u seviyorum ama tek seçenek değil; yakın zamanda 9p protokolü ile sanal bir dosya sistemi uygulamayı denedim ve epey eğlenceliydi
Hatırladığım kadarıyla py9p kullandım ve Python deneyimi fuse-python’dan çok daha iyiydi
İsterseniz 9pfuse ile 9p servisini FUSE üzerinden mount edebilirsiniz, ama ben kernel v9fs istemcisini kullandım
Amacınız sadece dosya sistemini ağın ötesine taşımaksa sanırım diod 9p sunucusunu kullanmıştım; genel olarak göz atmaya değer küçük bir ekosistem
Notlarım [1]’de, ama çoğu özgün kaynak bağlantılarından oluşan bir derleme
FUSE da iyi ama 9P daha genel amaçlı; Windows dahil birçok yerde kaliteli uygulamaları var
Yine de 9p’nin performans özelliklerinden emin değilim; yavaş olduğuna dair şeyler gördüm ama kesin bir kaynak görmedim
Benchmark veya bilgi var mı merak ediyorum
[0]: https://github.com/chaos/diod/blob/master/protocol.md
[1]: https://athenaeum.wiki/Zettelkasten/9p
Büyük dosyaları önce indirmeden, yerel dosya gibi rastgele okumak istiyordum
Yaşadığım sıkıntılardan biri FUSE’un blok boyutunun çok küçük olmasıydı; bu yüzden arka uca giden HTTP çağrılarında gecikme ve churn arttı, oldukça karmaşık bir önbellekleme/önceden okuma mantığı gerekti
Kernel’in önceden okuma mantığı hiç çalışmıyor gibi görünüyordu; o dönemde onu yönlendirmenin yolunu bulamamam dışında konuyu derinlemesine araştırmadım
FAQ’ye https://virtio-fs.gitlab.io adresinden bakabilirsiniz
Yine de harika bir proje
Bir ay önce tam olarak aynı süreçten geçmek zorunda kaldığımda bunu bilmiş olmayı isterdim
Jira’yı daha az sinir bozucu şekilde kullanmaya yönelik çaresiz bir girişim olarak, dahili issue sınıflandırmasını kullanıp bir ağaç oluşturan jira-as-filesystem projesini düşündüm
Dizinlerin issue’ları, dosyaların issue alanlarını, alt dizinlerin de bağlantılı issue’ları temsil etmesini sağladım ve sonunda fuse-python’ı seçtim
Bir süredir üzerinde çalışamadım ama daha şimdiden soyutlamada sorun çıktı
Dizin adı olarak yalnızca issue ID’sini kullanınca otomasyon kolaylaşıyor; fakat
lsyaptığınızda yalnızca anlaşılması zor ID’lerden oluşan bir yığın gördüğünüz için insanların gezinmesi zorlaşıyor. Bu yüzden issue ID’sinin arkasına slug’laştırılmış özeti ekleyen paralel bir-with-summarydizin türü ekledimOrijinal dosyalar için bir jira-as-filesystem olur; insanların gezinip etkileşime girmesi içinse aynı dosyaları ilgili birçok konuma birden çok bağlantı olarak yerleştiren bir sembolik bağlantı ağacı kullanılır
Yeterince anlamadığım için gereksiz yere fazladan katman ekliyor olabilirim, ama teknik olarak az önce bahsettiğin soyutlama sorununu çözebilir gibi görünüyor
Modern Linux’ta diskler hem blok aygıtı hem de UUID ile referanslandığı için bu yaklaşımın uygun ve beklentilere de uyduğunu düşünüyorum
Yine de kişisel olarak JIRA’nın kendisi zaten yeterince karmaşık olduğu için kullanacağımı sanmıyorum
Örnek: https://github.com/coddingtonbear/jirafs
1234-human-sensegibi yapsan olmaz mı?İki tür bilgiyi de içeriyor ve ayrıştırması da kolay görünüyor
FUSE mount seçenekleri gerçekten çok fazla; her birinin ödünleşimleri, performansı ve özellikleri farklı
s3fs, goofys, seaweed, minio, Google Drive vb. de var; JuiceFS ise nesne depolamayı mount edip geleneksel bir dosya sisteminden beklenen metaverilerle POSIX tarzı erişim sağlamak için oldukça ilginç
https://juicefs.com
Güzel
Buna yakın bir soru olarak, son zamanlarda daha yaygın desteklenen bir protokol olduğu için NFS tabanlı dosya sistemleri uygulandığını görüyorum
rclone Mac’te bunu yapıyor gibi; bu yaklaşıma dair bir rehber ya da karşılaştırma var mı?
Neredeyse bire bir alternatif gibi çalışıyor, kernel extension gerektirmiyor, arka planda bir NFS sunucusu açıp macOS özellikleriyle mount ediyor
Performansı da oldukça iyi
Bitmiş ürünün nasıl göründüğünü görmek istiyorsanız, sanal dosya sistemi olan müzik yöneticisi azuline/rosé’ye bakabilirsiniz
Çok sayıda yorum, açıklama, tip ve test içeren harika bir kod tabanı; öğrenmesi kolay olacaktır
https://github.com/azuline/rose
FUSE ile ilgileniyorsanız, kardeş proje sayılabilecek CUSE da ilginizi çekebilir
CUSE, kullanıcı alanında karakter aygıtı sürücüsü emülasyonudur; yeni bir kernel modülü derlemeden donanımı taklit etmenizi sağlar
Yakın zamanda Python ile IOCTL destekleyen bir donanım aygıtı yazmak için kullandım
Kolayca çalışan iyi bir Python kütüphanesi de bulamadım, dokümantasyon da yetersizdi; ama sonunda yalnızca ctypes FFI kütüphanesiyle yazmak yeterli oldu
Kernel sürücüsü yazma deneyimi olmayan biri olarak hemen sezgisel gelmeyen tek kısım, IOCTL’ın her okuma/yazma için tampon boyutunu yeniden ayarlaması gerektiğinden çağrıların çiftler hâlinde gelmesiydi
Neyse ki CUSE’ta tüm giriş/çıkış baytlarını gösteren bir debug modu var
CUSE aslında kullanıcı alanında ses aygıtları oluşturmak için uygulanmıştı¹; ama özel TTY gibi amaçlarla da kullanıldı, ben de sanal bir SPI aygıtı yapmak için kullandım
Birilerine faydalı olmasını ve bu projenin daha çok ilgi görmesini isterim
¹ https://lwn.net/Articles/308445/
Epey uzun zaman önce dokuwiki adlı wiki sistemiyle etkileşim kurmak için Python FUSE dosya sistemi[1] yazmıştım
hde llfuse[2] üzerine kurmuştum; dokuwiki ile doğrudan ilgili olmayan oldukça fazla düşük seviyeli API uygulamam gerekti
Bu yüzden dokuwiki uygulamasından bağımsız kısımları saran bir wrapper olarak easyfuse[3][4]’ü yaptım; FUSE sistemi yapmayı düşünüyorsanız göz atmaya değer
[1]: https://github.com/JelteF/dokuwikifuse
[2]: https://pypi.org/project/llfuse/
[3]: https://pypi.org/project/easyfuse/
[4]: https://github.com/JelteF/easyfuse
Sonuçta dokuwiki temelde bir metin dosyaları kümesi; NFS ile mount etmek ya da Dropbox/Syncthing ile paylaşmak daha basit ve verimli olmaz mı?
FUSE’u, Makefile’ın keyfî kaynaklar üzerinde yönlü döngüsüz grafik tanımlayabilmesini sağlayan bir yöntem gibi düşünebilirsiniz
Örneğin k8s kümesinin durumunu açığa çıkaran bir FUSE dosya sistemi varsa, benim gibi basit düşünen biri için bile erişilebilir operatörler yazmak kolaylaşabilir
E-posta için de benzer şekilde, IMAP’i dosya sistemi olarak açığa çıkarırsanız RAG uygulamaları (gpt4all gibi) her şeye doğrudan erişemez mi?
Konu dışı ama 90’lar/2000’ler havasındaki blogları görünce her zaman ilk gönderi sayfasına giderim
gwolf.org da dâhil; böyle zaman kapsüllerine bakmak hiçbir zaman hayal kırıklığına uğratmıyor