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.

Resita has written 702 articles