Sabtu, 28 November 2015

FUSE (Filesystem in Userspace

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.

Diagram cara kerja fuse
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.

Installasi FUSE:


1. Download FUSE dari http://fuse.sourceforge.net/ pada bagian Download stable release

2. Extract file tar.gz dan masuk ke direktori FUSE. (tar –xvzf fuse-2.9.4.tar.gz)

3. Lakukan installasi FUSE dengan cara :
  • Gunakan hak akses super user (sudo su)

  • Ketikkan perintah ./configure

  • Ketikkan perintah make

  • Ketikkan perintah make install

4. FUSE siap digunakan 


Membuat filesystem sendiri menggunakan FUSE


#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/ncc/Documents";

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)
{
 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);
  if(res!=0) break;
 }
 closedir(dp);
 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,
 //.readdir = hello_readdir
};

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



Fungsi yang lain dapat ditambah sesuai dengan kebutuhannya.

Silakan dicoba. Semoga bermanfaat....

Sabtu, 07 November 2015

Thread dan IPC

Thread


Thread adalah bagian kecil dari suatu proses yang bisa di jadwalkan oleh sistem
operasi. Thread juga disebut sebagai proses ringan (lightweight). 

a. Single Threading

Adalah sebuah proses yang hanya memiliki satu thread yang berjalan. Biasanya fungsi thread ini digunakan sebagai pengendali jalannya proses.

b. Multi Threading

Adalah proses yang memiliki lebih dari satu thread yang berjalan didalamnya, sehingga dalam hal ini proses dapat menjalankan lebih dari satu tugas dalam satu waktu.



IPC (Interprocess Communincation)


Interprocess Communication adalah cara atau mekanisme pertukaran data antara satu proses dengan proses lainnya, baik itu proses yang berada di dalam komputer yang sama, atau komputer jarak jauh yang terhubung melalui jaringan.

a. Pipes


Pipe merupakan komunikasi sequensial antar proses yang saling terelasi, namun pipe memiliki kelemahan yaitu hanya bisa digunakan untuk komunikasi antar proses yang saling berhubungan, dan komunikasinya yang dilakukan adalah secara sequensial.

b. Message Queue
 

Sistem berkirim pesan adalah proses komunikasi antar bagian sistem untuk membagi variabel yang dibutuhkan. Proses ini menyediakan dua operasi yaitu mengirim pesan dan menerima pesan.

c. Shared Memory


Sistem Berbagi Memori merupakan salah satu cara komunikasi antar proses dengan cara mengalokasikan suatu alamat memori untuk dipakai berkomunikasi antar proses. Alamat dan besar alokasi memori yang digunakan biasanya ditentukan oleh pembuat program. Pada metode ini, sistem akan mengatur proses mana yang akan memakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.

d. Socket


Bentuk dari komunikasi yaitu UDP dan TCP menggunakan abstraksi socket yang menyediakan endpoint untuk komunikasi antar proses. Socket bisa dijalankan di berbagai platform(BSD UNIIX, UNIX, Linux, Windows, & Machintos OS).

  

Contoh Penggunaan Thread

Simple Music Player

Pembahasan Kode


Fungsi play lagu adalah fungsi yang memanggil pemutar lagu "cvlc". Cvlc akan play lagu yang diinputkan nantinya.



 Fungsi menu adalah interface dari program music player ini.


Fungsi ini masuk ke pilihan menu 1, yaitu help, yang berisi "clear"layar dan menampilkan kembali menu awal.


Fungsi ini masuk ke pilihan menu 2, yaitu tampilkan list, yang berisi menampilkan seluruh isi folder playlist, yang merupakan lagu yang akan diputar.

Fungsi ini masuk ke pilihan menu 3, yaitu play, yang berisi input judul lagu yang dapat dilihat di fungsi tampilkan list, dan memutarnya dengan membuat thread yang berisi command di fungsi play lagu.


Fungsi ini masuk ke pilihan menu 4, yaitu pause, yang berisi menghentikan program vlc yang kita gunakan untuk memutar musik di state yang sedang berjalan.


Fungsi ini masuk ke pilihan menu 5, yaitu continue, yang berisi menjalankan kembali program vlc yang kita gunakan untuk memutar musik di state saat kita menggunakan fungsi pause.

Fungsi ini masuk ke pilihan menu 6, yaitu stop, yang berisi menghentikan program vlc yang kita gunakan untuk memutar musik tanpa menyimpan state saat kita hentikan (berhenti total).

Silakan dicoba. Semoga bermanfaat....

Minggu, 18 Oktober 2015

