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
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....