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.
Membuat Symbolic Link Linux untuk File
Umumnya command In dan opsi -S diperlukan untuk membuat Symbolic link. Metode ini merupakan cara yang paling mudah dan fleksibel bagi anda untuk bereksperimen dengan bahasa pemrograman sebanyak mungkin. Tidak ada yang sulit dalam membuat Symbolic link Linux – Anda hanya perlu mengikuti satu langkah sederhana.
ln -s [target file] [Symbolic filename]
Command ln pada Linux menciptakan link antara source file dan direktori.
- -s – merupakan command untukSymbolic link
- [target file] – nama dari file yang sudah ada dan hendak Anda buatkan linknya
- [Symbolic filename] – nama symbolic link.
Link yang telah dibuat dapat diverifikasi oleh directory listing menggunakan list command yang terperinci:
Namun jika tidak dispesifikasikan [Symbolic filename], command tersebut akan membuat link baru pada direktori yang ada secara otomatis.
Membuat Symbolic Link Linux untuk Folder
Membuat symbolic link untuk folder juga tidak sulit. Berikut command yang digunakan:
ln -s [Specific file/directory] [symlink name]
Sebagai contoh, untuk menghubungkan direktori /user/local/downloads/logo ke folder /devisers, gunakan command berikut:
ln -s /user/local/downloads/logo /devisers
Setelah dibuat dan dilampirkan ke folder /devisers, symbolic link akan diarahkan ke /user/local/downloads/logo. Pada saat user mengubah direktori – cd – ke /devisers, secara otomatis sistemnya akan berganti ke file tertentu dan menuliskannya dalam command directory.
Opsi symbolic link juga disebut sebagai command line switch. Berikut beberapa command switch yang paling sering digunakan beserta keterangannya:
Command Switch | Keterangan |
–backup[=CONTROL] | backup setiap file tujuan yang sudah ada |
-d, -F, –directory | Superuser diperbolehkan untuk menggunakan hard link |
-f, –force | File tujuan yang sudah ada dihapus |
-I, –interactive | prompt sebelum menghapus file tujuan |
-L, –logical | deference target yang adalah symbolic link |
-n, –non-dereference | Symbolic link yang terhubung ke direktori disebut sebagai file |
-P, –physical | Membuat hard link langsung ke symbolic link |
-r, –relative | Membuat symbolic link ‘relative’ ke lokasi link |
-s, –symbol | Membuat symbolic link alih-alih hard link |
-S, –suffix=SUFFIX | Menimpa backup ‘suffix’ yang biasanya |
-v, –verbose | Membuat nama dari setiap file yang terhubung |
Cara Mengganti atau Menghapus Symbolic Link pada Linux
Anda dapat menghapus link yang sudah ada dan disematkan ke file atau direktori dengan command unlink atau rm. Berikut penggunaan command rm untuk menghapus link:
unlink [symlink to remove]
Menghapus symbolic link dengan command rm tidak berbeda jauh dengan menggunakan command unlink. Berikut penggunaan commandnya:
rm [symlink name]
Contohnya:
rm simpleText
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.