Sekilas Tentang MacPorts

MacPorts adalah sistem manajemen paket aplikasi-aplikasi open source untuk Mac OSX. Dalam konteks MacPort, aplikasi dapat disamakan penyebutannya dengan istilah port. Di Linux saya biasa menyebut aplikasi (software) sebagai paket (package). Awalnya saya bingung memahami apa bedanya port dengan sistem manajemen paketnya Linux. Misalnya di RedHat Linux saya gunakan perintah rpm -qa untuk menampilkan semua package yang terpasang :

ttirtawi@centosdev01:~$ rpm -qa | grep vim
vim-common-7.2.411-1.8.el6.x86_64
vim-enhanced-7.2.411-1.8.el6.x86_64
vim-minimal-7.2.411-1.8.el6.x86_64
ttirtawi@centosdev01:~$ 

atau di Ubuntu/Debian saya gunakan dpkg -l.

ttirtawi@gbt733:~$ dpkg -l |  grep vim
ii  vim                                  2:7.3.547-4ubuntu1.1                      i386         Vi IMproved - enhanced vi editor
ii  vim-common                           2:7.3.547-4ubuntu1.1                      i386         Vi IMproved - Common files
ii  vim-runtime                          2:7.3.547-4ubuntu1.1                      all          Vi IMproved - Runtime files
ii  vim-tiny                             2:7.3.547-4ubuntu1.1                      i386         Vi IMproved - enhanced vi editor - compact version
ttirtawi@gbt733:~$ 

Bandingkan dengan perintah port bawaan MacPorts seperti contoh berikut ini :

ttirtawi@macmini:~ $ port installed | grep vim
  vim @7.4.258_0+huge (active)
ttirtawi@macmini:~ $ 

MacPorts menggunakan prinsip yang mirip dengan Ports yang dimiliki oleh FreeBSD. Kebingungan tadi memicu saya belajar lagi tentang FreeBSD Port. Setelah mencoba mempelajari FreeBSD Ports, saya makin bingung. Hmm mungkin lebih tepatnya saya menjadi tertarik memahami sistem kerja Port di FreeBSD. Di lingkungan OS FreeBSD ada perbedaan antara “port” & “package”. Definisi package adalah pre-compiled binary (aplikasi yang sudah “jadi” , sudah di-compile, tinggal pakai). Sementara port adalah kumpulan berkas Portfile, Makefile (atau berkas cmake) & patch yang digunakan untuk menghasilkan sebuah aplikasi melalui proses kompilasi source code. Kode sumber (source code) aplikasinya sendiri bisa saja diambil dari tempat lain. Misalnya aplikasi editor vim, source code-nya sendiri diambil dari website-nya vim. Ini bisa dilihat dari isi berkas Portfile-nya :

ttirtawi@macmini:MacPorts $ more /Users/ttirtawi/MacPorts/var/macports/sources/rsync.macports.org/release/tarballs/ports/editors/vim/Portfile 
# $Id: Portfile 119295 2014-04-22 15:35:47Z raimue@macports.org $

PortSystem          1.0

name                vim
set vim_version     7.4
set vim_patchlevel  258
version             ${vim_version}.${vim_patchlevel}
categories          editors
platforms           darwin freebsd
license             Vim GPL-2+
maintainers         raimue
description         Vi \"workalike\" with many additional features
long_description \
    Vim is an advanced text editor that seeks to provide the power of the   \
    de-facto Unix editor 'Vi', with a more complete feature set.

homepage            http://www.vim.org/

