Jumat, 05 Desember 2014

File System

File System adalah metode untuk menyimpan dan mengatur file-file dan data yang
tersimpan di dalamnya untuk membuatnya mudah ditemukan dan diakses. File System
dapat menggunakan media penyimpan data seperti HardDisk atau CD Rom. File System
juga dapat melibatkan perawatan lokasi fisik file, juga memberikan akses ke data pada file
server dengan berlaku sebagai klien untuk protokol jaringan (mis. NFS atau SMB klien), atau
dapat juga berlaku sebagai file system virtual dan hanya ada sebagai metode akses untuk
data virtual.
Lebih umum lagi, file system merupakan database khusus untuk penyimpanan,
pengelolaan, manipulasi dan pengambilan data.

Beberapa file system yang pernah dikembangkan:

FAT
FAT merupakan File System yang digunakan dalam Sistem Operasi Windows.
Nama FAT berasal dari penggunaan tabel yang memusatkan informasi tentang area mana
milik file yang kosong atau mungkin tidak dipakai, dan di mana setiap file yang disimpan
dalam disk. Untuk membatasi ukuran tabel, space disk dialokasikan ke file dalam grup-grup
sektor hardware yang bersebelahan, disebut cluster.
Ketika disk drive berkembang, jumlah maksimum cluster pun meningkat dan begitu juga
jumlah bit yang mengidentifikasikan bahwa cluster telah berkembang. Versi
pengembangan dari format file system FAT dinamai sesuai dengan jumlah bit tabel
elemennya, yaitu: FAT12, FAT16 dan FAT32.

NTFS
NTFS merupakan file system standar untukWindows NT termasuk windows 200, XP, Server
2003, Windows Server 2008 dan Wondows Vista. NTFS menggantikan file system FAT
sebagai file system yang dipakai untuk Sistem Operasi Windows.
Versi rilis NTFS ada beberapa, sebagai berikut:

  • v1.0 with NT 3.1, dirilis pertengahan-1993
  • v1.1 with NT 3.5 dirilis 1994
  • v1.2 (pertengahan -1995) and NT 4 (pertengahan -1996)
  • v3.0 dariWindows 2000
  • v3.1 dariWindows XP (2001), Windows Server 2003 (2003), Windows Vista (pertengahan -2005) dan Windows Server 2008

Dalam NTFS, semua file data – nama file, tangal pembuatan, ijin akses dan isi – disimpan
dalam metadata dalam Master File Table (MFT). NTFS mengijinkan setiap urutan 16-bit nilai
utuk encoding nama (nama file, nama stream, nama index, dll)
Master File table mengandung metadata tentang setiap file, direktori dan metafile dalam
suatu volume dengan partisi NTFS. Metadata itu termasuk nama filem lokasim ukuran dan

ijinnya. Strukturnya mendukung algoritma yang memperkecil disk fragmentation.

