
Symbolic Link ve Hard Link
- Murat Akpınar
- Linux öğrenme yolculuğu
- 17 Ağustos 2023
İçindekiler
Bir dosyayı sildiniz ve yerinde duran bağlantı hâlâ orada — ama artık hiçbir şeye açılmıyor. Ya da tam tersi: dosyayı sildiniz, du çıktısında yer boşalmadı. İkisi de aynı sorunun iki yüzüdür: Linux’ta bir dosya adı ile dosyanın kendisi ayrı şeylerdir ve ln komutunun iki farklı biçimi bu ikisini farklı uçlarından bağlar.
Bu yazıda ln ile ln -s arasındaki farkı inode düzeyinde göreceğiz: hangisi kaynak silinince ayakta kalır, hangisi dosya sistemi sınırını geçemez ve -s‘yi unuttuğunuzda neden hata almadan yanlış sonucu alırsınız.
Önce Temel: Dosya Adı ile Dosya Aynı Şey Değil
Linux’ta bir dosyanın içeriği, izinleri ve blok adresleri inode adlı bir kayıtta durur. Dosya adı ise inode’a işaret eden bir dizin girdisinden ibarettir. ls -i ile bir dosyanın inode numarasını görebilirsiniz.
Bu ayrım her şeyi açıklar: ln yeni bir dizin girdisi açıp aynı inode’u gösterir, ln -s ise içinde bir yol yazan yeni bir dosya oluşturur. Biri veriye, diğeri isme bağlanır.
İkisini Yan Yana Kurmak
Bir dosya oluşturup her iki türden birer bağlantı verelim:
echo "veri" > rapor.txt
ln rapor.txt sert.txt # hard link
ln -s rapor.txt yumusak.txt # symbolic link
ls -li çıktısında fark ilk sütunda, yani inode numarasında görünür:
ls -li
# 189657 -rw-r--r-- 2 murat murat 5 Ağu 29 19:27 rapor.txt
# 189657 -rw-r--r-- 2 murat murat 5 Ağu 29 19:27 sert.txt
# 189658 lrwxrwxrwx 1 murat murat 9 Ağu 29 19:27 yumusak.txt -> rapor.txt
Okunacak üç şey var:
rapor.txtilesert.txt‘in inode numarası aynı (189657). İkisi iki dosya değil, aynı dosyanın iki adıdır. Hangisini açarsanız açın aynı veriye ulaşırsınız.- Üçüncü sütundaki
2bağlantı sayacıdır. O inode’a kaç ad işaret ediyorsa o kadar. Hard link eklemek bu sayacı artırır. yumusak.txt‘in inode’u ayrı (189658) ve türül. İçinde veri değil,rapor.txtyazan bir yol vardır — boyutunun 9 bayt olmasının sebebi budur,rapor.txttam olarak 9 karakter.
Kaynağı Silince Ne Olur
Fark asıl burada ortaya çıkar. Orijinal adı silelim:
rm rapor.txt
ls -li
# 189657 -rw-r--r-- 1 murat murat 5 Ağu 29 19:27 sert.txt
# 189658 lrwxrwxrwx 1 murat murat 9 Ağu 29 19:27 yumusak.txt -> rapor.txt
cat sert.txt
# veri
cat yumusak.txt
# cat: yumusak.txt: No such file or directory
rm dosyayı silmez, bir adı siler. Sayaç 2‘den 1‘e düştü; inode hâlâ bir ad tarafından gösterildiği için veri duruyor ve sert.txt üzerinden okunabiliyor. Veri ancak sayaç sıfıra indiğinde serbest bırakılır.
Sembolik bağlantı ise kırıldı: içindeki yol artık var olmayan bir adı gösteriyor. Dosyanın kendisi silinmediği hâlde bağlantı çalışmıyor — çünkü o hiçbir zaman dosyaya değil, adına bağlıydı.
Diskte yer açmadan dosya silmenin bir sebebi de budur: silinen dosyayı çalışan bir süreç hâlâ açık tutuyorsa sayaç sıfırlanmaz.
dfdoluykenduboş gösteriyorsa bakılacak yerlsof +L1‘dir.
Hard Link’in İki Sınırı
Sembolik bağlantı neredeyse her şeye bağlanabilir; hard link bağlanamaz. İki sert kural vardır ve ikisi de aynı sebepten gelir — hard link bir inode’a işaret eder, inode numaraları ise yalnızca kendi dosya sistemi içinde anlamlıdır.
1. Dosya sistemi sınırını geçemez:
ln /veri/rapor.txt /home/murat/rapor.txt
# ln: failed to create hard link '/home/murat/rapor.txt'
# => '/veri/rapor.txt': Invalid cross-device link
Ayrı bir disk ya da bölüme bağlanacaksanız tek seçeneğiniz ln -s‘tir. Sembolik bağlantı içinde bir yol taşıdığı için sınır tanımaz.
2. Dizine hard link verilemez:
ln belgeler belgeler2
# ln: belgeler: hard link not allowed for directory
Sebep, dosya sistemi ağacında döngü oluşmasını engellemektir: bir dizin kendi atalarından birine hard link’lense find ya da du sonsuza kadar dönerdi. Dizin bağlamak istiyorsanız yine ln -s.
-s‘yi Unutursanız Hata Almazsınız
En sık yapılan hata budur ve tehlikeli olması sessizce çalışmasından kaynaklanır:
ln -s /opt/uygulama/config.yml ayarlar.yml # istediğiniz
ln /opt/uygulama/config.yml ayarlar.yml # -s unutuldu
İkincisi de sorunsuz çalışır, hata vermez. Ama artık ayarlar.yml bir referans değil, aynı dosyanın ikinci adıdır. Sonuç iki noktada ısırır:
- Uygulama
config.yml‘i yeni bir dosyayla değiştirdiğinde (birçok araç dosyayı düzenlemek yerine yenisini yazıp eskisinin üstüne taşır) yeni dosyanın inode’u farklı olur veayarlar.ymleski içeriğe bağlı kalır. Sembolik bağlantı olsaydı yeni dosyayı gösteriyor olurdu. - Kaynak dizini komple sildiğinizde yer boşalmaz, çünkü inode’a hâlâ sizin adınız işaret etmektedir.
Kurduğunuz bağlantının hangi tür olduğunu ls -l ile doğrulayın: sembolik bağlantı satırı l ile başlar ve -> ile hedefini gösterir. Hard link satırı normal bir dosyadan ayırt edilemez — tek ipucu bağlantı sayacının 1’den büyük olmasıdır.
Sonuç
- Sembolik bağlantı yola, hard link veriye bağlanır. Kaynağı sildiğinizde sembolik bağlantı yerinde kalır ama kırılır; hard link ise aynı veriye ikinci bir giriş olduğu için veri ayakta kalmaya devam eder.
- Hard link dosya sistemi sınırını geçemez. Başka bir disk bölümüne ya da farklı bir dosya sistemine bağlanacaksanız tek seçeneğiniz
ln -s‘tir. -sunutulduğunda hata almazsınız, yanlış bağlantıyı kurarsınız.lnvarsayılan olarak hard link üretir; komut sorunsuz çalışır, sonuç beklediğiniz olmaz.
Yol haritasında sırada bu dosyaların hangi dizinde durduğu var: Dosya ve Dizin Hiyerarşisi. Serinin tamamına GNU/Linux Öğrenme Yolculuğu sayfasından ulaşabilirsiniz.


