FUSE berguna untuk menulis virtual file system. Tidak seperti file system tradisional yang pada dasarnya menyimpan data ke disk dan mengambil data dari disk, virtual file system tidak benar-benar menyimpan data itu sendiri. Mereka bertindak sebagai pandangan atau terjemahan dari file system yang ada atau storage device.
![]() |
Diagram struktur cara kerja FUSE |
Cara kerja FUSE:
- fuse_main () (lib / helper.c,): FUSE userspace, program user memanggil fungsi fuse_main () yang memparsing parameters (seperti mountpoint, multithreaded), dan fungsi fuse_mount () dipanggil. Setelah itu panggil fuse_new (), mengalokasikan ruang untuk FUSE file system data. Setelah itu fungsi fuse_loop () dipanggil untuk memproses session.
- fuse_mount () (lib / mount.c): menciptakan UNIX domain socket, kemudian di fork dan menciptakan proses-proses child yang menjalankan fusermount. Setelah menerima file handle untuk /dev/fuse dari fusermount, kirim file handle tersebut ke fuse_main ().
- fusermount (util / fusermount.c): untuk mengecek apakah modul FUSE sudah di load. Fusermount kemudian membuka /dev/fuse dan mengirim file handle melalui UNIX domain socket kembali ke fungsi fuse_mount().
- fuse_new () (lib / fuse.c): menciptakan struktur data yang berisi ruang yang digunakan untuk meniympan data file system.
- fuse_loop () (lib / fuse.c) (fuse_loop_mt () (lib / fuse_mt.c)): membaca file system calls dari /dev/fuse, kemudian memanggil fungsi usermode yang disimpan di struct fuse_operations sebelum memanggil fuse_main (). Hasil dari panggilan tersebut ditulis kembali ke file /dev/fuse dimana hasil tersebut dapat di forward kembali ke system calls.
Berikut merupakan beberapa isi struct fuse_operations:
- int (*getattr) (const char *, struct stat *) : Mengambil atribut file
- int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t) : Mengambil directory
- int (*readlink) (const char *, char *, size_t) : Membaca target dari symbolic link.
- int (*mknod) (const char *, mode_t, dev_t) : Membuat node file.
- int (*mkdir) (const char *, mode_t) : Membuat directory.
- int (*unlink) (const char *) : Menghapus file.
- int (*rmdir) (const char *) : Menghapus directory.
- int (*symlink) (const char *, const char *) : Membuat symbolic link.
- int (*rename) (const char *, const char *) : Memperbaharui nama file.
- int (*link) (const char *, const char *) : Menciptakan hardlink ke file.
- int (*chmod) (const char *, mode_t) : Mengubah permission bits file.
- int (*chown) (const char *, uid_t, gid_t) : Mengubah kepemilikan file.
- int (*truncate) (const char *, off_t) : Mengubah ukuran file.
- int (*open) (const char *, struct fuse_file_info *) : Operasi membuka file.
- int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *) : Membaca data dari file yang sudah dibuka
- int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *) : Menulis data ke file yang sudah dibuka.
- int (*release) (const char *, struct fuse_file_info *) : Melepaskan file yang sudah dibuka.
- int (*fsync) (const char *, int, struct fuse_file_info *) : Sinkronisasi isi file.
- int (*utimens) (const char *, const struct timespec tv[2]) : Mengubah akses dan modifikasi waktu dari file dengan resolusi nanosecond.
Perhatikan contoh program berikut :
Penjelasan:
Program diatas merupakan contoh implementasi FUSE, seperti yang dapat dilihat pada awalnya pada folder /tmp/fuse tidak terdapat apa-apa, setelah program dijalankan dengan parameter /tmp/fuse, folder /home/gian/Downloads akan di mount(menempatkan reference) di /tmp/fuse, karena adanya fungsi getattr dan getdir pada program, maka seluruh isi dari /home/gian/Downloads bisa diakses dari /tmp/fuse. Pada contoh program di atas terdapat satu fungsi lagi yang sudah dibuat yaitu mkdir, jika kita menjalankan mkdir pada /tmp/fuse, otomatis folder baru yang dibuat diletakkan di /home/gian/Downloads. (ingat bahwa /tmp/fuse menyimpan alamat dari /home/gian/Downloads). Sebagai informasi kita tidak dapat menjalankan fungsi-fungsi lainnya(seperti mkdir, mknod, dll) di /tmp/fuse jika fungsi tersebut belum diimplementasikan di fuse_operations.
Satu lagi kegunaan dari FUSE adalah kita dapat memodifikasi apa saja yang dapat dijalankan suatu fungsi di fuse_operations, contohnya jika kita memodifikasi fungsi mkdir pada program di atas dengan menambahkan system("notify-send hello") maka ketika fungsi mkdir dijalankan akan muncul notifikasi di bagian kanan atas.
Kesimpulan:
Dengan menggunakan FUSE, pengguna tidak ber-hak istimewa dapat menciptakan file system mereka sendiri dengan berbagai modifikasi tanpa mengubah kode kernel.
Sekian postingan dari saya, terima kasih :)