Artikel:Mengenal link di Unix
Unix mengenal 2 macam link filesystem yaitu symbolic link (atau
symlink, atau soft link, atau link simbolik) dan hard link. Banyak pemakai pemula Linux yang masih asing dengan kedua
konsep ini, terutama jika sebelumnya tidak pernah menyentuh Unix/Linux
atau menggunakan Unix/Linux tapi hanya di level GUI. Bahkan tak
sedikit pemakai veteran yang masih belum memahami benar seputar sifat
dan kelakuan link, khususnya hard link. Tulisan ini bermaksud
menjelaskan seluk-beluk dua tipe link ini.
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/~steven/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.
Hard link
Berbeda dengan symlink, hard link lebih jarang digunakan oleh pemakai
awam, tapi sebetulnya semua file di filesystem Unix adalah hard
link. Kenapa? Perhatikan Gambar-1 yang merupakan gambaran bagaimana
file disimpan di filesystem.
Saat sebuah filesystem diformat/diciptakan, filesystem dibagi menjadi
beberapa daerah. Sebagian kecil daerah (mis: 1%) yaitu daerah yang
menyimpan informasi tentang file (metadata file, seperti ukuran,
permission, tipe file, dsb) dalam bentuk tabel inode. Setiap inode
menyimpan informasi tentang satu file, termasuk pointer ke blok data
file. Mayoritas daerah (mis: 99%) berisi blok-blok data untuk
menyimpan isi file itu sendiri. Inode tidak mengandung informasi
nama file.
Kita dapat menciptakan nama file yang merujuk pada (hard link) inode
tertentu (mis: pada gambar, file1.txt merujuk ke inode #1 sementara
file3.txt merujuk ke inode #3). Kita dapat menambahkan nama file lain
(yang bisa berada di direktori lain) yang merujuk pada inode yang sama (dalam gambar, file2.txt merujuk pula ke inode #1). Dengan
demikian, kedua nama file itu merupakan hard link ke inode yang sama,
ke file yang sama. File1.txt, file2.txt, file3.txt dan semua file lain
yang ada semua merupakan hardlink, tapi dalam kasus ini file1.txt dan
file2.txt akan identik isinya karena merujuk ke file yang sama.
Inode menyimpan juga jumlah link yang sedang merujuk ke dirinya. Ini
bisa dilihat misalnya dengan perintah ls. Contoh:
$ cd /usr/bin
$ ls -l perl*
-rwxr-xr-x 2 root root 1212352 2008-05-08 20:51 perl
-rwxr-xr-x 2 root root 1212352 2008-05-08 20:51 perl5.10.0
-rwxr-xr-x 1 root root 38086 2008-05-08 20:50 perlbug
-rwxr-xr-x 1 root root 224 2008-05-08 19:15 perldoc
...
Perhatikan kolom kedua, yaitu angka 2 dan 1. Ini menunjukkan bahwa
perl dan perl5.10.0 itu memiliki 2 hard link ke
dirinya. Dan karena kedua file ini ukuran, tanggal, dan ownernya sama,
maka ada kemungkinan merujuk ke inode yang sama (nomor inode
defaultnya tidak diperlihatkan oleh perintah ls, namun jika ingin
melihatnya anda dapat menggunakan opsi -i):
$ ls -li
541472 -rwxr-xr-x 2 root root 1212352 2008-05-08 20:51 perl
541472 -rwxr-xr-x 2 root root 1212352 2008-05-08 20:51 perl5.10.0
541452 -rwxr-xr-x 1 root root 38086 2008-05-08 20:50 perlbug
26411884 -rwxr-xr-x 1 root root 224 2008-05-08 19:15 perldoc
Berbeda dengan symlink pula, dalam konteks hardlink kedudukan
masing-masing link sejajar, sementara di symlink kedudukannya berbeda:
yang satu adalah "file aslinya", sementara yang satu merupakan "link"
atau "bayangan"-nya. Di hard link, semua sama-sama merupakan link ke
inode.
Membuat hard link
Untuk membuat hard link, Anda menggunakan perintah ln juga, tapi
tanpa opsi -s. Misalnya:
$ echo "Ini fileku" > file1.txt
$ ln file1.txt file2.txt
$ cat file2.txt
Ini fileku
Berbeda dengan symlink, saat membuat hard link, sebuah file harus ada
dulu (karena nomor inodenya harus diketahui). Sehingga, hard link
disebut juga link yang pengecekannya "compile-time", bukan "run-time"
seperti symlink. Tidak ada istilah broken link pada hard link (kecuali
jika terjadi kerusakan filesystem tentunya).
Oya, di banyak sistem operasi termasuk Linux, kita tidak bisa
menciptakan hard link ke direktori. Ini untuk mencegah penelusuran
direktori menjadi rekursif/looping.
File2.txt kini isinya sama persis seperti file1.txt. Jika kita
mengedit file2.txt, maka jika kita melihat file1.txt hasilnya adalah
yang sudah berubah juga:
$ echo "Berubah" > file2.txt
$ cat file1.txt
Berubah
Tidak ada perbedaannya dengan symlink.
Menghapus hard link
Menghapus hardlink tidak ada bedanya dengan menghapus file biasa. Pada
penghapusan, yang terjadi adalah pemutusan link antara nama file
dengan inode ybs (sehingga proses penghapusan di Unix disebut juga
"unlink"). Blok data file dan entri inode tidak akan benar-benar
dibebaskan (dinyatakan "free") sampai jumlah linknya mencapai
nol. Mari kita lihat proses reference counting:
$ ls -l file{1,2}.txt
-rw-r--r-- 2 steven steven 8 2008-06-28 18:44 file1.txt
-rw-r--r-- 2 steven steven 8 2008-06-28 18:44 file2.txt
$ rm file1.txt
-rw-r--r-- 1 steven steven 8 2008-06-28 18:44 file2.txt
Saat sebuah file dihapus, jumlah linknya berkurang menjadi 1. Tapi
karena masih ada link, blok data file tidak akan benar-benar
dihapus. Barulah ketika file1.txt dihapus pula, file menjadi
unreachable karena tidak ada link yang merujuknya. Entri inode dan
blok data dapat dinyatakan bebas untuk dipakai file lain.
Kegunaan hard link
Sama seperti symlink, hard link juga mengizinkan kita membuat file
yang muncul di beberapa tempat dengan beberapa nama sekaligus. Namun
penggunaan hard link lebih jarang. Salah satu contoh:
Kelakuan berbeda bergantung nama. Sebuah program dapat memilih
utk berkelakuan berbeda jika dipanggil dengan nama berbeda.
ls -l /usr/bin/sudo{,edit}
-rwsr-xr-x 2 root root 91700 2006-04-15 14:39 sudo
-rwsr-xr-x 2 root root 91700 2006-04-15 14:39 sudoedit
Jika dipanggil sebagai sudo, maka program ini akan mengeksekusi
program. Jika dipanggil sebagai sudoedit maka program ini
memanggil editor untuk mengedit /etc/sudoers. Sebetulnya programnya
hanya satu.
Contoh program lain yang memiliki dua nama tapi sebetulnya hard link
ke file yang sama: unzip dan zipinfo, ifup dan ifdown, bzip2 dan
bunzip2.
Sebetulnya alias nama ini bisa pula dilakukan dengan symlink, mis:
/usr/bin/unzip -> /usr/bin/zip
namun umumnya untuk skenario seperti ini, hard link yang lebih banyak
digunakan. Karena jika menggunakan symlink, bisa saja jika kita
mengkopi atau memindahkan file, yang terkopi hanyalah symlinknya saja
dan symlink menjadi patah, tidak dapat dipakai.
Kesimpulan
Walaupun di Windows kini dikenal juga berbagai objek filesystem yang
mirip link di Unix, seperti shortcut, junction, dan symlink di Vista,
namun semuanya diperkenalkan lebih baru daripada link di
Unix. Sehingga di lingkungan Unix/Linux digunakan secara lebih
intensif dan pervasif. Karena itu penting bagi Anda untuk benar-benar
memahami keduanya.
|