master_sites        http://ftp.vim.org/pub/vim/unix/
patch_sites         http://ftp.vim.org/pub/vim/patches/${vim_version}
distname            vim-${vim_version}
use_bzip2           yes
dist_subdir         vim/${vim_version}
worksrcdir          vim[strsed ${vim_version} {g/\.//}]
extract.only        vim-${vim_version}${extract.suffix}
...
...
...
ttirtawi@macmini:MacPorts $ 

Ketika saya memasang port/aplikasi tertentu, MacPorts akan mengunduh source code aplikasi tersebut., menambahkan patch yang diperlukan, melakukan kompilasi kode, memasang aplikasi hasilnya (executable binaries), serta memasang beserta aplikasi dependensinya. Karena ada proses kompilasi, memasang port terasa jauh lebih lama daripada memasang package di Linux. Sejauh ini kesimpulan saya baik port maupun package dapat diartikan sebagai aplikasi. Bedanya port memerlukan proses kompilasi sendiri. Ada lagi bedanya, kita bisa punya beberapa versi port aplikasi tertentu. Meskipun hanya 1 yang bisa aktif. Di Linux setahu hanya 1 versi package yang bisa dipasang. Bila ingin menggunakan versi lain, saya harus lakukan upgrade atau membuang dulu paket yang sudah ada.

Ok balik lagi ke MacPorts. MacPorts memerlukan aplikasi XCode & XCode Command Line Tools, keduanya tersedia di Mac App Store. Kita bisa memasang MacPorts menggunakan Mac instaler (*.pkg) atau memasangnya secara manual (melakukan kompilasi source code-nya).

Instalasi MacPorts Dengan pkg installer

Ini adalah catatan saya memasang MacPorts pada OSX Mavericks (10.9.2) secara manual. Saya lebih memilih cara ini karena lebih leluasa menentukan beberapa detail proses instalasi. Pertama saya perlu mengambil source code MacPorts dari websitenya MacPorts.

ttirtawi@macmini:~ $ curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.2.1.tar.bz2
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  830k  100  830k    0     0   122k      0  0:00:06  0:00:06 --:--:--  189k
ttirtawi@macmini:~ $ 
ttirtawi@macmini:~ $ tar jxf MacPorts-2.2.1.tar.bz2 
ttirtawi@macmini:~ $ cd MacPorts-2.2.1
ttirtawi@macmini:MacPorts-2.2.1 $ 

Setelah diekstrak saya bisa mulai memasang MacPorts dengan 3 langkah kompilasi berikut ini :

ttirtawi@macmini:MacPorts-2.2.1 $ ./configure  --prefix=/Users/ttirtawi/MacPorts/   --with-no-root-privileges
ttirtawi@macmini:MacPorts-2.2.1 $ make
ttirtawi@macmini:MacPorts-2.2.1 $ make install

MacPort secara default akan terpasang pada /opt/local. Saya memilih untuk menyimpan aplikasi MacPorts di home, caranya dengan menggunakan opsi --prefix= saat menjalankan berkas configure. Saya memilih untuk memasang MacPorts tanpa hak akses root dengan menggunakan opsi --with-no-root-privileges. Tanpa opsi --with-no-root-privileges semua perintah MacPorts akan dimiliki oleh root seperti contoh berikut ini :

ttirtawi@macmini:MacPorts-2.2.1 $ ls -trl /Users/ttirtawi/MacPorts/bin/
total 448
-r-xr-xr-x  1 root  admin    2574 May 22 18:03 portmirror
-r-xr-xr-x  1 root  admin   10095 May 22 18:03 portindex
lrwxr-xr-x  1 root  admin       4 May 22 18:03 portf -> port
-r-xr-xr-x  1 root  admin  167464 May 22 18:03 port
-r-xr-xr-x  1 root  admin   37412 May 22 18:03 daemondo
ttirtawi@macmini:MacPorts-2.2.1 $ 

Ini artinya saya perlu menggunakan sudo tiap kali menjalankan perintah port. Dengan opsi --with-no-root-privileges, saya tidak perlu lagi menggunakan sudo :

ttirtawi@macmini:~ $ ls -tlr /Users/ttirtawi/MacPorts/bin/
total 448
-r-xr-xr-x  1 ttirtawi  staff    2574 May 22 18:06 portmirror
-r-xr-xr-x  1 ttirtawi  staff   10095 May 22 18:06 portindex
lrwxr-xr-x  1 ttirtawi  staff       4 May 22 18:06 portf -> port
-r-xr-xr-x  1 ttirtawi  staff  167464 May 22 18:06 port
-r-xr-xr-x  1 ttirtawi  staff   37412 May 22 18:06 daemondo
ttirtawi@macmini:~ $ 

Setelah MacPorts sukses terpasang, saya perlu memperbaharui daftar aplikasi (port tree) dengan menggunakan perintah di bawah ini :

ttirtawi@macmini:MacPorts-2.2.1 $ port -v selfupdate
--->  Updating MacPorts base sources using rsync
receiving file list ... done
base.tar

sent 58 bytes  received 1218655 bytes  162495.07 bytes/sec
total size is 4925440  speedup is 4.04
receiving file list ... done
base.tar.rmd160

sent 58 bytes  received 635 bytes  277.20 bytes/sec
total size is 512  speedup is 0.74
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
Synchronizing local ports tree from rsync://rsync.macports.org/release/tarballs/ports.tar
receiving file list ... done
ports.tar

sent 58 bytes  received 12289008 bytes  630208.51 bytes/sec
total size is 60989440  speedup is 4.96
receiving file list ... done
ports.tar.rmd160

sent 58 bytes  received 636 bytes  277.60 bytes/sec
total size is 512  speedup is 0.74
receiving file list ... done
PortIndex

sent 58 bytes  received 1490546 bytes  175365.18 bytes/sec
total size is 10589055  speedup is 7.10
receiving file list ... done
PortIndex.rmd160

sent 58 bytes  received 636 bytes  277.60 bytes/sec
total size is 512  speedup is 0.74
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated
ttirtawi@macmini:MacPorts-2.2.1 $ 

Untuk melihat aplikasi yang terpasang melalui MacPorts saya bisa gunakan perintah berikut ini :

ttirtawi@macmini:MacPorts-2.2.1 $ port installed
No ports are installed.
ttirtawi@macmini:MacPorts-2.2.1 $ 

Tentu tidak ada hasilnya karena saya baru saja memasang MacPorts.

Sebagai contoh saya akan memasang aplikasi Wireshark, saya bisa melakukannya dengan menggunakan perintah berikut ini (saya tidak menampilkan semua log instalasi) :

ttirtawi@macmini:MacPorts-2.2.1 $ port install wireshark

--->  Computing dependencies for wireshark
--->  Dependencies to be installed: adns glib2 gettext expat libiconv gperf ncurses libffi perl5 perl5.16 gdbm xz zlib gnutls autoconf m4 automake gmp libidn libtasn1 libtool nettle p11-kit curl-ca-bundle desktop-file-utils pkgconfig popt libxslt libxml2 gtk2 atk gobject-introspection cairo fontconfig freetype bzip2 libpng libpixman xorg-libXext xorg-libX11 xorg-bigreqsproto xorg-inputproto xorg-kbproto xorg-libXau xorg-xproto xorg-libXdmcp xorg-libxcb python27 db46 db_select libedit openssl python_select sqlite3 xorg-libpthread-stubs xorg-xcb-proto xorg-util-macros xorg-xcmiscproto xorg-xextproto xorg-xf86bigfontproto xorg-xtrans xorg-xcb-util xrender xorg-renderproto gdk-pixbuf2 jasper jpeg tiff gtk-doc docbook-xml docbook-xml-4.1.2 docbook-xml-4.2 xmlcatmgr docbook-xml-4.3 docbook-xml-4.4 docbook-xml-4.5 docbook-xml-5.0 docbook-xsl fop itstool gawk readline py27-libxml2 openjade opensp hicolor-icon-theme pango Xft2 harfbuzz graphite2 cmake shared-mime-info intltool gnome-common p5.16-getopt-long p5.16-pathtools p5.16-scalar-list-utils p5.16-xml-parser xorg-libXcomposite xorg-compositeproto xorg-libXfixes xorg-fixesproto xorg-libXcursor xorg-libXdamage xorg-damageproto xorg-libXi xorg-libXinerama xorg-xineramaproto xorg-libXrandr xorg-randrproto kerberos5 libcomerr libgcrypt libgpg-error libgeoip libpcap libsmi lua portaudio
--->  Fetching distfiles for adns
--->  Attempting to fetch adns-1.4.tar.gz from http://jog.id.distfiles.macports.org/macports/mpdistfiles/adns
--->  Verifying checksums for adns
--->  Extracting adns
--->  Applying patches to adns
...
...
...
...
--->  Fetching distfiles for wireshark
--->  Verifying checksums for wireshark
--->  Extracting wireshark
--->  Applying patches to wireshark
--->  Configuring wireshark
--->  Building wireshark
--->  Staging wireshark into destroot
--->  Installing wireshark @1.10.7_0+adns+geoip+gnutls+ipv6+libgcrypt+libsmi+lua+rtp+ssl+x11
--->  Activating wireshark @1.10.7_0+adns+geoip+gnutls+ipv6+libgcrypt+libsmi+lua+rtp+ssl+x11
--->  Cleaning wireshark
--->  Updating database of binaries: 100.0%
--->  Scanning binaries for linking errors: 100.0%
--->  No broken files found.
ttirtawi@macmini:MacPorts-2.2.1 $ 

Setelah wireshark sukses terpasang, saya bisa melihat wireshark sudah ada dalam daftar port tadi :

ttirtawi@macmini:MacPorts-2.2.1 $ port installed | grep wireshark
  wireshark @1.10.7_0+adns+geoip+gnutls+ipv6+libgcrypt+libsmi+lua+rtp+ssl+x11 (active)
ttirtawi@macmini:MacPorts-2.2.1 $ 

Saya juga bisa melihat informasi lengkap tentang wireshark (berikut dependensinya) dengan menggunakan perintah berikut ini :

ttirtawi@macmini:~ $ port info wireshark
wireshark @1.10.7 (net)
Variants:             [+]adns, [+]geoip, [+]gnutls, [+]ipv6, [+]libgcrypt, [+]libsmi, [+]lua, [+]rtp, [+]ssl, universal, [+]x11

Description:          A network analyzer that lets you capture and interactively browse Ethernet frames. Packet data can be read from a file, or live from a
                      local network interface.
Homepage:             http://wireshark.org/

Build Dependencies:   pkgconfig
Library Dependencies: glib2, libpcap, kerberos5, zlib, adns, gnutls, libgcrypt, lua, libsmi, libgeoip, portaudio, openssl, gtk2
Conflicts with:       wireshark-devel
Platforms:            darwin
License:              GPL-2 GPL-3
Maintainers:          opendarwin.org@darkart.com
ttirtawi@macmini:~ $ 

Informasi tentang dependensi aplikasi juga bisa dilihat dengan perintah berikut ini :

ttirtawi@macmini:~ $ port deps wireshark
Full Name: wireshark @1.10.7_0+adns+geoip+gnutls+ipv6+libgcrypt+libsmi+lua+rtp+ssl+x11
Build Dependencies:   pkgconfig
Library Dependencies: glib2, libpcap, kerberos5, zlib, adns, gnutls, libgcrypt, lua, libsmi, libgeoip, portaudio, openssl, gtk2
ttirtawi@macmini:~ $ 

Untuk melihat berkas binary hasil port wireshark , saya bisa gunakan perintah berikut ini :

ttirtawi@macmini:~ $ port content wireshark
Port wireshark contains:
  /Users/ttirtawi/MacPorts/bin/capinfos
  /Users/ttirtawi/MacPorts/bin/dftest
  /Users/ttirtawi/MacPorts/bin/dumpcap
  /Users/ttirtawi/MacPorts/bin/editcap
  /Users/ttirtawi/MacPorts/bin/mergecap
  /Users/ttirtawi/MacPorts/bin/randpkt
  /Users/ttirtawi/MacPorts/bin/rawshark
  /Users/ttirtawi/MacPorts/bin/reordercap
  /Users/ttirtawi/MacPorts/bin/text2pcap
  /Users/ttirtawi/MacPorts/bin/tshark
  /Users/ttirtawi/MacPorts/bin/wireshark
  ....
  ....
  ....
  /Users/ttirtawi/MacPorts/share/wireshark/smi_modules
  /Users/ttirtawi/MacPorts/share/wireshark/text2pcap.html
  /Users/ttirtawi/MacPorts/share/wireshark/tpncp/tpncp.dat
  /Users/ttirtawi/MacPorts/share/wireshark/tshark.html
  /Users/ttirtawi/MacPorts/share/wireshark/wimaxasncp/dictionary.dtd
  /Users/ttirtawi/MacPorts/share/wireshark/wimaxasncp/dictionary.xml
  /Users/ttirtawi/MacPorts/share/wireshark/wireshark-filter.html
  /Users/ttirtawi/MacPorts/share/wireshark/wireshark.html
  /Users/ttirtawi/MacPorts/share/wireshark/ws.css
ttirtawi@macmini:~ $ 

Perintah di atas mirip dengan perintah “rpm -ql wireshark” di RedHat Linux atau perintah “dpkg -L wireshark” di Debian Linux.

Karena saya meletakkan MacPort di lokasi tersendiri (bukan di /opt/local), maka saya perlu memodifikasi .bash_profile seperti ini :

ttirtawi@macmini:~ $ cat .bash_profile 
export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8
export PATH="${PATH}:/Users/ttirtawi/MacPorts/bin:$PATH"
[[ -s ~/.bashrc ]] && source ~/.bashrc
ttirtawi@macmini:~ $ 

Ini supaya saya bisa mengakses aplikasi langsung tanpa perlu mengetikkan full path. Tanpa modifikasi $PATH saya akan mendapati error seperti ini :

ttirtawi@macmini:~ $ wireshark
-bash: wireshark: command not found
ttirtawi@macmini:~ $ 

Tanpa modifikasi $PATH saya akan direpotkan karena tiap kali memanggil aplikasi tersebut saya harus menggunakan full path-nya seperti ini :

ttirtawi@macmini:~ $ /Users/ttirtawi/MacPorts/bin/wireshark -v
wireshark 1.10.7 (Git Rev Unknown from unknown)

Copyright 1998-2014 Gerald Combs <gerald@wireshark.org> and contributors.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Compiled (64-bit) with GTK+ 2.24.23, with Cairo 1.12.16, with Pango 1.36.3, with
GLib 2.40.0, with libpcap, with libz 1.2.8, without POSIX capabilities, without
libnl, with SMI 0.4.8, without c-ares, with ADNS, with Lua 5.2, without Python,
with GnuTLS 3.1.22, with Gcrypt 1.5.3, with MIT Kerberos, with GeoIP, with
PortAudio V19-devel (built May 21 2014 12:11:57), with AirPcap.

Running on Mac OS X 10.9.3, build 13D65 (Darwin 13.2.0), with locale
en_US.UTF-8, with libpcap version 1.5.3, with libz 1.2.8, GnuTLS 3.1.22, Gcrypt
1.5.3, without AirPcap.
       Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz

Built using clang 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40).
ttirtawi@macmini:~ $ 

Sekadar tambahan, Wireshark untuk Mac OSX bisa dipasang via MacPorts seperti contoh tadi atau lewat versi pre-compiled yang tersedia di websitenya Wireshark.

Virtualisasi Dengan KVM Linux

Sekilas Tentang Virtualisasi

Saya sudah cukup lama menggunakan Virtualbox untuk melakukan virtualisasi OS. Virtualisasi gampangnya dapat diartikan menjalankan suatu OS di dalam OS. Dengan virtualisasi kita bisa punya beberapa komputer virtual (virtual machine=VM) sekaligus. Misalnya di Mac saya bisa memasang OS Windows 7 dalam sebuah VM. Saya juga bisa punya beberapa VM berisi Linux, dan aneka macam OS lainnya. Dulu sebelum kenal Virtualbox, bila saya menggunakan sebuah notebook pasti saya pasang 2 OS di dalamnya. Saya perlu menentukan akan boot ke OS Linux atau Windows. Sistem dual boot seperti itu memang lebih powerful karena OS langsung berinteraksi dengan hardware komputer. Akan tetapi memasang beberapa OS dalam satu komputer seperti itu sangat tidak praktis.

Dalam dunia virtulisasi komputer (physical computer) disebut sebagai host sementara semua virtual machine akan disebut sebagai guest. Virtualbox membantu saya untuk melakukan beberapa hal seperti misalnya :

  • mengakses aplikasi yang hanya tersedia di Windows tanpa harus punya komputer/laptop dengan OS Windows.
  • mencoba varian distro Linux baru tanpa perlu melakukan instal ulang atau dual boot.
  • bereksperimen dengan Linux server, Solaris server, dsb.
  • melakukan eksperimen networking (routing, load balancing, firewall) dengan beberapa VM sekaligus.

Bayangkan bila saya tidak punya VM, berapa banyak komputer (komputer dalam arti fisik sebenarnya) yang harus saya miliki untuk melakukan eksperimen-eksperimen tadi. Dengan menggunakan VM, saya jadi bisa melakukan testing yang memerlukan beberapa komputer sekaligus. Selama komputer saya punya kapasitas memori dan kapasitas harddisk yang cukup, saya bisa membuat banyak VM & menjalankannya sekaligus.

Ada beberapa macam aplikasi virtualisasi seperti misalnya :

  • Virtualbox
  • VMware
  • KVM
  • Xen Hypervisor
  • Oracle VM
  • Proxmox

Aplikasi-aplikasi tersebut biasanya dikenal sebagai hypervisor. Hypervisor menurut Wikipedia didefinisikan sebagai berikut :

A hypervisor or virtual machine monitor (VMM) is a piece of computer software, firmware or hardware that creates and runs virtual machines.

Teknologi virtualisasi sendiri dapat digolongkan menjadi 3 macam :

  • Full Virtualization, yang termasuk dalam kategori ini adalah Virtualbox, KVM. Full Virtualization maksudnya adalah komputer host akan melakukan emulasi perangkat keras (hardware) yang digunakan oleh guest. Guest tidak tahu kalau mesin yang digunakannya adalah virtual machine. Full virtualization ini adalah tipe virtualisasi yang paling fleksibel. Kita tidak perlu menggunakan OS dengan kernel khusus. Kita bisa langsung menginstal sistem operasi layaknya kita menginstal OS pada komputer fisik. Kelemahan full virtualization adalah guest tidak bisa mendapat kecepatan akses penuh saat mengakses hardware (misalnya menulis/membaca data dari dalam harddisk atau bertukar data lewat network interface). Lambatnya akses Input/Output ini akibat dari emulasi hardware yang dilakukan oleh host.
  • Paravirtualization (PV), yang termasuk dalam kategori ini contohnya adalah Xen Hypervisor. PV mengatasi kendala yang dimiliki oleh full virtualisation. OS yang dipasang pada VM adalah versi termodifikasi dari sistem operasi (operating system/OS) aslinya. Misalnya, RedHat Linux menyediakan kernel-xen untuk PV guest. Guest VM sadar kalau mesin yang dipakainya adalah virtual machine. Sistem ini memiliki throughtput yang jauh lebih baik daripada full virtualization & boleh dibilang yang paling baik di antara 3 tipe virtualisasi. Sayangnya kita terikat pada pemilihan OS. Guest hanya bisa menggunakan OS yang memang sudah disiapkan untuk berjalan di atas paravirtualized VM.
  • Para-virtualized driver : sistem ini adalah kombinasi dari kedua sistem sebelumnya. OS yang dipasang pada guest adalah OS biasa (native OS). Hanya saja ada tambahan driver khusus yang perlu dipasang di komputer guest. Meskipun Virtualbox termasuk dalam kategori Full virtualization, Virtualbox bisa termasuk juga dalam kategori ini. Virtualbox menyediakan “Virtualbox Guest Addition”. Virtualbox Guest Addition menyediakan driver-driver khusus untuk perangkat seperti network interface, video card, dsb. Sistem ini menawarkan fleksibilitas dalam pemilihan OS sekaligus menawarkan performa I/O yang lebih baik daripada full virtualization.

Menginstal KVM

Tulisan ini akan jadi catatan pribadi saya tentang langkah-langkah menginstal KVM pada CentOS Linux 6.5. KVM adalah teknologi virtualisasi yang terintegrasi dengan kernel Linux. KVM pertama kali diintegrasikan ke dalam kernel linux sejak versi kernel 2.6.20.

Dalam percobaan ini saya menggunakan notebook Fujitsu S6140 dengan spesifikasi seperti berikut ini :

  • CPU Intel(R) Core(TM)2 Duo CPU T8300 @ 2.40GHz
  • 3GB RAM
  • Harddisk 160GB
  • CentOS 6.5 (@base packages)

Untuk bisa menggunakan KVM, komputer host harus memiliki CPU dengan fitur “hardware virtualization extension”. Pada CPU Intel fitur ini dikenal dengan nama vmx (Intel VT Extention). Sementara pada CPU AMD, fitur tadi dikenal dengan nama “svm” (AMD-V Extention).

Notebook Fujitsu yang saya gunakan sudah dilengkapi dengan vmx. Untuk memastikan saya bisa menggunakan perintah berikut ini :

root@centosdev02:~# egrep "svm|vmx" /proc/cpuinfo
flags          : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 lahf_lm ida dts tpr_shadow vnmi flexpriority
flags          : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 lahf_lm ida dts tpr_shadow vnmi flexpriority
root@centosdev02:~# 

Berikut ini adalah langkah-langkah yang perlu dilakukan untuk menyiapkan KVM :

Continue reading

VNC Via SSH Tunnel Dengan Putty

Di tulisan sebelumnya saya menyebut soal penggunaan SSH tunnel untuk mengakses VNC. SSH tunnel dipakai bila VNC Server hanya bisa diakses dari localhost. Bila kita menggunakan SSH dengan command line, tunneling bisa dilakukan dengan menggunakan tambahan opsi -L. Namun bila saya sedang menggunakan Windows, saya hanya punya Putty sebagai SSH client. Tulisan ini adalah contoh bagaimana menggunakan Putty untuk membuat SSH tunnel. Untuk mengakses VNC dari Windows saya menggunakan aplikasi RealVNC. Aplikasi RealVNC dapat diunduh gratis dari websitenya RealVNC.

  1. Sama seperti yang sudah saya contohkan di tulisan sebelumnya, saya tidak bisa langsung mengakses VNC melalui IP publik.

    Saya akan mendapati error “Connection refused” seperti pada gambar di bawah ini :

  2. Saya perlu membuat SSH tunnel terlebih dulu dengan menggunakan Putty. Dengan menggunakan Putty saya akan mengakses IP publik VNC Server (192.168.10.41)

  3. Di sisi kiri Putty ada opsi untuk membuat SSH Tunnel.

  4. Masukkan informasi “Source port” & “Destination” lalu klik tombol Add. Source adalah port Windows, sementara Destination adalah IP loopback VNC Server.

    Ini artinya semua request ke port 5902 Windows akan di-forward ke port 5902 milik VNC Server.

  5. Hasil akhirnya seperti ini :

  6. Lalu kita kembali lagi ke halaman muka Putty (seperti pada gambar poin#2) untuk mulai membuka SSH session ke VNC Server.

  7. Bila kita belum pernah mengakses server ini sebelumnya via SSH, Putty akan menampilkan informasi untuk menerima SSH Key dari remote server. Untuk melanjutkan koneksi kita bisa klik tombol Yes.

  8. Setelah koneksi SSH sukses kita bisa kembali lagi ke aplikasi RealVNC. Hanya saja kali ini saya tidak lagi menggunakan IP publik VNC Server tapi menggunakan IP loopback Windows (127.0.0.1). Jadi seolah-olah saya mengakses IP lokal Windows di port 5902. Padahal yang terjadi adalah VNC akan meneruskan request saya ini melalui SSH ke port 5902 milik VNC Server.

  9. Biasanya akan muncul jendela peringatan unencrypted connection, kali ini kita bisa abaikan saja peringatan ini dengan mengklik tombol Continue.

  10. Saat koneksi ke VNC Server sukses, akan muncul jendela yang meminta kita untuk memasukkan VNC password.

  11. Bila kita memasukkan VNC password yang benar, kita langsung mendapati halaman desktop VNC Servernya. Karena mesin vm01 pada contoh ini menggunakan Gnome Desktop Environment, yang muncul pertama kali ada halaman login Gnome. Setelah login saya segera mendapati desktop mesin vm01.

Memasang VNC Server di CentOS 6.5

VNC adalah singkatan dari Virtual Network Computing. Singkatnya VNC adalah remote desktop system, menyediakan fasilitas untuk mengontrol (atau berbagi) desktop dari komputer lain. VNC Server adalah komputer yang menjalankan servis vncserver dan menyediakan akses bagi komputer lain untuk mengontrol desktop-nya. VNC Client adalah semua komputer lain yang mengakses servis VNC untuk mengambil alih kontrol desktop. Ini adalah catatan saya saat belajar menghidupkan VNC Server di CentOS 6.5. Beberapa hal yang perlu saya lakukan untuk memasang VNC Server antara lain seperti berikut ini :

  1. Di CentOS 6.5 vncserver disediakan oleh paket tigervnc-server. Untuk memasang paket tigervnc-server dan segala dependency-nya saya gunakan perintah berikut ini :

    root@vm01:~# yum install tigervnc-server*
    
  2. Setelah semua paket yang dibutuhkan terpasang dengan sukses, selanjutnya saya perlu memodifikasi berkas /etc/sysconfig/vncservers. Berikut ini adalah contoh berkas vncservers yang belum dimodifikasi :

    root@vm01:~# cat /etc/sysconfig/vncservers
    # The VNCSERVERS variable is a list of display:user pairs.
    #
    # Uncomment the lines below to start a VNC server on display :2
    # as my 'myusername' (adjust this to your own).  You will also
    # need to set a VNC password; run 'man vncpasswd' to see how
    # to do that. 
    #
    # DO NOT RUN THIS SERVICE if your local area network is
    # untrusted!  For a secure way of using VNC, see this URL:
    # http://kbase.redhat.com/faq/docs/DOC-7028
    
    
    # Use "-nolisten tcp" to prevent X connections to your VNC server via TCP.
    
    
    # Use "-localhost" to prevent remote VNC clients connecting except when
    # doing so through a secure tunnel.  See the "-via" option in the
    # `man vncviewer' manual page.
    
    
    # VNCSERVERS="2:myusername"
    # VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"
    root@vm01:~# 
    

    Saya perlu menambahkan 2 baris di bawah ini :

    VNCSERVERS="2:ttirtawi"
    VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"
    

    Tambahan 2 baris di atas maksudnya :

    • 2:ttirtawi : maksudnya VNC Server akan LISTEN di port 5902 hanya untuk user ttirtawi. Contoh lain, 3:admin maka artinya VNC tersedia di port 5903 hanya untuk user admin.
    • -geometry : opsi ini maksudnya ukuran layar yang tersedia saat user membuka VNC session. Pada contoh ini saya memilih ukuran 800×600.
    • -nolisten tcp : sampai saat ini saya belum tahu apa gunanya opsi ini.
    • -localhost : opsi ini berguna untuk membatasi akses VNC hanya dari localhost saja atau dari dalam mesin yang sama.
  3. Setelah konfigurasi sudah selesai saya coba untuk mengaktifkan vncserver dengan perintah seperti berikut ini :

    root@vm01:~# service vncserver start
    Starting VNC server: 2:ttirtawi
    VNC password for user ttirtawi is not configured
                                                               [FAILED]
    root@vm01:~# 
    

    Servis VNC tidak bisa diaktifkan bila user yang bersangkutan belum memiliki password VNC.

  4. Untuk mengatur VNC password untuk user tertentu saya perlu menggunakan perintah vncpasswd seperti contoh berikut ini :

    root@vm01:~# su - ttirtawi
    ttirtawi@vm01:~$ vncpasswd
    Password:
    Password must be at least 6 characters - try again
    Password:
    Verify:
    ttirtawi@vm01:~$ 
    

    Perintah vncpasswd harus dijalankan oleh user yang bersangkutan, dalam contoh ini harus dijalankan oleh user ttirtawi.

  5. Setelah user ttirtawi memiliki VNC password, saya bisa mengaktifkan servis vncserver :

    root@vm01:~# service vncserver start
    Starting VNC server: 2:ttirtawi xauth:  creating new authority file /home/ttirtawi/.Xauthority
    xauth: (stdin):1:  bad display name "vm01.gbt733.net:2" in "add" command
    
    
    New 'vm01.gbt733.net:2 (ttirtawi)' desktop is vm01.gbt733.net:2
    
    
    Creating default startup script /home/ttirtawi/.vnc/xstartup
    Starting applications specified in /home/ttirtawi/.vnc/xstartup
    Log file is /home/ttirtawi/.vnc/vm01.gbt733.net:2.log
    
    
                                                               [  OK  ]
    root@vm01:~# 
    
  6. Pada contoh di atas saya mendapati error :

    xauth: (stdin):1:  bad display name "vm01.gbt733.net:2" in "add" command
    

    Error semacam itu karena nama hostname mesin tidak ditemukan dalam berkas /etc/hosts. Untuk memperbaiki error tersebut yang perlu saya lakukan adalah menambahkan hostname & IP address mesin vm01 seperti contoh berikut ini :

    root@vm01:~# vi /etc/hosts
    
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    
    192.168.10.41     vm01     vm01.gbt733.net
    root@vm01:~#  
    

    Setelah modifikasi /etc/hosts, saya tidak mendapati error yang sama lagi :

    root@vm01:~# service vncserver restart
    Shutting down VNC server: 2:ttirtawi                       [  OK  ]
    Starting VNC server: 2:ttirtawi
    New 'vm01.gbt733.net:2 (ttirtawi)' desktop is vm01.gbt733.net:2
    
    
    Starting applications specified in /home/ttirtawi/.vnc/xstartup
    Log file is /home/ttirtawi/.vnc/vm01.gbt733.net:2.log
    
    
                                                               [  OK  ]
    root@vm01:~#
    

Seperti sudah disebut pada langkah nomor 2, vncserver akan listen di port 5902. Untuk memastikan servis vncserver sudah aktif di port 5902, saya bisa cek dengan menggunakan perintah netstat seperti contoh di bawah ini :

root@vm01:~# netstat -an | grep 5902
tcp        0      0 127.0.0.1:5902              0.0.0.0:*                   LISTEN     
root@vm01:~# 

Di Mac saya gunakan aplikasi Screen Sharing, aplikasi Screen Sharing diakses dari Terminal dengan perintah :

open vnc://<IP>:5902

Meskipun sudah benar aktif di port 5902, saya masih belum bisa mengakses VNC dari Mac.

Ada 2 hal yang membuat saya belum bisa mengakses VNC pada port 5902 tadi :

  1. Saya belum mengatur firewall pada mesin vm01 untuk mengijinkan akses ke port 5902. Berikut ini adalah cara menambahkan rule iptables yang saya gunakan :

    root@vm01:~# iptables -I INPUT -p tcp -s 192.168.10.0/24 --dport=5902 -j ACCEPT
    

    Untuk memeriksa status firewall setelah penambahan rule baru tadi saya gunakan perintah seperti berikut ini :

    root@vm01:~# service iptables status
    Table: filter
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination        
    1    ACCEPT     tcp  --  192.168.10.0/24      0.0.0.0/0           tcp dpt:5902
    2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
    4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
    5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
    6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
    
    
    Chain FORWARD (policy ACCEPT)
    num  target     prot opt source               destination        
    1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
    
    
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination        
    
    
    root@vm01:~# 
    

    Supaya rule tadi tidak hilang saat mesin vm01 reboot, saya harus menyimpannya secara permanen dengan menggunakan perintah berikut ini :

    root@vm01:~# service iptables save
    iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
    root@vm01:~#
    
  2. Hal kedua yang menghambat akses VNC adalah adanya opsi -localhost pada berkas /etc/sysconfig/vncservers (lihat poin nomor 2 pada langkah-langkah di atas). Opsi -localhost membuat vncserver hanya tersedia pada IP loopback mesin vm01 & tidak tersedia pada IP publiknya (dalam contoh ini vm01 memiliki IP 192.168.10.41). Alternatif solusinya ada 2 :

    1. Menghapus opsi -localhost dari dalam berkas /etc/sysconfig/vncservers & merestart servis vncserver. Begitu opsi -locahost dihapus, saya langsung bisa mengakses VNCnya terlihat dari munculnya jendela VNC password seperti contoh di bawah ini :

    2. Tetap menggunakan opsi -localhost & menggunakan SSH tunnel untuk mengakses VNC. Silakan lihat contohnya di bawah ini :

      Pada contoh di atas SSH dengan menggunakan opsi -L maksudnya, semua request ke port 5902 di Mac akan di-forward ke port 5902 milik vm01. Lalu saya tinggal buka Screen Sharing ke IP localhost (127.0.0.1) port 5902 saja.

Karena dalam contoh ini, mesin vm01 belum memiliki desktop environment maka VNC hanya menampilkan layar hitam seperti ini :

Alternatifnya saya bisa memasang desktop environment dengan menggunakan perintah seperti ini :

        root@vm01:~# yum groupinstall "Desktop"

Perintah di atas akan memasang GNOME Desktop Environment, GNOME adalah default desktop environment yang digunakan di CentOS & RedHat. Bisa saja kita memasang desktop environment lain seperti KDE atau XFCE, masalah selera saja.

Setelah memasang desktop environment, kita perlu me-restart servis vncserver sekali lagi

root@vm01:~# service vncserver restart
Shutting down VNC server: 2:ttirtawi                       [  OK  ]
Starting VNC server: 2:ttirtawi
New 'vm01.gbt733.net:2 (ttirtawi)' desktop is vm01.gbt733.net:2


Starting applications specified in /home/ttirtawi/.vnc/xstartup
Log file is /home/ttirtawi/.vnc/vm01.gbt733.net:2.log


                                                           [  OK  ]
root@vm01:~#

Nah sekarang bila saya mengulang akses VNC dari Mac, saya akan disuguhi tampilan standar GNOME seperti berikut ini :

Multipathing iSCSI Disk

Sebagai lanjutan tulisan sebelumnya tentang iSCSI, kali ini saya ingin menuliskan tentang koneksi iSCSI dengan multipathing. Multipathing maksudnya adalah iSCSI Initiator (client) akan mengakses 1 shared disk melalui 2 network yang berbeda (ada tambahan redundant link). Dengan tambahan redundant link, koneksi iSCSI menjadi lebih aman terhadap kemungkinan terjadinya masalah pada jaringan.

Simple Shared Storage with Redundant iSCSI

Masih menggunakan contoh dari tulisan sebelumnya, saya menggunakan 2 buah mesin untuk mensimulasikan iSCSI Multipathing ini. Mesin pertama yang bertindak sebagai iSCSI Target adalah sansvr01. Sementara mesin yang akan bertindak sebagai iSCSI Initiator adalah dev01.

Menyiapkan iSCSI Redundant Link

Di contoh sebelumnya sansvr01 hanya punya 2 IP, satu untuk akses publik (192.168.10.111) dan satu lagi untuk komunikasi iSCSI (172.16.10.5). iSCSI Target & iSCSI Initiator berkomunikasi melalui jaringan 172.16.10.0/24. Nantinya akan ada 1 jalur komunikasi baru dari iSCSI Target ke iSCSI Initiator melalui jaringan 172.16.11.0/24. Untuk mesimulasikan multipathing, saya tambahkan satu interface baru (eth2) pada sansvr01 dengan IP 172.16.11.5.

root@sansvr01:~# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 52:54:00:66:EC:19  
          inet addr:192.168.10.111  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe66:ec19/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:11951 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1457 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1485359 (1.4 MiB)  TX bytes:217666 (212.5 KiB)
          Interrupt:11 Base address:0x6000 

eth1      Link encap:Ethernet  HWaddr 52:54:00:8B:EC:A5  
          inet addr:172.16.10.5  Bcast:172.16.10.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe8b:eca5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15283 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8546 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1232962 (1.1 MiB)  TX bytes:3726368 (3.5 MiB)
          Interrupt:11 Base address:0x4000 

eth2      Link encap:Ethernet  HWaddr 52:54:00:06:A1:35  
          inet addr:172.16.11.5  Bcast:172.16.11.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe06:a135/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:438 errors:0 dropped:0 overruns:0 frame:0
          TX packets:91 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:57372 (56.0 KiB)  TX bytes:10219 (9.9 KiB)
          Interrupt:10 Base address:0x8000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

root@sansvr01:~# 

Saya juga tambahkan IP baru (eth2 : 172.16.11.31) pada mesin dev01 :

root@dev01:~# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 52:54:00:A6:28:13  
          inet addr:192.168.10.31  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fea6:2813/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22032 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6381 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2570471 (2.4 MiB)  TX bytes:1042792 (1018.3 KiB)
          Interrupt:11 Base address:0x6000 

eth1      Link encap:Ethernet  HWaddr 52:54:00:EC:9B:73  
          inet addr:172.16.10.31  Bcast:172.16.10.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:feec:9b73/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26783 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56508 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14197492 (13.5 MiB)  TX bytes:42777972 (40.7 MiB)
          Interrupt:11 Base address:0x4000 

eth2      Link encap:Ethernet  HWaddr 52:54:00:5F:15:D8  
          inet addr:172.16.11.31  Bcast:172.16.11.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe5f:15d8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26285 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56686 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14100612 (13.4 MiB)  TX bytes:43110648 (41.1 MiB)
          Interrupt:10 Base address:0x8000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:104 errors:0 dropped:0 overruns:0 frame:0
          TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:9084 (8.8 KiB)  TX bytes:9084 (8.8 KiB)

root@dev01:~# 

Yang perlu dilakukan sekarang adalah memodifikasi berkas targets.conf untuk mendaftarkan IP baru milik dev01.

root@sansvr01:~# cat /etc/tgt/targets.conf
default-driver iscsi

<target iqn.2014-04.localdomain:sansvr01.shared01>
    backing-store /dev/mapper/vg_shareddisk-shared01
    initiator-address 172.16.10.31
    initiator-address 172.16.11.31
</target>
root@sansvr01:~# 

Berikutnya kita perlu “memaksa” servis tgtd di sansvr01 untuk menggunakan konfigurasi baru :

root@sansvr01:~# service tgtd force-reload
Force-updating SCSI target daemon configuration:           [  OK  ]
root@sansvr01:~# 

Kita bisa pastikan ACL baru sudah aktif dengan perintah tgt-admin :

root@sansvr01:~# tgt-admin -s
Target 1: iqn.2014-04.localdomain:sansvr01.shared01
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags: 
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 524 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: rdwr
            Backing store path: /dev/mapper/vg_shareddisk-shared01
            Backing store flags: 
    Account information:
    ACL information:
        172.16.10.31
        172.16.11.31
root@sansvr01:~# 

Penting sekali untuk menambah konfigurasi firewall untuk mengijinkan iSCSI Initiator mengakses shared disk melalui network 172.16.11.0/24 :

root@sansvr01:~# iptables -I INPUT -p tcp -s 172.16.11.0/24 --dport 3260 -j ACCEPT
root@sansvr01:~# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
root@sansvr01:~#

Mengatur Multipath Di iSCSI Initiator

Sekarang mesin dev01 bisa mengenali shared disk dari kedua network :

root@dev01:~# iscsiadm --mode discovery --type sendtargets --portal 172.16.11.5:3260 --discover
172.16.11.5:3260,1 iqn.2014-04.localdomain:sansvr01.shared01
root@dev01:~# iscsiadm --mode discovery --type sendtargets --portal 172.16.10.5:3260 --discover
172.16.10.5:3260,1 iqn.2014-04.localdomain:sansvr01.shared01
root@dev01:~# 

Mesin dev01 juga bisa login & mengakses shared disk yang sama lewat 2 target IP yang berbeda :

root@dev01:~# iscsiadm --mode node --targetname="iqn.2014-04.localdomain:sansvr01.shared01" --portal 172.16.10.5:3260 --login
Logging in to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.10.5,3260] (multiple)
Login to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.10.5,3260] successful.
root@dev01:~# 
root@dev01:~# iscsiadm --mode node --targetname="iqn.2014-04.localdomain:sansvr01.shared01" --portal 172.16.11.5:3260 --login
Logging in to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.11.5,3260] (multiple)
Login to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.11.5,3260] successful.
root@dev01:~# 