Process and Daemon

Definisi Proses dan Daemon

- Proses adalah program tunggal yang sedang dalam keadaan dieksekusi pada alamat virtual.
- Daemon adalah proses yang berjalan di balik layar (background) dan tidak berinteraksi langsung dengan user melalui standard input/output

PID (Process ID)

Suatu identitas unik berupa angka-angka yang dipakai dalam beberapa system operasi untuk mengindentifikasi sebuah proses.

PPID (Parent Process ID)

Parent Process ID. Induk dari Process ID (PID). Setiap proses memiliki satu induk proses (PPID). PPID adalah creator dari proses.

Macam-macam Proses


Parent Process

Proses yang menciptakan beberapa proses anak. Proses ini tercipta dengan mengeksekusi fungsi fork(), kemudian hasil dari pemanggilan fork tersebut menciptakan beberapa child process.Implementasi pembuatan forking parent (proses pembuatan child) :

Child Process

Proses yang dibuat oleh proses lainnya ( parent process ). Setiap proses bias membuat banyak proses anak tapi hanya akan memiliki satu parent process, kecuali unuk proses paling pertama yang tidak memiliki parent. Proses pertama yang dipanggil init dalam Linux, dimulai oleh kernel saat boot dan tidak pernah dihentikan.

Zombie Process

Proses pada system operasi yang telah telah menyelesaikan prosesnya tetapi terdapat pada entry proses. Zombie proses terjadi apabila child process diberi perintah kill atau prosesnya dihentikan, child proses kemudian memberikan signal SIGCHILD ke parent process, apabila parent proess tidak menghandle signal tersebut, maka child process tersebut akan menjadi Zombie Process. Sebenarnya proses telah berhenti namun seakan-akan tetap ada. Zombie process ditandai dengan <defunct>.

Orphan Process

proses yang terjadi apabila Parent processnya telah berhenti dieksekusi tetapi child process tetap berjalan


Cara Membuat Proses

Pembuatan proses adalah tinggal menjalankan programnya, maka proses nya akan berjalan juga

Cara Membuat Daemon


Ada 6 proses pembuatan Daemon:
1. Fork Parent Processs dan penghentian Parent Process
2. Mengubah mode file menggunakan UMASK(0);
3. Membuat Unique Session ID (SID)
4. Mengubah Directory Kerja
5. Menutup File Descriptor Standar
6. Membuat Loop utama (inti kerja dari daemon)

Proses Pembuatan Daemon


1. Fork Parent Process dan penghentian Parent Process

Langkah pertama adalah melakukan forking untuk membuat process baru kemudian mematikan Parent Process. Process induk yang mati akan membuat system mengira proses telah selesai sehingga akan kembali ke terminal user. Proses anak yang melanjutkan program setelah proses induk dimatikan

2. Mengubah mode file menggunakan UMASK(0);

Untuk menulis beberapa file (termasuk logs) yang dibuat oleh daemon, mode file harus diubah untuk memastikan bahwa file tersebut dapat ditulis dan dibaca secara benar. Pengubahan mode file menggunakan implementasi umask().

//mengubah mode file mask
umask(0); //mendapat akses penuh dari file yang dibuat daemon

3. Membuat Unique Session ID (SID)

Child Process harus memiliki unik SID dari kernel untuk dapat beroperasi. Sebaliknya, Child process menjadi Orphan Proses pada system. Tipe pid_t yang dideklarasikan pada bagian sebelumnya, juga digunakan untuk membuat SID baru untuk child process. Pembuatan SID baru menggunakan implementasi setsid(). Fungsi setsid() memiliki return tipe yang sama seperti fork().

4. Mengubah Directory Kerja

Directori kerja yang aktif harus diubah ke suatu tempat yang telah pasti akan selalu ada. Pengubahan tempat direktori kerja dapat dilakukan dengan implementasi fungsi chdir (). Fungsi chdir() mengembalikan nilai -1 jika gagal.

5. Menutup File Descriptor Standar

Salah satu dari langkah terakhir dalam mengeset daemon adalah menutup file descriptor standar (STDIN, STDOUT, STDERR). Karena daemon tidak perlu menggunakan kendali terminal, file descriptor dapat berulang dan berpotensi memiliki bahaya dalam hal keamanan. Untuk mengatasi hal tersebut maka digunakan implemtasi fungsi close().

close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

6. Membuat Loop utama (inti kerja dari daemon)

Daemon bekerja dalam jangka waktu tertentu, sehingga diperlukan sebuah looping.


Contoh Implementasi Daemon

