Ada berbagai jenis file system, mungkin yang banyak kita kenal adalah FAT32, ext4, ext3, etc.
Virtual File System <VFS>
Sistem operasi yang modern adalah sistem operasi yang mampu mengimplementasikan berbagai sistem berkas dengan tipe yang berbeda dalam waktu yang bersamaan. Salah satu solusinya adalah dengan menggunakan VFS.
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.
VFS berbeda dengan file system tradisional yang menyimpan data ke disk dan mengambilnya langsung dari disk. VFS bertindak sebagai pandangan/terjemahan dari file system yang sudah ada.
Filesystem in Userspace (FUSE)
FUSE sendiri memungkinkan pnegguna untuk menciptaka file system mereka sendiri tanpa mengubah kode kernel.
Bagaimana caranya?Dengan menjalankan kode file system di userspace dan modul FUSE akan menyediakan "jembatan" untuk antarmuka kernel.
FUSE berguna untuk menulis VFS.
NB: UNTUK MENJALANKAN FUSE INI KITA PERLU INSTALL DULU DI SISTEM OPERASI MASING-MASING!
Link download fuse: Fuse (bagian stable release)
(Proses install di S.O. diserahkan kepada user masing-masing)
Cara Kerja FUSE:
- fuse_main() (lib/helper.c) = sebagain fungsi main (userspace), program user memanggil fungsi fuse_main() kemudian fungsi fuse_mount() dipanggil.
- fuse_mount() (lib/mount.c) = menciptakan UNIX domain socket, kemudian di fork dan menciptakan child process yang menjalankan fusermount
- fusermount() (util/fusermount.c) = untuk mengecek apakah modul FUSE sudah di load. Kemudian membuka /dev/fuse dan mengirim file handle melalu UNIX domain socket kembali ke fungsi fuse_mount()
- fuse_new() (lib/fuse.c) = menciptakan struktur data yang berisi ruang yang digukanan untuk menyimpan data file system
- fuse_loop() (lib/fuse.c) = membaca file system calls dari /dev/fuse
Ini adalah beberapa fungsi yang disediakan oleh FUSE dan akan berguna kita pakai nantinya:
- int (*getattr) (const char *, struct stat *);
Get file attributes. - int (*readlink) (const char *, char *, size_t);
Read the target of a symbolic link - int (*mknod) (const char *, mode_t, dev_t);
Create a file node. - int (*mkdir) (const char *, mode_t);
Create a directory. - int (*unlink) (const char *);
Remove a file - int (*rmdir) (const char *);
Remove a directory - int (*rename) (const char *, const char *);
Rename a file - int (*chmod) (const char *, mode_t);
Change the permission bits of a file - int (*chown) (const char *, uid_t, gid_t);
Change the owner and group of a file - int (*truncate) (const char *, off_t);
Change the size of a file - int (*open) (const char *, struct fuse_file_info *);
File open operation. - int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *);
Read directory - int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *);
Read data from an open file - int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *);
Write data to an open file
Kita harus deklarasikan fungsi-fungsi itu di struct dulu
main dari fuse yang kita bikin |
fungsi yang mau di implementasikan |
Conclusion:
Dengan menggunakan FUSE, pengguna dapat menciptakan sistem berkasnya sendiri dengan berbagai modifikasi (misal tidak bisa membuka file/tidak dapat dapat mengedit file) tanpa mengubah kode kernel.
0 comments:
Post a Comment