Minggu, 04 Januari 2015

FUSE(Filesystem in Userspace)

Filesystem in Userspace (FUSE) merupakan mekanisme sistem operasi untuk sistem operasi Unix-like yang memungkinkan pengguna tidak ber-hak istimewa menciptakan file system mereka sendiri tanpa mengubah kode kernel. Hal ini dicapai dengan menjalankan kode file system di userspace, sedangkan modul FUSE hanya menyediakan "jembatan" untuk antarmuka kernel yang sebenarnya.

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
Module kernel FUSE dan FUSE library berhubungan melalui sebuah special file descriptor yang didapatkan dengan membuka /dev/fuse. File ini dapat dibuka berulang kali, dan file descriptor yang didapatkan dilewatkan ke mount syscall, untuk mencocokkan descriptor dengan mounted filesystem.

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 :)

Tidak ada komentar:

Posting Komentar