Sabtu, 28 November 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.

Diagram cara kerja fuse
Module kernel FUSE dan FUSE library berhubungan melalui sebuah special file descriptor yang didapatkan dengan membuka /dev/fuse. FUSE kernal module meneruskan request ke aplikasi fuse anda. aplikasi anda memerintahkan fuse cara menjawab request. FUSE kernal module dan FUSE library berkomunikasi lewat file deskriptor spesial yang diperoleh dengan membuka /dev/fuse. file ini dapat terbuka berkali-kali dan file deskriptor yang diperoleh diteruskan ke mount syscall, untuk menyesuaikan deskriptor dengan filesystem mount.

Installasi FUSE:


1. Download FUSE dari http://fuse.sourceforge.net/ pada bagian Download stable release

2. Extract file tar.gz dan masuk ke direktori FUSE. (tar –xvzf fuse-2.9.4.tar.gz)

3. Lakukan installasi FUSE dengan cara :
  • Gunakan hak akses super user (sudo su)

  • Ketikkan perintah ./configure

  • Ketikkan perintah make

  • Ketikkan perintah make install

4. FUSE siap digunakan 


Membuat filesystem sendiri menggunakan FUSE


#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <sys/statfs.h>

static const char *dirpath = "/home/ncc/Documents";

static int xmp_getattr(const char *path, struct stat *stbuf)
{
 int res;
 char fpath[1000];
 sprintf(fpath,"%s%s",dirpath,path);
 res = lstat(fpath, stbuf);

 if(res == -1)
 {
  return -errno;
 }

 return 0;
}

static int xmp_getdir(const char *path, fuse_dirh_t h, fuse_dirfil_t filler)
{
 char fpath[1000];
 if(strcmp(path,"/") == 0)
 {
  path=dirpath;
  sprintf(fpath,"%s",path);
 }
 else sprintf(fpath, "%s%s",dirpath,path);
 int res = 0;
 DIR *dp;
 struct dirent *de;
 dp = opendir(fpath);
 if(dp==NULL)
 {
  return -errno;
 }
 while((de = readdir(dp))!=NULL)
 {
  res = filler(h, de->d_name, de->d_type);
  if(res!=0) break;
 }
 closedir(dp);
 return res;
}

static struct fuse_operations xmp_oper =
{
 .getattr = xmp_getattr,
 //.readlink = xmp_readlink,
 .getdir = xmp_getdir,
 //.mknod = xmp_mknod,
 //.mkdir = xmp_mkdir,
 //.symlink = xmp_symlink,
 //.unlink = xmp_unlink,
 //.rmdir = xmp_rmdir,
 //.rename = xmp_rename,
 //.link = xmp_link,
 //.chmod = xmp_chmod,
 //.chown = xmp_chown,
 //.truncate = xmp_truncate,
 //.utime = xmp_utime,
 //.open = xmp_open,
 //.read = xmp_read,
 //.write = xmp_write,
 //.release = xmp_release,
 //.fsync = xmp_fsync,
 //.readdir = hello_readdir
};

int main(int argc, char *argv[])
{
 return fuse_main(argc, argv, &xmp_oper);
}



Fungsi yang lain dapat ditambah sesuai dengan kebutuhannya.

Silakan dicoba. Semoga bermanfaat....

Tidak ada komentar:

Posting Komentar