Senin, 02 April 2012

Symlink Linux

Symlink

Jenis link yang satu ini populer digunakan. Mula-mula diperkenalkan di Berkeley Unix 4.2BSD 20 tahun lebih yang lalu, kini telah menjadi standar POSIX dan didukung oleh semua keluarga sistem operasi Unix termasuk Mac OS X dan Linux. Symlink juga telah didukung di Windows Vista.

Apa itu symlink?

Symlink adalah file khusus yang berisi path absolut atau relatif. Saat sebuah path hendak diresolusi (yaitu, ditelusuri elemen-elemennya dari teratas hingga terbawah untuk menemukan file/direktori), jika elemen path mengandung symlink maka ini akan dapat "membelokkan" atau mengubah proses pencarian.
Contoh: jika /home/steven adalah sebuah direktori, /home/steven/tmp adalah sebuah symlink yang berisi path "/tmp" (path absolut) maka ketika /home/steven/tmp diresolusi, hasilnya adalah /tmp. Dan ketika /home/steven/tmp/f1.txt diresolusi, hasilnya adalah /tmp/f1.txt.
$ cd /tmp

$ echo "ini file /tmp/f1.txt" > f1.txt; # membuat file contoh

$ cd /home/steven

$ ln -s /tmp tmp; # membuat symlink ke /tmp

$ ls -l tmp
lrwxrwxrwx 1 steven steven 4 2008-06-28 15:23 tmp -> /tmp

$ ls -l /home/steven/tmp/1.txt; # akan merujuk ke /tmp/f1.txt
-rw-r--r-- 1 steven steven 2 2008-06-28 15:26 tmp3/f1.txt

Contoh lain, jika /home/steven/bin adalah sebuah symlink ke "../scripts" (path relatif) maka ketika /home/steven/bin/script1 diresolusi akan menjadi /home/steven/scripts/script1.
Catatan: seperti bisa dilihat pada contoh di atas, perintah ls menampilkan symlink beserta isi/targetnya dengan notasi tanda panah ->.
Saya yakin konsep symlink ini tidak terlalu sulit untuk dimengerti. Bagi pemakai Windows, symlink ini mirip seperti file shortcut (*.LNK), walau kelakuannya tidak persis sama (namun NTFS di Vista memiliki symlink yang lebih mirip Unix). Dan kalau Anda pemakai veteran yang pernah kenal dengan OS/2, ada pula konsep yang mirip di sistem tersebut yaitu shadow. Bagi pembaca yang terbiasa menggunakan PHP, Anda bisa menganalogikan symlink seperti sebuah "redireksi", yaitu mengarahkan browser ke file/direktori ke lokasi lain, baik secara relatif maupun absolut.

Membaca/tulis path yang mengandung symlink

Jika sebuah symlink dibaca, maka yang terbaca adalah file hasil resolusi. Mengikuti contoh di atas:
$ cat /home/steven/tmp/1.txt
ini file /tmp/f1.txt
$ cat /tmp/1.txt
ini file /tmp/f1.txt

Demikian juga jika kita hendak mengedit atau menulisi sebuah symlink:
$ echo "file ini telah berubah isinya" >/home/steven/tmp/1.txt
$ cat /home/steven/tmp/f1.txt
file ini telah berubah isinya
$ cat /tmp/f1.txt
file ini telah berubah isinya
Dalam membaca/tulis file, permission yang akan dipakai pun adalah permission dari target si symlink (file aslinya), bukan permission dari si symlink itu sendiri. Malah, permission sebuah symlink (yang ditampilkan dengan perintah ls -l) itu tidak memiliki kegunaan apa-apa karena pengecekan permission selalu dilakukan pada target symlink. Hanya ownership symlink saja yang memiliki arti.
$ cd /tmp
$ ln -s /etc/passwd p; # membuat symlink ke file password sistem
$ echo "tambah 1 baris ah" >> p
bash: p: Permission denied
Perintah terakhir gagal karena meskipun symlink p dibuat oleh kita, namun target symlink /etc/passwd adalah milik root dan tidak dapat sembarangan ditulisi user biasa.
Jika symlink terhapus, file utamanya tentu saja tidak ikut terhapus.
$ rm p
$ ls -l /etc/passwd; # file password sistem masih ada
-rw-r--r-- 1 root root 4700 2008-06-23 13:47 /etc/passwd

