Linux

FU to the SE : FUSE

FUSE (Filesystem in Userspace) adalah suatu mekanisme sistem operasi untuk sistem operasi Unix-like yang memungkinkan pengguna dapat menciptakan file system mereka sendiri tanpa mengubah kode kernel. Untuk bisa membuat fuse pastikan Linux terminal kamu sudah terinstall fuse. Bagi yang belum install bisa install dulu, berikut langkah-langkahnya:

-Download FUSE dari http://fuse.sourceforge.net/ pada bagian Download stable release
-Extract file tar.gz dan masuk ke direktori FUSE. (tar –xvzf fuse-2.9.4.tar.gz)
-Lakukan installasi FUSE dengan cara:

  • Gunakan hak akses super user (sudo su)
  • Ketikkan perintah ./configure
  • Ketikkan perintah make
  • Ketikkan perintah make install

– Fuse sudah bisa digunakan

Nah, salah satu pengimplementasian fuse adalah ketika kalian ingin mengaitkan suatu direktori ke direktori yang lain (mount). Dari hasil mount ini kalian bisa menentukan sendiri apa yang akn terjadi, misalnya: hanya bisa menampilkan file isi folder tapi tidak bisa dibuka, file bisa dibuka tapi tidak bisa diedit, file tidak bisa di copy paste, dll tergantung pembuat.

Lihat contoh dibawah, filesystem yang kita buat hanya bisa mengambil atribut file (gettar) dan directory (getdir). Misal kita juga ingin bisa membuat dan menghapus file maka kita perlu untuk mengaktifkan fungsi mkdir dan unlink. Untuk beberapa fungsi  yang lain akan penulis sediakan  ada dibawah.

berikut adalah salah satu contoh nya:

#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/tepe/Downloads";

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);
}

Untuk menjalankan nya ikuti langkah-langkah berikut:

  1. Ganti bagian static const char *dirpath = “/home/tepe/Downloads” dengan static const char *dirpath = “/home/[nama user kalian]/Downloads”
  2. Simpan kemudian compile dengan menggunakan perintah: gcc -Wall [nama file].c `pkg-config fuse –cflags –libs` -o [nama file]
  3. Kemudian buat sebuah direktori, misalnya: /tmp/fuse
  4. Coba jalankan fuse tadi dengan cara: ./[nama file] /tmp/fuse
  5. Maka semua isi direktori /home/[nama user kalian]/Downloads akan dimount ke direktori /tmp/fuse

Coba masuk ke /tmp/fuse dan jalankan perintah ls, maka semua isi direktori tersebut akan ditampilkan.

Di bawah ini ada fungsi readdir dan juga fungsi read.

  • static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi)
    {
        DIR *dp;
        struct dirent *de;
        char fpath[1000];
        sprintf(fpath,"%s%s",dirpath,path);
        (void) offset;
        (void) fi;
        dp = opendir(fpath);
        if (dp == NULL)
        return -errno;
        
        while ((de = readdir(dp)) != NULL) 
        {
             struct stat st;
             memset(&st, 0, sizeof(st));
             st.st_ino = de->d_ino;
             st.st_mode = de->d_type << 12;
             if (filler(buf, de->d_name, &st, 0))
             break;
        }
    closedir(dp);
    return 0;
    }
  • static int xmp_read(const char *path, char *buf,
     size_t size, off_t offset, struct fuse_file_info *fi)
    {
       int fd;
       int res;
       char fpath[1000];
       sprintf(fpath,"%s%s",dirpath,path);(void) fi;
       fd = open(fpath, O_RDONLY);
       if (fd == -1)
       return -errno;
       res = pread(fd, buf, size, offset);
       if (res == -1) 
       res = -errno;
       close(fd);
       return res;
    }
    
    

 

tp

Tinggalkan komentar