Belum cukup sampai di sini konfigurasinya, mesin dev01 melihat iqn.2014-04.localdomain:sansvr01.shared01 sebagai 2 external disk yang berbeda.

root@dev01:~# cat /proc/partitions 
major minor  #blocks  name

   8        0    8388608 sda
   8        1     512000 sda1
   8        2    7875584 sda2
 253        0    7036928 dm-0
 253        1     835584 dm-1
   8       16     512000 sdb
   8       32     512000 sdc
root@dev01:~# 

Dari informasi di atas, mesin dev01 menganggap ada 2 harddisk baru yaitu sdb & sdc. Perintah fdisk juga menampilkan hal yang sama :

root@dev01:~# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002d485

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        1045     7875584   8e  Linux LVM

Disk /dev/mapper/vg_dev01-lv_root: 7205 MB, 7205814272 bytes
255 heads, 63 sectors/track, 876 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg_dev01-lv_swap: 855 MB, 855638016 bytes
255 heads, 63 sectors/track, 104 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdb: 524 MB, 524288000 bytes
17 heads, 59 sectors/track, 1020 cylinders
Units = cylinders of 1003 * 512 = 513536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636c0fb3

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/sdc: 524 MB, 524288000 bytes
17 heads, 59 sectors/track, 1020 cylinders
Units = cylinders of 1003 * 512 = 513536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636c0fb3

   Device Boot      Start         End      Blocks   Id  System
