Senin, 05 Januari 2015

FUSE ( FILESYSTEM IN USERSPACE)

FUSE merupakan mekanisme sistem operasi untuk sistem operasi Unix-like yang memungkinkan penggunna tidak ber-hak istimewa menciptakan file system mereka sendiri tanpa mengubah kode kernel. FUSE berguna untuk menulis virtual file system. virtual file system benar-benar menyimpan data itu sendiri. mereka bertindak sebagai pandangan atau terjemahan dari file system yang ada atau storage device.




 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 fusemount. Setelah menerima file handle untuk /dev/fuse dari fusermount, kirim file handle tersebut ke fuse_main()
  • fusemount(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 menyimpan 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. 
Beberapa isi struct fuse_operations :
  1. int (*getattr) (const char *, struct stat *); Mendapatkan file atribut
  2. int (*readlink) (const char *, char *, size_t); Baca target link simbolik
  3. int (*mknod) (const char *, mode_t, dev_t); Membuat file node
  4. int (*mkdir) (const char *, mode_t); Membuat direktori
  5. int (*unlink) (const char *); Remove file
  6. int (*rmdir) (const char *); Remove direktori
  7. int (*rename) (const char *, const char *); Rename file
  8. int (*chmod) (const char *, mode_t);  Mengubah bit izin file
  9. int (*chown) (const char *, uid_t, gid_t); Mengubah pemilik dan kelompok file
  10. int (*truncate) (const char *, off_t); Mengubah ukuran file
  11. int (*open) (const char *, struct fuse_file_info *); File open operation.
  12. int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *); Read directory
  13. int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); Read data from an open file
  14. int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *); Write data to an open file
Contoh FUSE :





Ganti bagian static const char *dirpath = "/home/kromatin/Downloads" dengan static const char *dirpath = "/home/[nama user kalian]/Downloads"

Simpan kemudian compile dengan menggunakan perintah: gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file]



 

Selain itu FUSE dapat dimodifikasi misalnya dengan memodifikasi fungsi mkdir pada program diatas dengan menambahkan system("notify-send hello") maka akan muncul notifikasi dibagian kanan atas ketika fungsi mkdir dijalankan. 
 
Compile dengan cara yang sama seperti diatas. Maka outputnya seperti dibawah ini
 
Thank you.. :) :) :)