Sabtu, 28 November 2015

Mengenal Kerumitan Komputer dengan FUSE

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.




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.


Nggak ngerti? Singkatnya FUSE adalah suatu source code di mana dengan source code itu kita bisa nge-mount suatu folder ke dalam direktori system (yang seharusnya nggak bisa diutak-atik).  Berikut ini adalah komponen-komponen penting dalam FUSE.


1.  Alamat direktori yang ingin di-mount
***
Tentunya harus ada alamat folder yang akan di-mount. Alamat ini bersifat absolut alias tidak relatif. Source codenya seperti di bawah ini :

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

2. Fungsi get attribut
***
Fungsi ini bertujuan untuk mendapat info-info penting mengenai direktori, seperti kapan dibuatnya, ukuran, kapan terakhir di-update, dan sejenisnya.
Source codenya seperti di bawah ini :

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

3. Fungsi getdir
***
Fungsi ini bertujuan untuk mendapatkan direktori-direktori yang ada di dalam direktori yang di-mount.
Source codenya seperti di bawah ini :

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

4. Fungsi read
***
Fungsi ini digunakan untuk membaca setiap file yang ada di dalam direktori yang di-mount. Tujuannya adalah untuk meng-copy isi file agar dapat dibuat di dalam direktori mount.
Source codenya seperti di bawah ini :

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

5. Fungsi makenode
***
Fungsi ini digunakan untuk membuat sebuah node kosong tanpa ekstensi yang nantinya dapat diisi oleh isi-isi yang telah di-copy ketika fungsi read sebelumnya.
Source codenya seperti di bawah ini :

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

6. Fungsi chmod
***
Seperti pada linux biasanya, fungsi ini digunakan untuk mengubah mode file, tentunya ini hal yang sudah umum bahwa mode dapat diubah agar semua user dapat mengakses dengan menggunakan "chmod 777"
Source codenya seperti di bawah ini :

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

7. Fungsi write
***
Fungsi ini menuliskan isi-isi yang sudah di-copy ketika fungsi read dijalankan, ke dalam node-node kosong yang dibuat oleh fungsi makenode.
Source codenya seperti di bawah ini :

static int xmp_write(const char *path, const char *buf, size_t size, off_t offset)                                                             
{
    int fd;
    int res;
    char fpath[1000];
    sprintf(fpath, "%s%s", dirpath, path);
    fd = open(fpath, O_WRONLY);

    if(fd == -1)
        return -errno;
   
    res = pwrite(fd, buf, size, offset);
    rename(fpath,fpath2)
    if(res == -1)
        res = -errno;

    close(fd);
    return res;
}

8. Fungsi open
***
Fungsi ini menentukan apa yang akan terjadi ketika file dalam mount dibuka. Biasanya code di sini sering dimodifikasi agar komputer memberikan respon yang berbeda-beda ketika file dibuka, namun normalnya adalah file berjalan seperti biasa
Source codenya seperti di bawah ini :

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

9. Induk fungsi
***
Fungsi ini seperti memberi prototype fungsi apa saja yang akan di pakai ke pada fungsi main.
Source codenya seperti di bawah ini :

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

10. Fungsi main
***
Tanpa ini semua fungsi di atas tidak akan berjalan. Fungsi main memanggil semua fungsi di atas
Source codenya seperti di bawah ini :

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

Sebenarnya masih banyak fungsi-fungsi lain dalam FUSE yang dapat memodifikasi apa yang terjadi, namun sekian saja kali ini karena sudah terlalu panjang. Semoga bermanfaat!




Tidak ada komentar:

Posting Komentar