ext2
Ext2 atau second extended file system adalah file system untuk kernel Linux. Meskipun
bukan termasuk file system journaling, tapi penerusnya yaitu ext3 menyediakan fitur
journaling dan hampir sepenuhnya kompatibel dengan ext2.
File system pertama yang dipakai dalam Sistem Operasi Linux adalah Minix FS yang hampir
bebas sepenuhnya dari bug, namun menggunakan offset 16-bit dan ukuran maksimum
hanya 64 MB. Nama file juga terbatas hanya 14 karakter. Untuk mengatasi hal ini, dibuatlah
file system baru yang dimulai dengan penambahan layer file system virtual pada kernel
Linux.
File system ext dirilis pada April 1992 sebagai file system pertama yang menggunakan VFS
API dan dimasukkan dalam Linux 0.96c. File system ext menyelesaikan dua masalah utama
dalam Minix FS (ukuran partisi max dan panjang nama file), dan membolehkan partisi
hingga 2GB dan nama file hingga 255 karakter. Namun masih ada masalah: belum ada
dukungan untuk akses terpisah, modifikasi inode dan timestamp modifikasi data.
Ext2 didesain dengan tujuan bahwa file system ini akan dapat dikembangakan lagi,
dengan sisa space yang masih banyak pada struktur datanya untuk dipakai dalam versi
mendatang. Fitur seperti POSIX ACL dan atribut diperluas diimplementasikan pertama kali
pada ext2 karena mudah diperluas dan internalnya sangat dimengerti.
Dalam Kernel Linux hingga 2.6, batasan dalam driver blok berarti bahwa file system ext2
memiliki ukuran file maksimum 2 TiB. Kernel Linux yang lebi baru membolehkan ukuran file
yang lebih besar, namun sistem 32-bit hanya membatasi hingga ukuran file 2 TiB. Ext2
masih direkomendasikan sebagai file system journaling pada Flash Drive USB bootable dan
media solid-state lainnya. Ext2 melakukan operasi write yang lebih sedikit dibading ext3
karena ext2 tidak perlu melakukan write ke journal. Faktor utama yang mempengaruhi usia
flash Drive adalah siklus hapus, dan juga siklus write, hal inilah yang menyebabkan
pemakaian ext2 membuat usia media flash drive lebih panjang.
Space dalam ext2 dibagi dalam blok-blok dan ditata dalam grup-grup blok, sama dnegan
grup silinder dalam File System Unix. Hal ini dilakukan untuk mengurangi fragmentasi
external dan mengurangi pencarian disk saat me-read data yang besar.
Tiap grup blok berisi superblok, bitmap grup blok, bitmap inode diikuti oleh data blok
aktual.
Superblok mengandung informasi penting yang krusial untuk proses booting Sistem
Operasi, namun copy back up juga dibuat pada setiap grup blok dari tiap blok dalam fiel
system. Hanya copy pertama yang ada pada blok pertama file system yang dipakai dalam
proses booting.
Deskriptor blok menyimpan nilai bitmap blok, bitmap inode dan table inode awal untuk
tiap grup blok yang nantinya semuanya akan disimpan dalam tabel grup deskriptor.
Alasan untuk pembatasan file system ext2 adalah format file data dan kernel OS. Biasanya
faktor-faktor ini ditentukan ketika file system itu dibuat. File system bergantung pada ukuran
blok dan rasio jumlah blok dan inode. Ukuran blok 8 KiB hanya mungkin dalam arsitektur
alpha.
Juga ada program userspace yang tidak dapat menangani file dengan ukuran yang lebih
besar dari 2 GB
Batasan direktori sub level sekitar 32768. Jika jumlah file dalam direktori melebihi 10000
hingga 15000 file, user biasanya akan diperingatkan bahwa operasi tersebut akan
bertahan dalam waktu lama. Batas teoritis jumlah file dalam suatu direktori adalah 1.3 x
10^20 meskipun hal ini tidak relevan untuk situasi praktis.

ext3
Ext3 atau third extended file system adalah file system journaling yang umum digunakan
dalam Sistem Operasi Linux. Ext3 merupakan pengembangan versi journaling dari file
system ext2 yang hampir kompatibel secara keseluruhan dengan ext2. Adanya fitur
journaling inilah yang membuatnya lebih dibanding ext2 yang membuatnya lebih reliable
dan menghilagkan keperluan untuk mengecek file system setelah shutdown yang tidak
semestinya.
Meskipun kecepatannya tidak lebih baik daripada file system Linux lainnya seperti JFS,
ReiserFS dan XFS, tapi ext3 memiliki manfaat yang signifikan yaitu membolehkan upgrade
di tempat dari file system ext2 tanpa harus mem-back up dan me-restore data yang berarti
mengurangi konsumsi daya CPU. Ext3 juga diangap lebih aman dibanding file system
Linux lainnya karena kederhanaannya dan juga uji cobanya yang luas.
File system ext3 menambahkan fitur-fitur ini dibanding pendahulunya:
- File system journaling
- Penambahan file system secara online
- Indeks htree untuk direktori yang lebih luas
Tanpa ini, file system ext3 akan sama saja dengan ext2.
Ada 3 level journaling yang tersedia dalam implementasi ext3 pada Sistem Linux:
Journal (resiko terendah)
Metadata dan isi file disimpan dalam jurnal sebelum dikerjakan ke file system utama.
Ordered (resiko menengah)
Hanya metadata yang disimpan dalam jurnal, isi file tidak disimpan tapi dijamin bahwa
bahwa isi file disimpan ke disk sebelum metadata yang bersesuaian ditandai untuk dicommit
dalam jurnal.
Writeback (resiko tertinggi)
Hanya metadata yang disimpan dalam jurnal, isi file tidak. Isi file mungkin di-write
sebelum atau sesudah jurnal di-update. Akibatnya, file dimodifikasi tepat sebelum crash
dapat terjadi.


Virtual File System

