Professional Documents
Culture Documents
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.
Daftar isi
1 Symlink 1 . 1 A p a it u s y m li n k ? 1 . 2 M e m b a c a /t u li s p a t h y a n g m e n g a n d u n g s
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.
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.
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
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.
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.
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
Atau:
# # # # cd ln ln ln /usr/bin -s mplayer m -s t konsole -s k konqueror
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. wwwbrowser 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 -rwxr-xr-x 2 root -rwxr-xr-x 1 root -rwxr-xr-x 1 root ... root 1212352 2008-05-08 20:51 perl root 1212352 2008-05-08 20:51 perl5.10.0 root 38086 2008-05-08 20:50 perlbug 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 541472 541452 26411884 -rwxr-xr-x -rwxr-xr-x -rwxr-xr-x -rwxr-xr-x 2 2 1 1 root root root root root 1212352 2008-05-08 20:51 perl root 1212352 2008-05-08 20:51 perl5.10.0 root 38086 2008-05-08 20:50 perlbug 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.
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
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.
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 benarbenar memahami keduanya. http://kb.masterweb.net/beta/index.cgi/read/Artikel:Mengenal_link_di_Unix