Sabtu, 28 November 2015

FUSE Bukan Penggabungan

Belajar Sistem Operasi #4

FUSE (Filesystem in UserSpacE)

Apa itu FUSE?
Sebuah mekanisme di sistem operasi Unix yang memungkinkan pengguna tidak ber-hak istimewa menciptakan file system mereka sendiri tanpa mengubah kode kernel dengan menjalankan kode file system di userpace, sedangkan modul FUSE hanya untuk menjembatani antarmuka kernel. Singkat cerita, FUSE ini seperti kita misalnya membuka file /home tapi di sebuah direktori berbeda.

Cara membuat FUSE
Untuk membuat FUSE kita harus menginstall modul FUSE terlebih dahulu.
Berikut langkah langkahnya :
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 :
    a. Gunakan hak akses super user (sudo su)
    b. Ketikkan perintah ./configure
    c. Ketikkan perintah make
    d. Ketikkan perintah make install
4. FUSE siap digunakan

Setelah kita sudah menginstall FUSE, barulah kita membuat modul FUSEnya:

#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/satria/Documents";

char address[1000];

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)
{
    DIR *dp;
    struct dirent *de;
    int res = 0;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    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 int xmp_mknod(const char *path, mode_t mode, dev_t rdev)
{
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    res = mknod(fpath, mode, rdev);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_chmod(const char *path, mode_t mode)
{
    int res;

    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    res = chmod(fpath, mode);
    if(res == -1)
        return -errno;

    return 0;
}

static int xmp_open(const char *path, int flags)
{
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    res = open(fpath, flags);
    if(res == -1)
        return -errno;

    close(res);
    return 0;
}

static int xmp_read(const char *path, char *buf, size_t size, off_t offset)
{
    int fd;
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    strcpy(address,path);
    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;
}

static int xmp_write(const char *path, const char *buf, size_t size, off_t offset)                                                                //saat write file
{
    int fd;
    int res;
    int res1;
    char fpath[1000],temp1[1000];

    sprintf(fpath, "%s%s", dirpath, path);
    fd = open(fpath, O_WRONLY);
 
    sprintf(temp1, "%s%s", dirpath, address);
    res1 = chmod(temp1, 0000);
    if(res1 == -1)
        res1 = -errno;

    if(fd == -1)
        return -errno;

    res = pwrite(fd, buf, size, offset);
    if(res == -1)
        res = -errno;

    close(fd);
    return res;
}

static struct fuse_operations xmp_oper = {
.getattr = xmp_getattr,
.getdir = xmp_getdir,
.mknod = xmp_mknod,
.chmod = xmp_chmod,
.open = xmp_open,
.read = xmp_read,
.write = xmp_write,

};

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

Seperti itu kodingan FUSE nya, untuk modul dan dokumentasi lainnya bisa diliat di internet tentang dokumentasi FUSE.
Pada kodingan diatas, modul FUSE yang dibuat adalah untuk mengunci file yang sudah pernah dikopi.

Modifikasi dan Menjalankan FUSE
  • Ganti bagian static const char *dirpath = "/home/satria/Documents" dengan static const char *dirpath = "/home/[nama user kalian]/Documents"
  • Simpan kemudian compile dengan menggunakan perintah: gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file] 
  • Kemudian buat sebuah direktori, misalnya: /tmp/fuse
  • Coba jalankan fuse tadi dengan cara: ./[nama file] /tmp/fuse
  • 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. Dan jika file dikopi maka file tersebut dikunci.
 Sekian belajar sisop kita kali ini. Semoga bermanfaat #FUSE

Tidak ada komentar:

Posting Komentar