Sistem operasi modern harus mampu mengimplementasikan berbagai sistem berkas dengan tipe yang berbeda dalam waktu yang bersamaan. Salah satu teknik yang digunakan sebagai solusinya adalah dengan menggunakan virtual file system (VFS). VFS saat ini banyak digunakan oleh berbagai sistem operasi. Ide dari VFS adalah meletakkan informasi di kernel untuk merepresentasikan keseluruhan tipe sistem berkas, dan juga terdapat sebuah fungsi untuk setiap operasi yang dimiliki sistem berkas. Sehingga, untuk setiap system call seperti fungsi read(), write(), open(), dan lainnya, kernel akan mensubstitusikannya menjadi actual function yang dimiliki oleh setiap sitem berkas dengan berbagai tipe.


FUSE (Filesystem in Userspace)

Di linux, kita bisa membuat file system kta sendiri, yang disebut dengan FUSE.
Langkah-langkah penginstalan FUSE :

  • Download fuse dari http://fuse.sourceforge.net/ pada bagian Download stable release
  • Extract file tar.gz dan masuk ke direktori fuse melalui terminal
  • gunakan hak akses super user (sudo su)
  • ketikkan perintah ./configure
  • ketikkan perintah make
  • ketikkan perintah make install
  • FUSE siap digunakan
Berikut ini adalah source code sederhana untuk membuat filesystem menggunakan fuse:

#define FUSE_USE_VERSION 25

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#ifdef linux
/* For pread()/pwrite()/utimensat() */
#define _XOPEN_SOURCE 700
#endif

#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>
#include <sys/stat.h>
#include <sys/time.h>
#ifdef HAVE_SETXATTR
#include <sys/xattr.h>
#endif

static const char *dirpath = "/home/hand/Desktop/folder";

static int xmp_getattr(const char *path, struct stat *stbuff)
{
int res;
char fpath[1000];
sprintf(fpath, "%s%s", dirpath, path);
res = lstat(fpath, stbuff);
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, 0);
if(res != 0) break;
}
closedir(dp);
return res;
}

static int xmp_mkdir(const char *path, mode_t mode)
{
int res;
char fpath[1000];
sprintf(fpath, "%s%s", dirpath, path);
res = mkdir(fpath, mode);
if (res == -1)
return -errno;
return 0;
}

static int xmp_rename(const char *from, const char *to)
{
int res;
char ffrom[1000], fto[1000];
sprintf(ffrom, "%s%s", dirpath, from);
sprintf(fto, "%s%s", dirpath, to);

res = rename(ffrom, fto);
if (res == -1)
return -errno;

return 0;
}

static int xmp_mknod(const char *path, mode_t mode, dev_t rdev)
{
char fpath[1000];
sprintf(fpath, "%s%s", dirpath, path);
int res;
/* On Linux this could just be 'mknod(path, mode, rdev)' but this
is more portable */
if (S_ISREG(mode))
{
res = open(fpath, O_CREAT | O_EXCL | O_WRONLY, mode);
if (res >= 0)
res = close(res);
else if (S_ISFIFO(mode))
res = mkfifo(fpath, mode);
else
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, struct fuse_file_info *fi)
{
int res;
char fpath[1000];
sprintf(fpath, "%s%s", dirpath, path);
res = open(fpath, fi->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,
struct fuse_file_info *fi)
{
char fpath[1000];
sprintf(fpath, "%s%s", dirpath, path);

int fd;
int res;
(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;
}

static int xmp_write(const char *path, const char *buf, size_t size,
off_t offset, struct fuse_file_info *fi)
{
char fpath[1000];
sprintf(fpath, "%s%s", dirpath, path);
int fd;
int res;
(void) fi;
fd = open(fpath, O_WRONLY);
if (fd == -1)
return -errno;
res = pwrite(fd, buf, size, offset);
if (res == -1)
res = -errno;
close(fd);

return res;
}

static int xmp_unlink(const char *path)
{
        int res;
char fpath[1000];
sprintf(fpath, "%s%s", dirpath, path);

        res = unlink(fpath);
        if (res == -1)
                return -errno;


        return 0;
}

static struct fuse_operations xmp_oper = {
.getattr = xmp_getattr,
.getdir = xmp_getdir,
.mknod = xmp_mknod,
.mkdir = xmp_mkdir,
.rename = xmp_rename,
.chmod = xmp_chmod,
.open = xmp_open,
.read = xmp_read,
.write = xmp_write,
.unlink = xmp_unlink,
};

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


ganti isi static const char *dirpath = "/home/hand/Desktop/folder" dengan folder yang ingin dimount.

Sekian dan semoga bermanfaat...

Tidak ada komentar:

Posting Komentar