- Bertepatan dengan proyek sistem berkas untuk kelas dan persiapan presentasi ChiPy, sebuah panduan GitLab untuk membuat sistem berkas berbasis FUSE dengan Python secara bertahap telah dimulai
- FIUnamFS yang digunakan di kelas adalah sistem berkas mainan dengan alokasi berkas kontigu, tanpa dukungan subdirektori, dan dibatasi pada ukuran disket 1,44 MB
- Selama enam semester, tugas ini diberikan kepada 30–40 mahasiswa per semester, tetapi hanya satu orang yang mengumpulkan implementasi FUSE, sehingga kebutuhan akan materi Python FUSE yang mudah diikuti makin besar
- Panduan baru ini berbentuk tugas bertahap yang dimulai dari sistem berkas kosong lalu menambahkan system call dan fitur, mencakup baca/tulis berbasis RAM hingga implementasi passthrough hanya-baca
- Disertakan juga contoh singkat seperti DNS, kompilasi Markdown secara langsung, unzip, dan sistem berkas penghapus komentar, sehingga mahasiswa dapat mempelajari FUSE lewat contoh praktis
Panduan Python FUSE yang Berawal dari Proyek Kelas
- Setelah menerima usulan presentasi dari Chicago Python User Group di DebConf22, topik itu dibahas lagi di DebConf24, sehingga penulis mencari topik presentasi Python
- Meski Python tidak dianggap sebagai bahasa utama, Python digunakan di kelas karena merupakan bahasa yang paling mudah diikuti mahasiswa
- Proyek kelas FIUnamFS adalah singkatan dari “Facultad de Ingeniería, Universidad Nacional Autónoma de México”, yaitu sistem berkas yang digunakan dalam kelas di Fakultas Teknik Universitas Otonom Nasional Meksiko
- Berbasis alokasi berkas kontigu
- Tidak mendukung subdirektori
- Biasanya dibatasi pada ukuran disket 1,44 MB
- Digunakan sebagai sistem berkas mainan yang mudah dispesifikasikan dan diimplementasikan
- Mahasiswa selama ini diminta membuat antarmuka yang lebih rapi daripada menu sederhana, dan FUSE dianggap cocok agar pengguna dapat memakai FIUnamFS tanpa menyadarinya
- Proyek ini telah diberikan selama enam semester kepada 30–40 mahasiswa per semester, tetapi hanya satu mahasiswa yang benar-benar mengumpulkan implementasi FUSE
Keterbatasan Materi yang Ada dan Pilihan yang Tersedia
- Contoh dan tulisan tentang Python FUSE sudah ada, tetapi banyak yang kurang memadai untuk diikuti secara mandiri atau sudah usang
- Antarmuka FUSE yang dapat digunakan di Python juga belum terpadu menjadi satu, sehingga sulit memilih titik awal
Struktur Panduan GitLab
- Proyek GitLab baru a hand-holding guide to writing FUSE-based filesystems in Python memperlihatkan beberapa implementasi sistem berkas FUSE yang berjalan, langkah demi langkah
- Sebagian berjalan berbasis RAM
- Sebagian diimplementasikan berbasis passthrough
- Untuk implementasi seperti FIUnamFS, sistem berkas berbasis perangkat blok semu juga direncanakan akan ditambahkan
- Saat ini ada lima berkas bertahap, dimulai dari sistem berkas kosong paling sederhana lalu menambahkan system call dan fitur satu per satu
- Disertakan juga contoh singkat dan berguna yang dapat menarik minat mahasiswa
- Contoh-contohnya hanya puluhan baris sehingga mudah dibahas di kelas, dan
uncommentfssecara otomatis menghapus komentar dan spasi kosong
Jadwal Presentasi dan Materi Publik
- Presentasi ChiPy berlangsung online pada 10 Oktober 2024 pukul 18.30 GMT-6
- Topik yang sama juga dijadwalkan dipresentasikan di Jornadas Regionales de Software Libre dan nerdear.la
- Video presentasi juga dirilis setelahnya
- Video presentasi ChiPy: A hand-holding guide to writing FUSE-based filesystems in Python
- Video presentasi dalam bahasa Spanyol: Aprendiendo y enseñando a escribir sistemas de archivo en espacio de usuario con FUSE y Python
1 komentar
Komentar Hacker News
Di GitHub libfuse [0], contoh untuk C/C++ tersusun rapi berdasarkan tingkat kompleksitas
passthrough.c memirrorkan filesystem yang ada, tetapi disebut “performanya buruk sekali”, sementara passthrough_fh.c disebut “tidak seburuk itu”
passthrough_ll.c diimplementasikan dengan API low-level dan disebut “yang paling tidak buruk dari ketiganya”, sedangkan passthrough_hp.cc adalah versi berkinerja tinggi yang ditulis dalam C++
Beberapa proyek FUSE menarik yang pernah saya catat antara lain pemecahan file berukuran besar [1], menampilkan snapshot inkremental ZFS sebagai file [2], kompresi filesystem transparan [3], serta opsi untuk me-mount arsip sebagai filesystem [4], [5]
[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
Di titik mount setiap dataset ada folder tersembunyi
.zfsyang bahkan tidak terlihat denganls -A; cukup percaya bahwa folder itu ada lalu langsungcdke sanaDi bawahnya ada folder
snapshot, dan di dalamnya ada folder untuk tiap snapshot dataset tersebut, berisi file-file snapshotMisalnya
/etc/hostsdari snapshot zrepl_20241011_010143_000 ada di/.zfs/snapshot/zrepl_20241011_010143_000/etc/hostsJika tidak suka perilaku tersembunyi yang terasa ajaib seperti ini, Anda juga bisa mengaturnya agar terlihat seperti folder biasa dengan
zfs set snapdir=visibleSenang melihat tautan-tautan terkait ini, dan karena insting saya sudah agak berkarat, saya akan senang menerima tutorial atau panduan FUSE yang pernah membantu
Saya suka FUSE, tetapi itu bukan satu-satunya pilihan; beberapa waktu lalu saya mencoba mengimplementasikan filesystem virtual dengan protokol 9p, dan itu cukup menyenangkan
Seingat saya saya memakai py9p, dan pengalaman dengan Python jauh lebih baik dibanding fuse-python
Jika mau, layanan 9p bisa di-mount melalui FUSE dengan 9pfuse, tetapi saya memakai klien v9fs kernel
Kalau tujuannya sekadar meneruskan filesystem lewat jaringan, rasanya saya pernah memakai server 9p diod; secara keseluruhan ini ekosistem kecil yang layak dilihat-lihat
Catatan saya ada di [1], tetapi sebagian besar hanya kumpulan tautan ke materi asli
FUSE juga bagus, tetapi 9P lebih serbaguna, dan ada implementasi berkualitas baik di banyak tempat, termasuk Windows
Namun saya tidak yakin dengan karakteristik performa 9p; saya pernah melihat cerita bahwa ia lambat, tetapi belum melihat materi yang konklusif
Saya penasaran apakah ada benchmark atau informasi tentang itu
[0]: https://github.com/chaos/diod/blob/master/protocol.md
[1]: https://athenaeum.wiki/Zettelkasten/9p
Saya ingin bisa membaca secara acak seperti file lokal tanpa mengunduh file besar terlebih dahulu
Salah satu rasa sakit yang saya alami adalah ukuran blok FUSE terlalu kecil, sehingga latensi dan churn panggilan HTTP ke backend menjadi besar, dan diperlukan logika caching/prefetch yang cukup rumit
Logika readahead kernel tampaknya sama sekali tidak bekerja, dan saat itu saya tidak menyelidikinya lebih dalam selain tidak berhasil menemukan cara untuk mengarahkannya
FAQ bisa dilihat di https://virtio-fs.gitlab.io
Meski begitu, itu proyek yang keren
Andaikan saya tahu ini sebulan lalu, saat saya harus melalui proses yang persis sama
Dalam upaya nekat agar Jira tidak terlalu menyebalkan untuk dipakai, saya terpikir membuat proyek jira-as-filesystem yang membangun tree menggunakan klasifikasi issue internal
Direktori merepresentasikan issue, file merepresentasikan field issue, dan subdirektori merepresentasikan issue yang tertaut; akhirnya saya memilih fuse-python
Saya belum sempat mengerjakannya lagi untuk sementara, tetapi abstraksinya sudah mulai bermasalah
Kalau nama direktori hanya memakai ID issue, otomatisasi jadi mudah, tetapi saat menjalankan
ls, yang terlihat hanya deretan ID yang sulit dikenali sehingga susah dijelajahi manusia; karena itu saya menambahkan tipe direktori paralel-with-summaryyang menambahkan ringkasan yang diubah menjadi slug setelah ID issueCaranya, satu jira-as-filesystem untuk file asli, lalu untuk dijelajahi dan digunakan manusia ada tree symbolic link yang menempatkan file yang sama sebagai beberapa link di berbagai lokasi terkait
Bisa saja ini menambahkan lapisan yang tidak perlu karena pemahaman saya kurang, tetapi secara teknis tampaknya bisa menyelesaikan masalah abstraksi yang disebutkan tadi
Di Linux modern, disk dirujuk baik sebagai block device maupun UUID, jadi menurut saya pendekatan ini masuk akal dan sesuai ekspektasi
Namun secara pribadi, JIRA sendiri sudah cukup kompleks sehingga sepertinya saya tidak akan memakainya
Contoh: https://github.com/coddingtonbear/jirafs
1234-human-sense?Itu memuat kedua jenis informasi dan tampaknya mudah di-parse
Ada sangat banyak opsi mount FUSE dengan kompromi, performa, dan fitur yang berbeda-beda
Ada juga s3fs, goofys, seaweed, minio, Google Drive, dan JuiceFS cukup menarik untuk penggunaan memasang object storage lalu mengaksesnya dengan cara POSIX yang memiliki metadata seperti yang diharapkan dari filesystem tradisional
https://juicefs.com
Bagus
Sebagai pertanyaan yang berdekatan, belakangan saya melihat ada yang mengimplementasikan filesystem berbasis NFS karena itu protokol yang lebih luas didukung
Sepertinya rclone melakukan ini di Mac; adakah panduan atau materi perbandingan tentang pendekatan ini?
Ia bekerja hampir seperti pengganti, tidak memerlukan kernel extension, membuka server NFS di latar belakang, lalu me-mount dengan fitur macOS
Performanya juga cukup bagus
Jika ingin melihat seperti apa produk yang sudah jadi, lihat manajer musik azuline/rosé yang memiliki filesystem virtual
Codebase-nya bagus, dengan banyak komentar, penjelasan, tipe, dan test, jadi mudah dipelajari
https://github.com/azuline/rose
Jika tertarik pada FUSE, proyek pasangannya, CUSE, juga mungkin menarik
CUSE adalah emulasi driver character device di user space, yang memungkinkan meniru hardware tanpa mengompilasi modul kernel baru
Baru-baru ini saya menggunakannya untuk menulis perangkat hardware yang mendukung IOCTL dengan Python
Saya tidak menemukan library Python yang bagus dan mudah dipakai, dokumentasinya juga kurang, tetapi akhirnya ternyata cukup bisa dibuat hanya dengan library FFI ctypes
Sebagai orang yang belum pernah menulis driver kernel, satu-satunya bagian yang tidak langsung intuitif adalah bahwa IOCTL harus menyesuaikan ulang ukuran buffer pada tiap read/write, sehingga panggilannya datang berpasangan
Untungnya CUSE punya mode debug yang menampilkan semua byte input/output
CUSE awalnya diimplementasikan untuk membuat perangkat suara di user space¹, tetapi juga pernah dipakai untuk hal seperti TTY kustom, dan saya menggunakannya untuk membuat perangkat SPI virtual
Semoga ini berguna bagi seseorang dan proyek ini mendapat lebih banyak perhatian
¹ https://lwn.net/Articles/308445/
Cukup lama lalu saya membuat filesystem FUSE Python[1] untuk berinteraksi dengan sistem wiki bernama dokuwiki
Itu dibuat di atas hde llfuse[2], tetapi saya harus mengimplementasikan cukup banyak API level rendah yang tidak terkait langsung dengan dokuwiki
Karena itu saya membuat easyfuse[3][4] sebagai wrapper yang membungkus bagian-bagian yang tidak bergantung pada implementasi dokuwiki, dan layak dilihat jika Anda berencana membuat sistem FUSE
[1]: https://github.com/JelteF/dokuwikifuse
[2]: https://pypi.org/project/llfuse/
[3]: https://pypi.org/project/easyfuse/
[4]: https://github.com/JelteF/easyfuse
Pada dasarnya dokuwiki adalah kumpulan file teks, jadi bukankah me-mount-nya lewat NFS atau membagikannya lewat Dropbox/Syncthing akan lebih sederhana dan efisien?
FUSE bisa dianggap sebagai cara yang memungkinkan Makefile menentukan directed acyclic graph di atas resource arbitrer
Misalnya, jika ada filesystem FUSE yang mengekspos status cluster k8s, akan lebih mudah menulis operator yang bisa diakses bahkan oleh orang berpikiran sederhana seperti saya
Email juga sama; jika IMAP diekspos sebagai filesystem, bukankah aplikasi RAG (seperti gpt4all) bisa mengakses semuanya secara langsung?
Sedikit keluar topik, tetapi saat melihat blog bernuansa 90-an/2000-an, saya selalu membuka halaman posting pertama
Termasuk gwolf.org; mengintip kapsul waktu seperti itu selalu tidak mengecewakan