Membuat log dari process yang berjalan



Pembahasan kode:



Daemon ini menjalankan loop yang akan print semua proses yang dijalankan dengan username kita, dengan refresh interval(sleep) 1 detik.

Contoh file log hasil dari daemon tersebut:



Silakan dicoba. Semoga bermanfaat....


Sabtu, 26 September 2015

Shell Scripting

Shell script adalah beberapa perintah yang ditulis dengan plain text file.fungsi utama dari shell scripting adalah mengotomasi perintah - perintah yang sudah biasa kita gunakan sehingga kita tidak perlu menuliskan setiap kali dengan cara yang berulang dan lengkap, tapi cukup dengan fungsi yang telah kita buat.

Arithmetic Comparisons 

-lt (less than) 
-gt (greater than)  
-le  (less equal)
<= 
-ge  (greater equal)
>= 
-eq (equal)
== 
-ne (not equal)
!= 

Contoh bash command pada linux


a) ls berfungsi untuk menampilkan daftar isi dari direktori
Contoh : $ ls -la (menampilkan isi direktori termasuk yang dihidden)

b) pwd berfungsi untuk menampilkan informasi dari lokasi direktori yang sedang aktif
Contoh : pwd

c) mkdir berfungsi untuk membuat direktori/folder baru
Contoh : mkdir contoh (membuat folder bernama contoh)

d) chmod berfungsi untuk menambah atau mengurangi ijin pemakaian untuk mengakses file atau direktori. Terdapat tiga jenis perijinan yaitu r untuk read, w untuk write, x untuk execute. Perijinan diberikan untuk u(user), g(group), o(other) and a(all) dengan memberi tanda plus(+) untuk menambah ijin dan tanda minus(-) untuk mencabut ijin
Contoh : $ chmod ug+rx contoh
e) chown berfungsi untuk merubah user ID(owner) sebuah file atau direktori
Contoh : $ chown <user id> <file>

f) chroot berfungsi untuk meroot suatu direktori untuk membatasi ruang lingkup user atau memperkuat keamanan sistem
Contoh : chroot contoh

g) sudo berfungsi setelah kita mengaktifkan akses root, perintah ini berfungsi untuk mengeksekusi sebuah perintah sebagai super user
Contoh : sudo apt-get install

h) grep (Global regular expresion parse) berfungsi untuk mencari file - file yang mengandung teks dengan kriteria yang telah ditentukan
Contoh : grep marginal <file>

i) ps berfungsi untuk menampilkan informasi tentang proses yang sedang berjalan disistem
Contoh : $ ps -ef | more

j) halt yaitu perintah yang digunakan untuk mematikan sistem.
Contoh : $ halt

k) cd yaitu perintah yang digunakan untuk berpindah direktori aktif.
Contoh: ~$ cd Documents

l) rm yaitu perintah yang digunakan untuk menghapus (remove) file.
Contoh : rm tugas1.doc

m) mv yaitu perintah untuk memindahkan file dan direktori. Perintah ini juga bisa digunakan untuk merename (mengganti) nama file atau direktori.
Contoh: mv contoh1.doc contoh2.doc

n) cp = perintah yang digunakan untuk mengcopy atau menduplikat file dan direktori.
Contoh: cp contoh2.doc contoh2copy.doc           

dan masih banyak command lainnya yang dapat dilihat dibuka manualnya dengan command $man bash or $man sh. 

Contoh pengaplikasian bash script



Pembahasan kode:




Line pertama merupakan inisialisasi interpreter apa yang akan kita jalankan, yaitu bash. Lalu meminta input batas yaitu variabel n dan inisialisasi angka yang akan dibagi yaitu variabel i.


Fungsi while akan mengeksekusi perintah yang akan dimasukkan selama nilai i lebih kecil sama dengan nilai n



Menginisialisasi flag yang merupakan tanda pembagi bilangan


Fungsi for akan menjalankan perintah dari j=2 sampai j=i dengan pertambahan 1 setiap sekali eksekusi perintah. Fungsi if di dalam berisi, jika sisa bagi bilangan i dengan j adalah 0, maka nilai variabel flag akan bertambah 1.


If yang berikut ini adalah perintah untuk print angka yang memiliki flag 1, yaitu angka yang hanya bisa dibagi dengan angka itu sendiri, yang merupakan bilangan prima.


Berikan pertambahan kepada nilai i agar fungsi while diatas mencoba semua angka hingga kondisi while tidak memenuhi lagi (telah mencapai batas).

Silakan dicoba. Semoga bermanfaat....