Monday, January 5, 2015

FILESYSTEM in USERSPACE (FUSE) in Linux by C Language

Unknown
Filesystem atau dalam bahasa Indonesia lebih dikenal sebagai Sistem Berkas merupakan tempat pengorganisasian data pada sebuah komputer. Merupakan sebuah struktur logika yang digunakan untuk mengendalikan akses terhadap data pada Secondary Storage pada komputer.

Ada berbagai jenis file system, mungkin yang banyak kita kenal adalah FAT32, ext4, ext3, etc.

Virtual File System <VFS>

Sistem operasi yang modern adalah sistem operasi yang mampu mengimplementasikan berbagai sistem berkas dengan tipe yang berbeda dalam waktu yang bersamaan. Salah satu solusinya adalah dengan menggunakan VFS.

Ide dari VFS adalah meletakkan informasi di kernel untuk merepresentasikan keseluruhan tipe sistem berkas dan juga terdapat sebuah fungsi untuk setiap operasi yang dimiliki sistem berkas.

VFS berbeda dengan file system tradisional yang menyimpan data ke disk dan mengambilnya langsung dari disk. VFS bertindak sebagai pandangan/terjemahan dari file system yang sudah ada.

Filesystem in Userspace (FUSE)

FUSE sendiri memungkinkan pnegguna untuk menciptaka file system mereka sendiri tanpa mengubah kode kernel.

Bagaimana caranya?Dengan menjalankan kode file system di userspace dan modul FUSE akan menyediakan "jembatan" untuk antarmuka kernel.

FUSE berguna untuk menulis VFS.


 Modul FUSE kita yang nanti akan kita buat, akan dapat dihubungkan dengan suatu folder yang ada di filesystem milik kita dengan cara di mount.

NB: UNTUK MENJALANKAN FUSE INI KITA PERLU INSTALL DULU DI SISTEM OPERASI MASING-MASING!

Link download fuse: Fuse (bagian stable release)

(Proses install di S.O. diserahkan kepada user masing-masing)

Cara Kerja FUSE:
  • fuse_main() (lib/helper.c) = sebagain fungsi main (userspace), program user memanggil fungsi fuse_main() kemudian fungsi fuse_mount() dipanggil.
  • fuse_mount() (lib/mount.c) = menciptakan UNIX domain socket, kemudian di fork dan menciptakan child process yang menjalankan fusermount
  • fusermount() (util/fusermount.c) = untuk mengecek apakah modul FUSE sudah di load. Kemudian membuka /dev/fuse dan mengirim file handle melalu UNIX domain socket kembali ke fungsi fuse_mount()
  • fuse_new() (lib/fuse.c) = menciptakan struktur data yang berisi ruang yang digukanan untuk menyimpan data file system
  • fuse_loop() (lib/fuse.c) = membaca file system calls dari /dev/fuse

 Ini adalah beberapa fungsi yang disediakan oleh FUSE dan akan berguna kita pakai nantinya:
  1. int (*getattr) (const char *, struct stat *);
    Get file attributes.
  2. int (*readlink) (const char *, char *, size_t);
    Read the target of a symbolic link
  3. int (*mknod) (const char *, mode_t, dev_t);
    Create a file node. 
  4. int (*mkdir) (const char *, mode_t);
    Create a directory.
  5. int (*unlink) (const char *);
    Remove a file
  6. int (*rmdir) (const char *);
     Remove a directory
  7. int (*rename) (const char *, const char *);
    Rename a file
  8. int (*chmod) (const char *, mode_t);
    Change the permission bits of a file
  9. int (*chown) (const char *, uid_t, gid_t);
    Change the owner and group of a file
  10. int (*truncate) (const char *, off_t);
    Change the size of a 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
IMPLEMENTASI
Kita harus deklarasikan fungsi-fungsi itu di struct dulu
main dari fuse yang kita bikin










fungsi yang mau di implementasikan
Program di atas ketika dijalankan akan mampu me-ngemount ke path yang ada di atas. Setelah program dijalankan maka folder dari path akan terubung ke /tmp/fuse kita yang tadi kita buat. Pada saat itu, kita tidak dapat melakukan apa-apa, tetapi karena kita punya dua fungsi yaitu rmdir dan mkdir maka kita dapat membuat dan menghapus direktori di folder tersebut yang juga akan terupdate di folder yang kita mount tadi.

Conclusion:
Dengan menggunakan FUSE, pengguna dapat menciptakan sistem berkasnya sendiri dengan berbagai modifikasi (misal tidak bisa membuka file/tidak dapat dapat mengedit file) tanpa mengubah kode kernel. 











Powered by Blogger.

Text

Popular Posts