root@dev01:~# 

Ini yang masih perlu diperbaiki karena sebenarnya shared disk yang diakses oleh mesin dev01 hanya 1 buah. Dengan multipathing, kita memberitahu OS bahwa sebenarnya /dev/sdb & /dev/sdc mengacu pada “physical storage” yang sama. Hanya proses komunikasinya bisa melalui 2 jalur yang berbeda.

Linux punya daemon multipathd yang bisa melakan proses multipathing. multipathd akan bertugas mengatur pertukaran data dari server ke storage melalui 2 jalur komunikasi yang berbeda. Bila satu jalur putus, multipathd akan tetep mengalihkan jalur pertukaran data tadi melalui redundant link-nya. Kalau mengacu pada gambar ilustrasi di atas, pertukaran data antara iSCSI Target & iSCSI Initiator bisa melalui network 172.16.10.0 atau 172.16.11.0. Bila dua jalur tadi digunakan bersama-sama secara bergantian, ini dikenal dengan konfigurasi round-robbin. Namun misalnya bila transmisi data hanya melalui network 172.16.10.0 saja, maka network 172.16.11.0 akan standby kalau sewaktu-waktu ada gangguan transmisi data pada network 172.16.10.0. Konfigurasi seperti ini dikenal sebagai active-passive (atau active-standby)

