TeknoCerdas.com – Salam cerda untuk kita semua. Jika anda pengguna sistem operasi Linux, MacOS atau keluarga UNIX yang lain maka harusnya anda tidak asing dengan istilah Symlink atau Symbolic Link atau Softl ink. Namun apakah anda juga familiar dengan Hardlink? Tulisan ini akan membahas secara ringkas perbedaan Symlink dan Hardlink.
Dengan mengetahui perbedaan keduanya maka kita dapat menentukan kapan harus menggunakan symlink atau hardlink. Umumnya kesadaran penggunaan yang tepat didapat dari pengalaman juga trial and error.
Symlink
Symlink adalah sebuah file yang merujuk ke file atau direktori lain baik berupa absolute path atau relative path. Ketika kita mengakses symlink maka sistem operasi akan melihat isinya untuk menemukan lokasi asli file atau direktori yang dirujuk. Untuk membuat symlink biasa digunakan utilitas bernama ln
dengan opsi -s
.
Berikut adalah contoh file dan direktori untuk menggambarkan symlink.
- /
- tmp/
- soft-hello/
- my-hello.txt
- soft-world/
- my-hello-relative.txt (symlink to ../soft-hello/my-hello.txt)
- my-hello-absolute.txt (symlink to /tmp/soft-hello/my-hello.txt)
Perintah berikut digunakan untuk membuat struktur diatas.
$ mkdir /tmp/{soft-hello,soft-world}
$ echo "Hello world this is teknocerdas.com" > /tmp/soft-hello/my-hello.txt
$ ln -s ../soft-hello/my-hello.txt /tmp/soft-world/my-hello-relative.txt
$ ln -s /tmp/soft-hello/my-hello.txt /tmp/soft-world/my-hello-absolute.txt
$ ls -l /tmp/soft*
/tmp/soft-hello:
total 8
-rw-r--r-- 1 rioastamal wheel 36 Jan 9 07:36 my-hello.txt
/tmp/soft-world:
total 0
lrwxr-xr-x 1 rioastamal wheel 28 Jan 9 08:46 my-hello-absolute.txt -> /tmp/soft-hello/my-hello.txt
lrwxr-xr-x 1 rioastamal wheel 26 Jan 9 08:27 my-hello-relative.txt -> ../soft-hello/my-hello.txt
Dapat terlihat dari daftar file semua symlink ditandai dengan prefix attribut l
pada file misal lrwxr-xr-x
. Dari tampilan juga terlihat lokasi dari file original. File my-hello-relative.txt
dan my-hello-absolute.txt
merujuk pada file yang sama yaitu my-hello.txt
. Hanya saja cara resolusi path berbeda satu menggunakan relative path satu menggunakan absolute path. Lantas apa bedanya?
Bedanya adalah ketika lokasi symlink tersebut dipindahkan, symlink yang menggunakan absolute path harusnya tidak terpengaruh.
$ mv /tmp/soft-world/my-hello-absolute.txt \
/tmp/soft-world/my-hello-relative.txt \
/tmp/
$ ls -l /tmp/
lrwxr-xr-x 1 rioastamal wheel 28B Jan 9 08:46 my-hello-absolute.txt -> /tmp/soft-hello/my-hello.txt
lrwxr-xr-x 1 rioastamal wheel 26B Jan 9 08:27 my-hello-relative.txt -> ../soft-hello/my-hello.txt
drwxr-xr-x 3 rioastamal wheel 96B Jan 9 07:36 soft-hello
drwxr-xr-x 3 rioastamal wheel 96B Jan 9 08:47 soft-hello-space
drwxr-xr-x 2 rioastamal wheel 64B Jan 9 08:57 soft-world
Dapat terlihat pointer dari symlink tetap sama. Sekarang yang masih berfungsi harusnya symlink dengan absolute path.
$ cd /tmp
$ cat my-hello-absolute.txt
Hello world this is teknocerdas.com
$ cat my-hello-relative.txt
cat: my-hello-relative.txt: No such file or directory
Symlink relative tidak bekerja karena saat berada pada /tmp pointer menujunk pada ../soft-hello/my-hello.txt
dimana jika diterjemahkan akan naik satu direktori menjadi /soft-hello/my-hello.txt
dan tentu saja file tersebut tidak ada.
Lalu bagaimana jika file original dihapus, apa yang akan terjadi?
$ rm /tmp/soft-hello/my-hello.txt
Harusnya kedua symlink rusak atau tidak terbaca.
$ cat my-hello-absolute.txt
cat: my-hello-absolute.txt: No such file or directory
Hardlink
Hardlink adalah sebuah file yang merujuk pada nomor inode tertentu pada file sistem. Inode adalah tempat sebenarnya data dari sebuah file disimpan. Satu file memiliki satu nomor inode. Karena berisi nomor inode maka hardlink hanya bisa digunakan pada file bukan direktori. Karena itu juga pada hardlink tidak dikenal istilah absolute atau relative path karena yang dirujuk adalah nomor inode.
Ilustrasi gambar dari Wikipedia berikut akan lebih jelas menggambarkan cara kerja Hardlink.
Berikut adalah contoh file dan direktori untuk menggambarkan hardlink.
- /
- tmp/
- hard-hello/
- my-hello.txt
- hard-world/
- my-hard-hello.txt (hardlink to /tmp/hard-hello/my-hello.txt)
Perintah berikut digunakan untuk membuat struktur diatas.
$ mkdir /tmp/{hard-hello,hard-world}
$ echo "Hello world this is teknocerdas.com (hardlink)" > /tmp/hard-hello/my-hello.txt
$ ln /tmp/hard-hello/my-hello.txt /tmp/hard-world/my-hard-hello.txt
$ ls -l /tmp/hard*
/tmp/hard-hello:
total 8
-rw-r--r-- 2 rioastamal wheel 47 Jan 9 09:24 my-hello.txt
/tmp/hard-world:
total 8
-rw-r--r-- 2 rioastamal wheel 47 Jan 9 09:24 my-hard-hello.txt
Dapat terlihat pada list file diatas sekilas nampak dua file yang berbeda. Tetapi sebenarnya keduanya adalah file yang sama karena merujuk pada nomor inode yang sama.
Mari kita buktikan dengan menulis ke salah satu file.
$ echo "New line for Hello World" >> /tmp/hard-hello/my-hello.txt
$ cat /tmp/hard-hello/my-hello.txt
Hello world this is teknocerdas.com (hardlink)
New line for Hello World
Harusnya hardlink juga memiliki konten yang sama.
$ cat /tmp/hard-world/my-hard-hello.txt
Hello world this is teknocerdas.com (hardlink)
New line for Hello World
Terbukti meskipun keduanya adalah sebuah file tapi merujuk pada informasi data inode yang sama. Untuk melihat nomor inode gunakan perinah ls -i
.
$ ls -i /tmp/hard-hello/my-hello.txt /tmp/hard-world/my-hard-hello.txt
8628050573 /tmp/hard-hello/my-hello.txt
8628050573 /tmp/hard-world/my-hard-hello.txt
Pada contoh diatas kedua file memiliki inode number yang sama yaitu 8628050573
. Sehingga meskipun letak file original atau hardlink berpindah-pindah asalkan masih dalam satu file sistem maka hardlink tersebut tetap bekerja.
$ mv /tmp/hard-hello/my-hello.txt ~/Desktop/
$ cat /tmp/hard-world/my-hard-hello.txt
Hello world this is teknocerdas.com (hardlink)
New line for Hello World
Pada contoh diatas file original dipindah tetapi hardlink tetap dapat berfungsi karena yang dirujuk adalah nomor inode.
Lalu bagaimana jika file original dihapus, apakah hardlink tetap berjalan? Mari kita coba.
$ rm ~/Desktop/my-hello.txt
$ cat /tmp/hard-world/my-hard-hello.txt
Hello world this is teknocerdas.com (hardlink)
New line for Hello World
Ternyata hardlink tetap bekerja. Mustahil? tentu tidak. Analoginya adalah file adalah sebuah record pada buku daftar alamat rumahnya sendiri berada bukan pada buku alamat melainkan lokasi “fisik” lain. Sehingga ketika record pada buka alamat itu dihapus sejatinya dapatnya atau rumahnya masih ada hanya saja keberadaannya tidak diketahui.
Hardlink masih berisi record yang menyimpan lokasi inode sehingga dia dapat merujuk pada data aslinya. Tidak terpengaruh ketika file asli dihapus.
Perbedaan Symlink dan Hardlink
Dari paparan singkat tentang symlink dan hardlink diatas dapat dirumuskan beberapa perbedaan diantara keduanya.
Kasus | Symlink | Hardlink |
---|---|---|
Perintah yang digunakan | ln -s | ln |
Berlaku untuk file | Ya | Ya |
Berlaku untuk direktori | Ya | Tidak |
Jika file original dihapus atau dipindah apakah link rusak? | Ya | Tidak |
Dapat melakukan link lintas filesystem path | Ya | Tidak |
Portabilitas maksimum ketika dilakukan perintah penyalinan file | Tidak | Ya |
Dalam kasus nyata hardlink banyak digunakan jika portabilitas sangat diperlukan. Hal ini juga yang digunakan oleh Terraform. Terraform menggunakan hardlink untuk merujuk shared plugin yang digunakan. Hal ini dilakukan agar ketika direktori project pada Terraform dipindah bahkan dicopy ke lain komputer maka dapat dipastikan project tersebut tetap berjalan. Hal ini karena pada proses penyalinan hardlink terbaca sebagai sebuah file normal yang merujuk pada nomor inode tertentu.
Berbeda dengan symlink yang hanya merujuk pada lokasi file original sehingga jika utilitas penyalinan tidak bisa membaca symlink maka yang disalin hanyalah pointernya saja. Hal ini akan menyebabkan pada lokasi baru (komputer lain) menyebabkan file tidak terbaca karena referensi ke original file tidak ditemukan.