Topik ini membahas dua cara membuat satu berkas yang sama dapat dijangkau melalui lebih dari satu nama, yaitu symlink (tautan simbolik) dan hard link (tautan keras). Symlink menyimpan jalur menuju targetnya, sedangkan hard link memberi nama tambahan bagi inode yang sama, yakni catatan internal sistem berkas yang menyimpan metadata dan lokasi data sebuah berkas. Setelah membacanya, kedua jenis tautan dapat dibuat, dibedakan, dan dipilih sesuai kebutuhannya.
Symlink: tautan yang menyimpan jalur#
Symlink adalah berkas khusus yang isinya berupa jalur menuju berkas lain, dibuat dengan bentuk ln -s target tautan. Setiap pembacaan lewat symlink diteruskan oleh sistem ke targetnya, sehingga bekerja seperti pintasan. Karena yang disimpan hanyalah jalur, symlink bebas menunjuk ke direktori maupun ke berkas pada sistem berkas lain.
# siapkan direktori kerja yang bersih
rm -rf /tmp/kerja-link
mkdir -p /tmp/kerja-link
cd /tmp/kerja-link# buat berkas asli
echo "isi catatan versi 1" > catatan.txt
# buat symlink yang menunjuk ke berkas asli
ln -s catatan.txt penunjuk.txt
# membaca lewat symlink sama dengan membaca aslinya
cat penunjuk.txt
# symlink menyimpan jalur tujuannya
readlink penunjuk.txtisi catatan versi 1
catatan.txtPerintah cat penunjuk.txt tidak menemukan data apa pun di dalam penunjuk.txt, melainkan membaca catatan.txt lewat jalur yang tersimpan di dalamnya. Perintah readlink menampilkan isi symlink itu apa adanya, yaitu catatan.txt. Pada ls -l, symlink terlihat dari huruf l pada kolom izin beserta panah -> menuju targetnya.
Symlink yang menggantung#
Symlink tidak mengunci targetnya. Apabila targetnya dipindah atau dihapus, tautannya tetap ada tetapi menunjuk ke jalur yang sudah tidak valid, dan kondisi ini disebut dangling symlink. Blok berikut memicu kondisi tersebut lalu memperbaikinya dengan satu perintah.
# pindahkan berkas aslinya
mv catatan.txt catatan-lama.txt
# symlink kini menunjuk ke jalur yang tidak ada
cat penunjuk.txt
# arahkan ulang symlink ke nama yang baru
ln -sf catatan-lama.txt penunjuk.txt
cat penunjuk.txtcat: penunjuk.txt: No such file or directory
isi catatan versi 1Pesan No such file or directory muncul bukan karena penunjuk.txt hilang, melainkan karena jalur catatan.txt di dalamnya sudah tidak valid. Opsi -f membuat tautan lama ditimpa tanpa bertanya, sehingga ln -sf cukup untuk mengarahkan ulang tautan ke catatan-lama.txt. Isi berkas tidak pernah hilang sepanjang kejadian ini, karena yang rusak hanyalah jalur rujukannya.
Hard link: nama kedua untuk berkas yang sama#
Hard link dibuat dengan ln target nama-baru tanpa opsi -s. Hasilnya bukan berkas penunjuk, melainkan nama tambahan yang terhubung ke inode yang sama dengan nama lama. Karena keduanya menunjuk catatan yang sama, tidak ada nama yang lebih utama: mengganti isi lewat salah satu nama mengubah berkas itu untuk semua namanya.
# hapus symlink agar contoh berikutnya bersih
rm penunjuk.txt
# ganti nama berkas menjadi utama.txt
mv catatan-lama.txt utama.txt
# buat hard link dengan nama kedua
ln utama.txt salinan-keras.txt
# kedua nama merujuk berkas yang sama
find . -samefile utama.txt
# angka pertama adalah jumlah hard link berkas tersebut
stat -c "%h %n" utama.txt salinan-keras.txt./utama.txt
./salinan-keras.txt
2 utama.txt
2 salinan-keras.txtPerintah find -samefile mencantumkan kedua nama karena keduanya merujuk inode yang sama, sedangkan angka 2 pada keluaran stat adalah jumlah hard link yang dimiliki berkas tersebut. Selama angka ini lebih dari satu, data berkasnya masih dirujuk oleh nama lain. Diagram berikut menggambarkan perbedaan struktur hard link dan symlink.
Perubahan isi lewat salah satu nama langsung terlihat lewat nama lainnya.
# tambahkan satu baris lewat nama kedua
echo "baris tambahan" >> salinan-keras.txt
# perubahan terlihat juga lewat nama pertama
cat utama.txtisi catatan versi 1
baris tambahanKedua nama bukanlah salinan yang terpisah, melainkan pintu masuk berbeda menuju data yang sama. Tidak ada mekanisme sinkronisasi yang perlu dijalankan, karena yang disunting memang satu berkas yang sama. Sifat inilah yang membedakan hard link dari penyalinan biasa.
Melepas salah satu nama#
Menghapus salah satu nama hard link hanya melepas nama tersebut, bukan isinya.
# menghapus satu nama tidak menghapus isinya
rm utama.txt
# jumlah hard link turun menjadi satu
stat -c "%h %n" salinan-keras.txt
# isi tetap bisa dibaca lewat nama yang tersisa
cat salinan-keras.txt1 salinan-keras.txt
isi catatan versi 1
baris tambahanJumlah hard link turun menjadi 1, dan isi tetap utuh karena data benar-benar dibebaskan hanya ketika nama terakhirnya dilepas. Angka pada stat disebut jumlah tautan (link count) dan dihitung sendiri oleh sistem berkas, sehingga pembersihan data tidak memerlukan pemindaian nama lain. Direktori bahkan selalu memiliki angka minimal dua karena entri . miliknya sendiri. Di sinilah terlihat makna sebenarnya dari rm: perintah itu melepas tautan nama, dan pembersihan data menyusul otomatis hanya bila tidak ada nama lain yang memegangnya.
Perbedaan mendasar dan batasannya#
Perbedaan kedua jenis tautan paling mudah dilihat dari isi yang disimpan masing-masing dan dari apa yang terjadi ketika targetnya hilang.
| Aspek | Symlink | Hard link |
|---|---|---|
| Yang disimpan | jalur menuju target | nomor inode |
| Menunjuk direktori | bisa | tidak bisa |
| Menembus sistem berkas lain | bisa | tidak bisa |
| Bila target dipindah atau dihapus | tautan menggantung | isi tetap ada selama satu nama tersisa |
Hard link terhadap direktori memang dilarang, dan blok berikut menunjukkan penolakannya secara langsung.
# hard link tidak berlaku untuk direktori
mkdir contoh-direktori
ln contoh-direktori tautan-direktoriln: contoh-direktori: hard link not allowed for directoryPesan hard link not allowed for directory adalah batasan yang disengaja: pohon direktori harus tetap berupa pohon, sedangkan hard link antar direktori dapat membentuk lingkaran yang membuat penelusuran tidak pernah selesai. Untuk direktori, symlink adalah satu-satunya pilihan.
Kasus penggunaan#
Symlink paling sering dipakai untuk pergantian versi. Sebuah aplikasi dapat dipasang di /opt/aplikasi-2.1 sementara jalur /opt/aplikasi berupa symlink yang menunjuk ke sana. Pembaruan tinggal mengarahkan ulang tautannya, dan mundur ke versi lama sama mudahnya. Pola yang sama dipakai untuk berkas konfigurasi pribadi: berkas aslinya dikelola di dalam satu repositori, lalu /home/kal/.gitconfig misalnya dibuat sebagai symlink menuju berkas di repositori itu. Dengan cara ini, versi yang sedang aktif selalu tercatat pada satu tempat saja.
Hard link unggul pada penghematan ruang untuk data yang identik. Cadangan bertingkat gaya rsync --link-dest menggunakan hard link untuk menautkan setiap berkas yang tidak berubah antar generasi cadangan, sehingga seratus generasi cadangan hanya menyimpan satu salinan data untuk berkas yang tetap sama. Varian sederhananya adalah cp -l, yaitu menyalin dengan hard link agar salinannya berbagi ruang dengan aslinya. Karena tidak menembus batas sistem berkas, pola ini diterapkan per partisi tempat cadangannya disimpan.
Kesalahan umum#
Kesalahan pertama adalah membuat symlink dengan target relatif dari lokasi yang keliru. Perintah ln -s ../data/app.conf tautan.conf yang dijalankan dari direktori yang salah menghasilkan tautan yang langsung menggantung, dan kesalahannya baru terlihat saat tautan dibaca. Gunakan jalur absolut untuk target, atau berpindah dahulu ke direktori tautannya sebelum membuat tautan.
Kesalahan kedua adalah salah memilih sasaran rm. Menghapus symlink hanya melepas tautannya dan targetnya tetap aman, sedangkan menghapus hard link hanya melepas salah satu nama. Yang berbahaya justru mengira sebuah nama adalah salinan terpisah, padahal perubahan isi lewat salah satu nama selalu terlihat pada nama-nama lainnya.
Kesalahan ketiga adalah menulis ke symlink yang menggantung. Perintah seperti echo "x" > penunjuk.txt tidak melaporkan error, melainkan menciptakan berkas baru tepat pada jalur yang tersimpan di dalam tautan, sering kali di tempat yang tidak diinginkan. Periksa dengan readlink terlebih dahulu apabila ragu.
Ringkasan#
- Symlink menyimpan jalur tujuan sehingga bebas menunjuk direktori dan sistem berkas lain, tetapi menggantung bila targetnya pindah atau dihapus.
- Hard link adalah nama tambahan untuk inode yang sama, berbagi data tanpa menggandakan ruang, dan tetap utuh selama satu nama tersisa.
- Hard link dilarang untuk direktori dan tidak menembus batas sistem berkas, sedangkan symlink tidak memiliki kedua batasan itu.
- Pergantian versi aplikasi dan konfigurasi pribadi cocok dengan symlink, sedangkan cadangan hemat ruang cocok dengan hard link.
Referensi#
- ln(1) — Debian manpages
— Opsi
-sdan-fpada ln beserta perilaku pembuatan tautannya. - symlink(7) — Linux man-pages project — Perilaku symlink di tingkat kernel, termasuk kasus tautan yang menggantung.