Di mesin dev01 sebagai iSCSI Initiator, saya perlu menginstal paket device-mapper-multipath :

root@dev01:~# yum install device-mapper-multipath

Supaya kernel Linux bisa melakukan proses multipathing ini, kita perlu mengaktifkan modul dm_multipath dengan perintah modprobe seperti contoh berikut ini :

root@dev01:~# modprobe dm_multipath
root@dev01:~# lsmod  | grep dm_multipath
dm_multipath           17724  2 dm_round_robin
dm_mod                 84209  15 dm_multipath,dm_mirror,dm_log
root@dev01:~# 

Konfigurasi multipath disimpan dalam berkas /etc/multipath.conf. Kita bisa dapatkan contoh sampel berkas konfigurasinya dari /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf. Berikut ini adalah contoh berkas multipath.conf yang saya gunakan sekarang ini :

root@dev01:~# cat /etc/multipath.conf 
defaults {
    udev_dir        /dev
    polling_interval    10
    path_selector       "round-robin 0"
    path_grouping_policy    multibus
    getuid_callout      "/lib/udev/scsi_id --replace-whitespace --whitelisted --device=/dev/%n"
    prio            const
    path_checker        readsector0
    rr_min_io       100
    max_fds         8192
    rr_weight       priorities
    failback        immediate
    no_path_retry       fail
    user_friendly_names yes
}
blacklist {
    wwid *
    devnode "sda"
}
blacklist_exceptions {
    wwid "1IET_00010001"
}
root@dev01:~# 