Membuat symlink

Seperti telah dituliskan di contoh paling awal, untuk membuat sebuah symlink, digunakan perintah ln dengan opsi -s. Sintaksnya adalah:
$ ln -s TARGET SYMLINK
Dengan kata lain, target disebutkan terlebih dulu. Contoh penggunaan symlink bisa dilihat pada beberapa contoh di atas.
Di bahasa-bahasa pemrograman juga terdapat fungsi untuk membuat symlink misalnya symlink() di PHP dan Perl.

Broken (sym)link

Satu hal yang perlu diperhatikan, kita dapat membuat symlink ke mana saja sesuka kita, tak peduli apakah path tersebut ada atau tidak, atau milik kita atau bukan. Pengecekan permission dan keberadaan path baru dilakukan saat resolusi (saat dibutuhkan). Jadi kadang-kadang symlink disebut juga pengecekannya bersifat "run-time", bukan "compile-time" (saat membuat dengan perintah ln, misalnya).
$ ln -s /sembarang l; # /sembarang ini mungkin ada mungkin tidak
$ cat l; # ternyata tidak ada
cat: tmp2: No such file or directory
Symlink yang tidak mengacu ke path yang valid disebut symlink yang path (broken symlink). Mirip juga konsepnya dengan broken link di Web.

Symlink dan perintah manipulasi file lain

Banyak perintah di Unix yang menyadari (aware) terhadap keberadaan symlink. Perintah seperti cp, misalnya, dapat diperintahkan untuk mengikuti symlink saat melakukan penyalinan rekursif (dengan opsi -L). Misalnya:
# cd /home
# ln -s steven Steven.Haryanto
# cp -rL Steven.Haryanto /backup
Perintah di atas akan mengkopikan seluruh isi /home/steven ke /backup/ secara rekursif, karena symlink Steven.Haryanto diikuti. Tanpa -L, maka perintah cp hanya akan mengkopi sebuah symlink ke /backup.
Umumnya kelakuan "mengikuti symlink" (dereferensi) bukanlah kelakuan default karena dapat berbahaya. Hanya gunakan opsi dereferensi jika memang Anda yakin semua symlink yang ingin Anda proses itu "bersih", yaitu merujuk ke target-target yang benar dan tidak sembarangan.

Symlink dan GUI

File-file manager di Linux, termasuk yang bersifat GUI dan TUI, termasuk Konqueror/Dolphin di KDE dan Nautilus di Gnome, umumnya memberi indikasi visual jika sebuah file/direktori adalah symlink. Konqueror misalnya, memberi lambang tanda panah kecil di kiri bawah icon file/direktori yang berupa symlink. Mc (midnight commander) memberi lambang "~" (tilde) pada symlink dan memberi warna merah pada symlink yang patah.
Perlakuan GUI terhadap symlink dalam operasi file/direktori (baca, tulis, chdir, hapus, dsb) pun umumnya sama seperti di command line (lihat pembahasaan sebelumnya).

Apa kegunaan symlink

