Pagi Semua… Kali ini Aku akan Menjelaskan tentang File
System.
Apa itu File System? File System
adalah bagian dari sistem operasi yang mengatur file, bagaimana file tersebut
dibentuk, diberi nama, diakses, digunakan, dilindungi, diimplementasikan, dan
diatur. Ada beberapa tipe file system, beberapa diantaranya adalah:
a.
Disk File
System yaitu file system yang menggunakan media fisik seperti disk sebagai
media penyimpanan
Contoh: FAT32, NTFS, HFS, ext3, ext4
b.
Flash File system : Merupakan file system yang
didesain untuk menyimpan file dalam media penyimpanan berbasis flash memory.
Contoh: JFFS, JFFS2, YAFFS, UBIFS, LogFS
c.
Tape File System atau Linear Tape FS (LTFS) :
merupakan file system yang menyimpan file dalam tape atau magnetic tape.
Contoh: IBM LTFS-SDE, HP LTFS
d.
Database File System : Merupakan file system
yang menyimpan file sebagai gumpalan dalam sebuah database, bukan dalam
hierarki direktori.
Contoh: IBM DB2
e.
Network File System : merupakan file system yang
bertindak sebagai client untuk file access protocol yang jauh, menyediakan
akses ke file dalam sebuah server.
Contoh: NFS, AFS, SMB protocol
f.
dan lain-lain
Selain File System diatas, ada
File System lain yang dibuat oleh system sendiri yang digunakan untuk mengatur beberapa jenis
File System yaitu Virtual File System. Virtual File System (VFS) adalah file
system abstrak yang memungkinkan aplikasi client untuk mengakses berbagai file
system konkret dengan cara yang sama. Virtual File System berfungsi sebagai
pengatur dari semua file system yang sudah di mount.VFS dapat digunakan juga
sebagai jembatan atara file system Windows, Mac OS dan Unix. VFS memberikan
interface antara kernel dan file system konkret. Virtual File System terdiri
dari 3 bagian utama yaitu Superblock, Inode, dan Dentry. Superblock
merepresentasikan setiap file system yang telah di mount. inode kependekan dari
index-nodes, inode berisi metadata dari file. Inode menunjuk ke superblock dari
file system dari sebuah file. Inode berisi data file seperti nomer seri, mode
proteksi, ownoer, ukuran, tanggal akses file terakhir, tanggal pembuatan dan
modifikasi. Dentry berguna untuk meng-encode struktur tree file system dan nama
dari file.
FUSE (Filesystem in Userspace)
adalah suatu metode yang dilakukan sistem operasi dimana pengguna yang tidak
memiliki akses bisa membuat file system mereka sendiri tanpa harus mengedit
kernel.
FUSE mengakses dua
bagian dari sistem operasi: Userspace dan Kernel. Pada kernel, terdapat Virtual
File System dan module FUSE. Keduanya digunakan untuk pengaksesan FUSE. Di
bagian Userspace, user mengakses file system. Melalui command yang telah
diinterpretasikan oleh glibc, command dikirim ke VFS. Kemudian VFS bergerak ke
module FUSE, karena direktori yang diakses merupakan filesystem berbasis FUSE.
Kemudian kernel FUSE melalui glibc dan libfuse sebelum akhirnya mengakses
filesystem yang dimaksud. Setelah itu, hasil pengaksesan filesystem tersebut
dikirim kembali ke kernel FUSE (misalkan, ada filesystem 'myFUSE' yang
mengembalikan direktori filesystem yang bersangkutan. Direktori tersebut
dikirim ke kernel FUSE). Kemudian kembali ke VFS dan akhirnya kembali ke
Userspace lagi.
Kelebihan dari FUSE antara lain:
a. FUSE tidak bertempat di Kernel,
sehingga lebih mudah jika ingin menyebarkan code yang menggunakan FUSE. Karena
tidak bertempat di kernel, proses pengetesan dan debugging menjadi lebih mudah
dan cepat
b. Apabila terdapat suatu bug, fix-patch
tidak harus menunggu revisi kernel dilakukan. Peng-update-an lebih cepat jika
memang dibutuhkan
c. Kegagalan pada filesystem FUSE tidak
berpengaruh pada kernel, karena FUSE tidak bertempat di Kernel
d. Tidak membutuhkan privilege dari
administrator untuk mengakses FUSE, sehingga bisa dijalankan lebih cepat
Template FUSE lengkap bisa dilihat DISINI!
Template FUSE lengkap bisa dilihat DISINI!
Untuk pengimplementasian FUSE mari kita coba untuk mengubah nama
file / ekstensi file ketika file terbuka, memunculkan notifikasi dan
memindahkan file tersebut ke suatu folder.File yang akan diimplementasikan
adalah file berekstensi .c, .doc, dan .3gp.
Untuk melakukan ini kita membutuhkan 3 fungsi dari FUSE yaitu
getatrr, readdirr, dan read. Fungsi getatrr
berguna untuk mendapatkan file yang akan dibuka, tanpa getatrr kita tidak bisa
membaca file tersebut. Fungsi readdirr berguna untuk membaca direktori dari
file yang akan dibuka. Fungsi read digunakan untuk membaca file dan melakukan
sesuatu saat file dibuka, fungsi ini yang nantinya kita ubah untuk
menyelesaikan masalah diatas. Untuk fungsi getatrr dan readdirr kita juga ubah
sedikit hanya untuk mendapatkan path dari file.
Mari kita mulai !
Mari kita mulai !
1. Buat file c untuk menuliskan kodingan.
2. Tuliskan include fungsi getatrr sebagai berikut
#define FUSE_USE_VERSION 26
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef linux
#define _XOPEN_SOURCE 700
#endif
#include <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <sys/time.h>
#ifdef HAVE_SETXATTR
#include <sys/xattr.h>
#endif
static const char *dirpath = "/home/yozora/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;
}
3. Sesuaikan
dirpath di static const char *dirpath = "/home/yozora/Downloads";
dengan path folder yang akan di-mount ke FUSE di komputer anda.
4. Tuliskan fungsi readdirr sebagai berikut
static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t
filler,
off_t offset, struct fuse_file_info *fi)
{
char fpath[1000];
if(strcmp(path,"/")
== 0)
{
path=dirpath;
sprintf(fpath,"%s",path);
}
else sprintf(fpath,
"%s%s",dirpath,path);
DIR *dp;
struct dirent *de;
(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;
}
5. Tuliskan fungsi read sebagai berikut
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;
char ext[1000];
int i;
for(i = 0; i <
strlen(fpath) && fpath[i] != '.'; i++); //mengekstrak
ekstensi file
strcpy(ext,
fpath+i);
char cmd[1000];
fd = open(fpath,
O_RDONLY);
if (fd == -1)
return
-errno;
else
{
if(strcmp(ext,
".c") == 0 || strcmp(ext, ".3gp") == 0 || strcmp(ext,
".doc") == 0|| strcmp(ext, ".ditandai") == 0)
{
system("zenity
--width 400 --error --title 'Error' --text 'Terjadi Kesalahan! File berisi
konten berbahaya.'");
char
from[1000], to[1000], newFolder[1000], filename[1000];
//mengambil
direktori dari file
strcpy(newFolder,
fpath);
//menghapus
filename dan menambahkan 'rahasia'
for(i
= strlen(newFolder) - 1; newFolder[i] != '/'; newFolder[i--] = 0);
strcat(newFolder,
"rahasia");
//mengambil
filename
for(i
= strlen(fpath) - 1; fpath[i] != '/'; i--);
strcpy(filename,
fpath+(i+1) ); //+1 untuk menghilangkan tanda ‘/’
//Mengecek
ada tidaknya folder rahasia
struct
stat s;
if
(stat(newFolder, &s) != 0) //0
berarti folder tersebut tidak ada
mkdir(newFolder,
0777); //membuat folder 'rahasia' folder ke
direktori mountnya
sprintf(from,
"%s", fpath); //mengambil path
file awal
sprintf(to,
"%s/%s.ditandai", newFolder, filename); //membuat path tujuan pemindahan file ke folder ‘rahasia’
dan menambahkan ekstensi ‘.ditandai’
sprintf(cmd,
"mv %s %s", from, to); //Merename
dan memindah file
system(cmd);
return
-errno; }
res =
pread(fd, buf, size, offset);
if
(res == -1)
res
= -errno;
close(fd);
}
return res;
}
6. Tuliskan fungsi operasi FUSE dan main sebagai
berikut
static struct fuse_operations xmp_oper = {
.getattr = xmp_getattr,
.readdir = xmp_readdir,
.read = xmp_read,
};
int main(int argc, char *argv[])
{
umask(0);
return
fuse_main(argc, argv, &xmp_oper, NULL);
}
7. Compile file tersebut dengan menuliskan
gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file]
8. Buat sebuah direktori untuk tempat
tujuan mount fuse, misalnya: /tmp/fuse
9. Jalankan fuse tadi dengan cara:
./[nama file] /tmp/fuse
10. Cobalah buka file
yang ada (catatan bukalah melalui terminal, jika membuka file langsung, maka saat membuka folder peringatan akan keluar karena saat kita membuka folder maka otomatis file didalamnya akan terbaca langsung)
11. SELESAI!
Sekian
Pembahasan File System dan FUSE semoga bermanfaat! Sampai jumpa lagi!
