Shell Tips: Perbedaan Symlink dan Hardlink

3 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Perbedaan Symlink dan Hardlink
Perbedaan Symlink dan Hardlink (Ilutrasi: Rio Astamal)

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.

Ilustrasi Hardlink
Ilustrasi Hardlink dan inode (Sumber: wikipedia)

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.

KasusSymlinkHardlink
Perintah yang digunakanln -sln
Berlaku untuk fileYaYa
Berlaku untuk direktoriYaTidak
Jika file original dihapus atau dipindah apakah link rusak?YaTidak
Dapat melakukan link lintas filesystem pathYaTidak
Portabilitas maksimum ketika dilakukan perintah penyalinan fileTidakYa
Tabel perdaan symlink dan hardlink

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.