Beberapa detail yang perlu diketahui dari contoh konfigurasi di atas antara lain adalah :

  • blacklist : opsi ini dipakai untuk mendaftarkan semua harddisk yang tidak akan diikutsertakan dalam proses multipathing, seperti misalnya internal disk (boot disk). Pada contoh ini mesin dev01 memiliki boot disk /dev/sda.
  • blacklist_exceptions : semua disk yang dimasukkan dalam kategori ini akan ikut menggunakan konfigurasi multipathing. Dari mana kita bisa tahu nama wwid sebuah harddisk? Kita bisa lihat dari hasil perintah scsi_id berikut ini :
    root@dev01:~# scsi_id -g -u -d /dev/sdb
    1IET_00010001
    root@dev01:~# scsi_id -g -u -d /dev/sdc
    1IET_00010001
    root@dev01:~# 
    

    Dalam konteks iSCSI, nama SCSI ID ini sama dengan yang kita peroleh dari perintah tgt-admin pada mesin iSCSI Target.

    root@sansvr01:~# tgt-admin -s
    Target 1: iqn.2014-04.localdomain:sansvr01.shared01
        System information:
            Driver: iscsi
            State: ready
        I_T nexus information:
        LUN information:
            LUN: 0
                Type: controller
                SCSI ID: IET     00010000
                SCSI SN: beaf10
                Size: 0 MB, Block size: 1
                Online: Yes
                Removable media: No
                Prevent removal: No
                Readonly: No
                Backing store type: null
                Backing store path: None
                Backing store flags: 
            LUN: 1
                Type: disk
                SCSI ID: IET     00010001
                SCSI SN: beaf11
                Size: 524 MB, Block size: 512
                Online: Yes
                Removable media: No
                Prevent removal: No
                Readonly: No
                Backing store type: rdwr
                Backing store path: /dev/mapper/vg_shareddisk-shared01
                Backing store flags: 
        Account information:
        ACL information:
            172.16.10.31
            172.16.11.31
    root@sansvr01:~#
    
  • path_selector : opsi ini dipakai untuk menentukan link mana yang akan digunakan untuk transmisi data. Bila diset sebagai round-robin 0 maka data akan ditransmisikan melalui masing-masing link yang aktif secara bergantian (looping)
  • --replace-whitespace : ini gunanya untuk menghapus spasi pada nama disk (dalam hal ini adalah iSCSI Disk). Untuk melihat nama (atau ID) dari iSCSI disk tadi kita bisa gunakan perintah scsi_id seperti contoh berikut ini :
    root@dev01:~# scsi_id --device=/dev/sdc --whitelisted 
    1IET     00010001
    root@dev01:~# 
    

    Tanpa opsi --replace-whitespace ID dari /dev/sdc adalah 1IET 00010001. Bandingkan hasilnya setelah kita gunakan opsi --replace-whitespace berikut ini :

    root@dev01:~# scsi_id --device=/dev/sdc --whitelisted --replace-whitespace
    1IET_00010001
    root@dev01:~# 
    
  • user_friendly_names : opsi ini memungkinkan kita untuk memberi nama yang lebih mudah dikenali untuk setiap multipath-disk. Pada contoh tadi, akan sulit mengidentifikasi nama shared disk “1IET_00010001”. Kita bisa mendaftarkan nama alias untuk setiap WWID tersebut ke dalam berkas /etc/multipath/bindings seperti contoh di bawah ini
    root@dev01:~# cat /etc/multipath/bindings 
    # Multipath bindings, Version : 1.0
    # NOTE: this file is automatically maintained by the multipath program.
    # You should not need to edit this file in normal circumstances.
    #
    # Format:
    # alias wwid
    #
    sansvr01_shared0 1IET_00010001
    root@dev01:~# 
    

    Pada contoh di atas saya memilih untuk memberi alias iSCSI disk “1IET_00010001” menjadi “sansvr01_shared01”. Menurut saya ini jauh lebih mudah untuk diingat-ingat, jadi saya bisa langsung tahu kalau ini adalah iSCSI disk dari mesin sansvr01 dengan nama shared disk shared01.