Apa gunanya symlink? Symlink memberi kita kemudahan dan fleksibilitas dalam penamaan dan reorganisasi. Symlink dapat memperpendek sebuah nama file dan dapat membuat file "ada" di beberapa tempat sekaligus, tanpa kita harus melakukan duplikasi. Karena symlink sudah diperkenalkan lama, maka di budaya Unix symlink ini intensif digunakan di berbagai skenario. Mari kita lihat beberapa di antaranya.
Merujuk versi terbaru/tertentu. Kita dapat membuat symlink yang merujuk ke versi tertentu. Symlink ini dapat berupa label yang namanya tetap (fixed) dan dapat diingat/dipakai selalu oleh pengguna, meskipun versinya berganti terus. Misalnya, di direktori unduh seperti ini:
0.9.1/
0.9.2/
0.9.3/
latest -> 0.9.3/
stable -> 0.9.2/
Pengunduh file dapat selalu menggunakan nama latest/ jika menginginkan yang terbaru, atau stable/ jika menginginkan versi stabil terbaru. Versinya dapat berubah-ubah nanti, dan saat ada versi baru maka admin direktori download dapat mengupdate symlink agar merujuk ke versi baru tersebut.
Penamaan librari. Masih seputar versi, coba sekali-kali melihat direktori /lib atau /usr/lib di sistem Anda. Unix banyak sekali menggunakan symlink di sana.
lrwxrwxrwx 1 root root     17 2008-03-05 16:45 libpcre.so -> libpcre.so.3.12.1
lrwxrwxrwx 1 root root     17 2008-03-05 16:45 libpcre.so.3 -> libpcre.so.3.12.1
-rw-r--r-- 1 root root 154704 2008-01-09 04:16 libpcre.so.3.12.1
Pengguna librari dapat menggunakan alternatif nama libpcre.so, libpcre.so.3, atau libpcre.so.3.12.1 bergantung kebutuhannya. Jika muncul versi baru libpcre.so.3.12.2 maka pengguna librari tidak perlu ikut mengkompile ulang.
Banyak layout. Symlink dapat dipakai agar sistem mendukung lebih dari satu sistem layout. Contohnya adalah qmail yang menurut penciptanya DJB disarankan disimpan di /var/qmail/ (seperti /var/qmail/control yang berisi file-file konfigurasi, /var/qmail/bin berisi program, dst). Namun menurut standar LSB linux konfigurasi disarankan ditaruh di /etc, program di /usr/bin, dst. Dengan symlink, kita dapat mendukung kedua sistem ini tanpa harus menduplikasi file dan memboroskan ruang disk. Di Debian, misalnya, /var/qmail/ diisi dengan symlink-symlink:
/var/qmail/control -> /etc/qmail
/var/qmail/bin -> /usr/bin
...
Dengan demikian, program yang mengharapkan lokasi program /var/qmail/bin/qmail-inject tetap dapat menemukannya, walaupun sebetulnya programnya sendiri disimpan di /usr/bin.
Transisi. Dengan symlink, kita dapat mendukung masa transisi. Misalnya: /etc/my.cnf di versi Debian baru dipindah ke /etc/mysql/my.cnf. Tapi untuk sementara tersedia pula /etc/my.cnf yang merupakan symlink ke /etc/mysql/my.cnf agar program-program yang belum beradaptasi tetap dapat berjalan.
Penyingkatan. Tentu saja, salah satu kegunaan symlink juga untuk mempersingkat nama file/path yang panjang-panjang. Misalnya, di home Anda dapat memasang symlink:
# cd ~root
# la -> /var/log/apache2/error.log
# lm -> /var/log/messages
Sehingga untuk melihat file-file log tersebut bisa hanya dengan:
# tail -f lm
Atau:
# cd /usr/bin
# ln -s mplayer m
# ln -s t konsole
# ln -s k konqueror
Sehingga memainkan film bisa dengan:
$ m film.avi
Saya banyak membuat shortcut-shortcut 1-2 karakter seperti ini untuk perintah-perintah yang sering digunakan. Lumayan, supaya jari tidak capat pegal. Sebagai catatan, shortcut ini juga dapat dibuat dengan alias di shell, tapi jika dengan alias, maka shortcut ini tidak dapat dipakai di GUI, hanya di shell.
Membuka akses. Symlink juga dapat dipakai untuk membuka akses terhadap lokasi tertentu yang seharusnya tidak tercapai.
$ cd ~/public_html
$ ln -s / root
Saat membuka http://localhost/~<user>/root/ maka pengunjung situs jadi dapat melihat isi direktori sistem teratas (lalu bisa masuk ke /etc, dsb). Ini karena webserver Apache mengikuti link root menuju path / di sistem. Hal seperti ini dapat berbahaya dan perlu diperhatikan. Di Apache, kelakuan mengikuti link ini dapat dimatikan dengan direktif Options -FollowSymlinks.
Alternatif. Di Debian dikenal "sistem alternatif" yaitu /etc/alternatives yang berisi symlink-symlink yang dapat dikelola dengan menu. Isi direktori ini adalah program-program yang dipilih untuk fungsi tertentu. Misalnya, pager dapat diarahkan ke /usr/bin/less, /usr/bin/more, dsb. php dapat diarahkan ke php4 atau php5. www-browser dapat diset ke /usr/bin/galeon, /usr/bin/opera, /usr/bin/iceweasel, dsb. Dengan begitu, program lain dapat memanggil program dengan fungsionalitas tertentu tapi program persisnya dapat diset sesuai kesukaan pengguna di sistem tersebut.

Tidak ada komentar:

Posting Komentar