selamat malam sobat TI di seluruh pelosok negeri yang indah ini. kembali lagi dengan saya nanda ricky, tapi sekarang saya memliki sebutan baru yang bisa sahabat semua gunakan untuk memanggil saya yaitu agam aceh. Nah malam ini agam mau membantu teman-teman semua ni yang pingin belajar lebih lanjut tentang pemograman pada linux atau sistem operasi. yah kali ini saya mau membantu sahabat semua dengan memberi sedikit pengetahuan tentang Filesystem in Userspace atau bisa disebut FUSE.
Fuse merupakan filesystem buatan kita sendiri yang aturannya itu terserah kepada pembuat fuse itu sendiri, ini berarti yang buat fuse bisa menjaga keamanan datanya sendiri.
Saya ngerti ni, pasti sahabat semua udah gak sabaran ni mau tahu gimana cara buat fuse, bener kan? hehehe. Sabar dong ni juga udah mau masuk ke intinya sob. Pertama ni kita harus punya codingan fuse yang lengkap atau pure. Saya punya ni dan saya berbaik hati mau membagikan kepada teman-teman semua. baikan kan saya? hehehe
Tapi sebelum saya membagi codingan saya mau ngasih tau ni kalau saya mau membuat fuse yang dimana pada direktori fuse nya itu terdapat file yang bisa di copy, tetapi, nah ada tetapinya ni. tetapi file yang di copy itu bakal bisa di buka atau di jalanin sedangkan file yang jadi objek pengcopyan gak bisa di buka lagi alias di kunci akses buat ngebukanya.
ngertikan maksud soalnya?
oh iya sebelum mulai sobat harus pasrtikan sudah menginstal fusenya, ni agam bagiin cara install fuse :
langsung aja ni saya bagi codingan yang pure :
#ifdef linux
/* For pread()/pwrite() */
#define _XOPEN_SOURCE 500
#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>
static int xmp_getattr(const char *path, struct stat *stbuf)
{
int res;
res = lstat(path, stbuf);
if(res == -1)
return -errno;
return 0;
}
static int xmp_readlink(const char *path, char *buf, size_t size)
{
int res;
res = readlink(path, buf, size - 1);
if(res == -1)
return -errno;
buf[res] = '\0';
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;
dp = opendir(path);
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;
res = mknod(path, mode, rdev);
if(res == -1)
return -errno;
return 0;
}
static int xmp_mkdir(const char *path, mode_t mode)
{
int res;
res = mkdir(path, mode);
if(res == -1)
return -errno;
return 0;
}
static int xmp_unlink(const char *path)
{
int res;
res = unlink(path);
if(res == -1)
return -errno;
return 0;
}
static int xmp_rmdir(const char *path)
{
int res;
res = rmdir(path);
if(res == -1)
return -errno;
return 0;
}
static int xmp_symlink(const char *from, const char *to)
{
int res;
res = symlink(from, to);
if(res == -1)
return -errno;
return 0;
}
static int xmp_rename(const char *from, const char *to)
{
int res;
res = rename(from, to);
if(res == -1)
return -errno;
return 0;
}
static int xmp_link(const char *from, const char *to)
{
int res;
res = link(from, to);
if(res == -1)
return -errno;
return 0;
}
static int xmp_chmod(const char *path, mode_t mode)
{
int res;
res = chmod(path, mode);
if(res == -1)
return -errno;
return 0;
}
static int xmp_chown(const char *path, uid_t uid, gid_t gid)
{
int res;
res = lchown(path, uid, gid);
if(res == -1)
return -errno;
return 0;
}
static int xmp_truncate(const char *path, off_t size)
{
int res;
res = truncate(path, size);
if(res == -1)
return -errno;
return 0;
}
static int xmp_utime(const char *path, struct utimbuf *buf)
{
int res;
res = utime(path, buf);
if(res == -1)
return -errno;
return 0;
}
static int xmp_open(const char *path, int flags)
{
int res;
res = open(path, 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;
fd = open(path, 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)
{
int fd;
int res;
fd = open(path, 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_statfs(struct fuse_statfs *fst)
{
struct statfs st;
int rv = statfs("/",&st);
if(!rv) {
fst->block_size = st.f_bsize;
fst->blocks = st.f_blocks;
fst->blocks_free = st.f_bavail;
fst->files = st.f_files;
fst->files_free = st.f_ffree;
fst->namelen = st.f_namelen;
}
return rv;
}
static int xmp_release(const char *path, int flags)
{
/* Just a stub. This method is optional and can safely be left
unimplemented */
(void) path;
(void) flags;
return 0;
}
static int xmp_fsync(const char *path, int isdatasync)
{
/* Just a stub. This method is optional and can safely be left
unimplemented */
(void) path;
(void) isdatasync;
return 0;
}
static struct fuse_operations xmp_oper = {
.getattr = xmp_getattr,
.readlink = xmp_readlink,
.getdir = xmp_getdir,
.mknod = xmp_mknod,
.mkdir = xmp_mkdir,
.symlink = xmp_symlink,
.unlink = xmp_unlink,
.rmdir = xmp_rmdir,
.rename = xmp_rename,
.link = xmp_link,
.chmod = xmp_chmod,
.chown = xmp_chown,
.truncate = xmp_truncate,
.utime = xmp_utime,
.open = xmp_open,
.read = xmp_read,
.write = xmp_write,
.statfs = xmp_statfs,
.release = xmp_release,
.fsync = xmp_fsync
};
int main(int argc, char *argv[])
{
fuse_main(argc, argv, &xmp_oper);
return 0;
}
itu dia codingan yang pure sekali. jadi karena soalnya yang diinginkan itu adalah fuse yang bisa kita copy filenya serta bisa dibuka copyannya maka tita gunakan beberapa fungsi yang perlu aja ni sob. ada beberapa yang perlu emg, sedangkan yang gak perlu di jadiin coment aja sob dan fungsinya di hapus aja.
jadi saya sudah siapkan codingan yang sudah jadi untuk dijalankan :
#ifdef linux
/* For pread()/pwrite() */
#define _XOPEN_SOURCE 500
#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>
static const char *dirpath ="/home/aceh/Documents/modul4/cekfuse/";
char alamat[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_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 from1[1000];
char to1[1000];
res = rename(from1, to1);
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(alamat,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, alamat);
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,
//.readlink = xmp_readlink,
.getdir = xmp_getdir,
.mknod = xmp_mknod,
.mkdir = xmp_mkdir,
//.symlink = xmp_symlink,
//.unlink = xmp_unlink,
//.rmdir = xmp_rmdir,
.rename = xmp_rename,
//.link = xmp_link,
.chmod = xmp_chmod,
//.chown = xmp_chown,
//.truncate = xmp_truncate,
//.utime = xmp_utime,
.open = xmp_open,
.read = xmp_read,
.write = xmp_write,
//.release = xmp_release,
//.fsync = xmp_fsync
};
int main(int argc, char *argv[])
{
fuse_main(argc, argv, &xmp_oper);
return 0;
}
itu dia codingannya sob. jadi untuk menjalankannya sebelumnya itu kita haru buat sebuah folder atau direktori yang akan di akses dan akan dibuat di folder tempat kita menyimpan folder fusenya. jadi maksudnya itu folder fuse itu bakal memiliki isi yang sama dengan isi di dalam folder yang kita akses, jadi yang sama itu hanya file didalemnya aja sob. jadi ini folder dan beserta isi nya yang sudah agam buat yang bakal di tampilkan juga di folder fusenya nanti atau bakal di mount ke folder fusenya nanti.
nah itu dia foldernya jadi karena sudah di alokasikan file dan foldernya maka kita langsung aja ni ke tahap pengeksekusian fusenya. jadi karena kita belajarnya di linux maka kita tidak bisa lepas dari yang namanya sebuah terminal, terminal kita gunakan hanya untuk menjalankan fuse atau menjalankan perintah permition untuk membuat fuse tersebut.
nah kta sudah masuk terminal dan meminta permition atau mengcompile untuk menjalankan fusenya formatnya adalah seperti ini :
gcc -Wall [nama file].c `pkg-config fuse --cflags --libs` -o [nama file]
Kemudian setelah itu kita membuat direktori fusenya agar bisa di akses. formatnya sbb : mkdir /tmp/fuse.
ada pertanyaan kenapa harus ada tmp? karena folder tmp sudah ada di computer atau super user jadi dia langsung dibaca dan folder fusenya bisa langsung di buat tidak harus chmod chmod ke tempat yang kita inginkan lagi.
Setelah kita buat direktorinya maka kita bisa eksekusi programnya :
Setelah kita eksekusi lanjut untuk mengeksplore fusenya dengan cara :
1. Akses computer yang ada di pc atau laptop
2. Buka folder tmp dan sudah ada folder fuse yang kita buat tadi.
3. Kita buka folder fuse dan sudah ada isinya yang berupa file yang sama seperti pada folder cekfuse yang kita alokasikan atau ingin kita mount tadi
4. copy salah satu file dan paste pada ttempat yang sama, maka file yang jadi objeck copyan tidak dapat di akses atau di buka isinya dan hanya file copyannya yang bisa di akses.
isinya sama bukan? jelas sama karna direktori yang kita akses adalah benar cekfuse.
kemudian itu adalah file yang sudah dicop.
itu adalah file objeck pengcopyan yang sudah di lock akses untuk membukanya dan yang selanjutnya adalah file copyannya.
setelah kita membuat fuse dan mengaplikasikan sesuai aturan yang kita mau tersebut maka ada pertanyaan lagi, apakah fusenya bisa kita hilangkan? bisa kita bisa menghapus isi fusenya tersebut agar fusenya tidak berjalan lagi.
dengan cara sperti ini :
1. kita harus masuk ke root atau super user.
2. kita umount dengan syntax : umount /tmp/fuse
3. kemudian cek pada folder fuse pasti sudah kosong.
itulah cara umount dan sudah selesai kita umount, inilah dia folder fuse tadi yang sudah kosong :
mungkin cuma segitu aja dulu yang bisa agam bagiin ke sobat semua semoga bermanfaat dan sobat dan sobat bisa belajar dengan mudah karena tutorial dari agam ini.
karena sudah selesai agam ucapin terima kasih sudah sabar dan mau menunggu lama tutorial-tutorial yang agam buat, dan juta agam minta maaf sebelumnya sepertinya agam bakal istirahat dulu untuk membagi tutorial yang lain, tapi tunggu aja pasti agam akan lanjutkan dengan tutorial yang lebih seru. selamat malam dan malam minggu sahabat agam serta jangan lupa BAHAGIA yaaa heheheh :D
Assalamualaikum wr. wb :)
Langganan:
Posting Komentar (Atom)
















mantep ni, lengkap (y)
BalasHapus