Setelah konfigurasi tadi selesai dibuat & modul dm_multipath sudah di-load oleh kernel, kita bisa mulai aktifkan service multipathd :

root@dev01:~# service multipathd status
multipathd is stopped
root@dev01:~# 
root@dev01:~# service multipathd start
Starting multipathd daemon:                                [  OK  ]
root@dev01:~# 

Penting untuk mengatur service multipathd supaya aktif otomatis saat proses booting:

root@dev01:~# chkconfig multipathd on

Kita bisa melihat hasil akhir proses multipathing dengan perintah multipath seperti contoh di bawah ini :

root@dev01:~# multipath -ll
sansvr01_shared0 (1IET_00010001) dm-2 IET,VIRTUAL-DISK
size=500M features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 4:0:0:1 sdb 8:16 active ready running
  `- 5:0:0:1 sdc 8:32 active ready running
root@dev01:~# 

Jadi sekarang yang kita “anggap” sebagai harddisk oleh mesin dev01 bukan lagi /dev/sdb atau /dev/sdc melainkan multipath disk-nya yaitu /dev/mapper/sansvr01_shared0.

root@dev01:~# fdisk -l /dev/mapper/sansvr01_shared0

Disk /dev/mapper/sansvr01_shared0: 524 MB, 524288000 bytes
255 heads, 63 sectors/track, 63 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636c0fb3

                      Device Boot      Start         End      Blocks   Id  System
root@dev01:~# 

Langkah-langkah untuk menyiapkan filesystem pada multipath disk sama persis seperti layaknya harddisk konvensional :

  1. Buat partisi terlebih dulu :
    root@dev01:~# fdisk  /dev/mapper/sansvr01_shared0
    
    WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
             switch off the mode (command 'c') and change display units to
             sectors (command 'u').
    
    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-63, default 1): 
    Using default value 1
    Last cylinder, +cylinders or +size{K,M,G} (1-63, default 63): 
    Using default value 63
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 22: Invalid argument.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.
    root@dev01:~#
    
  2. Cek struktur partisinya :
    root@dev01:~# fdisk -l /dev/mapper/sansvr01_shared0
    
    Disk /dev/mapper/sansvr01_shared0: 524 MB, 524288000 bytes
    255 heads, 63 sectors/track, 63 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x636c0fb3
    
                          Device Boot      Start         End      Blocks   Id  System
    /dev/mapper/sansvr01_shared0p1               1          63      506016   83  Linux
    root@dev01:~# 
    
  3. Sebagai contoh, saya pilih filesystem ext4 :
    root@dev01:~#  mkfs.ext4 /dev/mapper/sansvr01_shared0p1 
    mke2fs 1.41.12 (17-May-2010)
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    Fragment size=1024 (log=0)
    Stride=0 blocks, Stripe width=0 blocks
    126976 inodes, 506016 blocks
    25300 blocks (5.00%) reserved for the super user
    First data block=1
    Maximum filesystem blocks=67633152
    62 block groups
    8192 blocks per group, 8192 fragments per group
    2048 inodes per group
    Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
    
    Writing inode tables: done                            
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 20 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    root@dev01:~# 
    
  4. Mount partisi baru tadi :
    root@dev01:~# mount /dev/mapper/sansvr01_shared0p1 /sharedstorage/
    
  5. Partisi baru sansvr01_shared01 dengan filesystem ext4 sudah siap digunakan :
    root@dev01:~# df -h
    Filesystem                      Size  Used Avail Use% Mounted on
    /dev/mapper/vg_dev01-lv_root    6.7G  854M  5.5G  14% /
    tmpfs                           499M     0  499M   0% /dev/shm
    /dev/sda1                       485M   32M  428M   7% /boot
    /dev/mapper/sansvr01_shared0p1  479M   11M  444M   3% /sharedstorage
    root@dev01:~#