Kadang kita ingin satu file bisa diakses dari beberapa lokasi sekaligus tanpa harus menyalinnya berulang kali: konfigurasi yang dipakai dua aplikasi, atau versi terbaru sebuah direktori yang ingin tetap diakses lewat nama lama. Linux menyediakan dua mekanisme untuk itu — symbolic link dan hard link — yang terlihat serupa tetapi bekerja dengan cara yang sepenuhnya berbeda. Pada Chapter ini kita akan membuat keduanya, membongkar perbedaannya di level inode, dan memilih kapan masing-masing layak dipakai.

Konsep Singkat: Nama File Bukan Isi File #

Sebelum membahas link, kita perlu satu fakta dasar filesystem: nama file hanyalah entri direktori yang menunjuk ke sebuah inode — struktur data yang menyimpan metadata dan lokasi data file di disk. Satu inode bisa ditunjuk oleh lebih dari satu nama, dan itulah inti dari hard link. Symbolic link bekerja berbeda: file link menyimpan path targetnya, seperti catatan kecil bertuliskan “lihat file di sana”.

Konsekuensi keduanya terasa ketika target dihapus. Hard link tetap hidup karena inode masih ditunjuk oleh nama lain; symbolic link menjadi dangling — jalan buntu yang menunjuk ke file yang tidak ada. Kita akan melihat keduanya secara langsung di bawah.

Perintah ln -s target nama-link membuat symbolic link. Mari kita coba pada file laporan:

bash
mkdir -p latihan
cd latihan
printf 'Laporan penjualan kuartal pertama.\n' > laporan-q1.txt
ln -s laporan-q1.txt laporan-terbaru
ls -F

Output yang Dihasilkan:

text
laporan-q1.txt
laporan-terbaru@

Tanda @ di belakang nama laporan-terbaru pada listing ls -F menandakan bahwa entri tersebut adalah symbolic link. Untuk melihat ke mana link menunjuk, gunakan readlink — kita bangun ulang fixture yang sama terlebih dahulu:

bash
mkdir -p latihan
cd latihan
printf 'Laporan penjualan kuartal pertama.\n' > laporan-q1.txt
ln -s laporan-q1.txt laporan-terbaru
readlink laporan-terbaru
cat laporan-terbaru

Output yang Dihasilkan:

text
laporan-q1.txt
Laporan penjualan kuartal pertama.

Baris pertama menunjukkan bahwa laporan-terbaru menunjuk ke laporan-q1.txt. Baris kedua membuktikan bahwa membaca link sama hasilnya dengan membaca targetnya: cat mengikuti link secara transparan dan mencetak isi file target. Path target pada symbolic link boleh absolut maupun relatif; link relatif ikut “berpindah” bersama foldernya bila kita memindahkan keduanya bersama-sama, sehingga lebih sering dipakai untuk file yang berada di dalam satu pohon direktori.

Tanpa option -s, perintah ln membuat hard link — nama lain untuk inode yang sama. Nomor inode bisa dilihat dengan ls -i atau stat -c '%i'; karena nomor inode berbeda-beda antar sistem, kita bandingkan keduanya secara langsung agar hasilnya bisa diverifikasi:

bash
mkdir -p latihan
cd latihan
printf 'Laporan penjualan kuartal pertama.\n' > laporan-q1.txt
ln laporan-q1.txt laporan-salinan
if [ "$(stat -c %i laporan-q1.txt)" = "$(stat -c %i laporan-salinan)" ]; then
    echo "inode sama"
else
    echo "inode beda"
fi

Output yang Dihasilkan:

text
inode sama

Pesan inode sama membuktikan bahwa kedua nama menunjuk entri inode yang identik — keduanya bukan dua file, melainkan dua nama untuk satu inode. Anda juga bisa melihat nomor inodenya langsung dengan ls -i di komputer Anda; angkanya berbeda-beda di setiap sistem, tetapi keduanya selalu sama untuk hard link. Jumlah pointer ke sebuah inode disebut link count dan bisa dilihat dengan stat -c '%h', sekali lagi di atas fixture yang dibangun ulang:

bash
mkdir -p latihan
cd latihan
printf 'Laporan penjualan kuartal pertama.\n' > laporan-q1.txt
ln laporan-q1.txt laporan-salinan
stat -c '%h %n' laporan-q1.txt laporan-salinan

Output yang Dihasilkan:

text
2 laporan-q1.txt
2 laporan-salinan

Angka 2 pada kedua baris menunjukkan bahwa inode kini ditunjuk dua nama. File baru biasanya berangka 1. Ketika salah satu nama dihapus, link count turun; data baru benar-benar dilepas filesystem ketika link count mencapai nol dan tidak ada proses yang masih memegang file tersebut.

Ketika Target Dihapus #

Sekarang saatnya membuktikan perbedaan perilaku yang paling penting. Kita buat kedua jenis link, lalu hapus targetnya:

bash
mkdir -p latihan
cd latihan
printf 'Data penting.\n' > asli.txt
ln -s asli.txt tautan-simbolik
ln asli.txt tautan-keras
rm asli.txt
cat tautan-keras

Output yang Dihasilkan:

text
Data penting.

Hard link tautan-keras masih bisa dibaca penuh karena inode-nya tetap hidup. Berbeda dengan symbolic link — coba membacanya:

bash
cd latihan
cat tautan-simbolik 2>&1

Output yang Dihasilkan:

text
cat: tautan-simbolik: No such file or directory

cat melaporkan No such file or directory karena symbolic link hanya menyimpan path, dan path tersebut sudah tidak menunjuk ke file mana pun. Kondisi link semacam ini disebut dangling symlink dan sering terjadi setelah aplikasi dihapus atau direktori dipindahkan.

Memilih Antara Keduanya #

AspekSymbolic link (ln -s)Hard link (ln)
Yang disimpanpath targetrujukan langsung ke inode
Bisa menunjuk direktoriya (dengan izin)tidak, kecuali oleh root dan kasus khusus ./..
Bisa lintas filesystemyatidak, inode bersifat lokal per filesystem
Saat target dihapuslink rusak (dangling)data tetap hidup selama ada nama lain
Mengikuti target yang berpindahhanya bila path relatif ikut berpindahya, selalu

Dalam praktik sehari-hari, symbolic link jauh lebih sering dipakai: kemampuannya menunjuk direktori dan lintas filesystem membuatnya cocok untuk /etc alias, pengelolaan versi di /opt, dan dotfile yang dikelola Git. Hard link unggul ketika kita butuh cadangan ruang tanpa menyalin data — misalnya sistem backup menyimpan satu salinan fisik untuk file yang tidak berubah.

Link adalah alat yang membuat pohon direktori Linux lentur: satu data, banyak pintu masuk. Dengan pemahaman inode dan kedua jenis link ini, kita siap melihat bagaimana perangkat penyimpanan utuh dipasang ke pohon direktori — konsep mount yang dibahas pada Chapter Mount dan Unmount.