Yeni yazı: Active Directory Sağlık Kontrolü: krbtgt Rotasyonu ve Hesap Yaşam Döngüsü
Symbolic Link ve Hard Link

Symbolic Link ve Hard Link

İç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.txt ile sert.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 2 bağ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.txt yazan bir yol vardır — boyutunun 9 bayt olmasının sebebi budur, rapor.txt tam 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. df doluyken du boş gösteriyorsa bakılacak yer lsof +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 ve ayarlar.yml eski 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.
  • -s unutulduğunda hata almazsınız, yanlış bağlantıyı kurarsınız. ln varsayı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.

Paylaş :

İlgili Yazılar

Merhaba Dünya!

Merhaba Dünya!

Bilişim dünyasına olan ilgim çocukluğumdan beri vardı. Bilgisayarlar ve teknolojiyle iç içe olmak beni her zaman cezbetmişti. Üniversitede Bilişim Teknolojileri alanında eğitim aldım ve bilişim dünyasının kapılarını aralamak için adım attım.

Mutlak Yol ve Bağıl Yol Kavramları

Mutlak Yol ve Bağıl Yol Kavramları

Bir önceki yazıda kabuktaki ilk komutları çalıştırdık ve listenin en başına pwd‘yi koyduk. O komutu neden bu kadar öne aldığımızı burada açıklıyoruz.

Subnet Calculator

Subnet Calculator

Subnet, büyük bir IP ağını daha küçük, daha yönetilebilir parçalara bölen bir yapıdır. Alt ağlar, ağ trafiğini daha iyi yönetmek, güvenliği artırmak ve kaynakları daha verimli kullanmak için kullanılır. Her alt ağ, kendi benzersiz IP adres aralığına ve alt ağ maskesine sahip olabilir. Subnetler, ağdaki cihazların birbirleriyle doğrudan iletişim kurabilmeleri ve aynı alt ağda bulunan diğer cihazlara erişebilmeleri için bir köprü görevi görür. Alt ağlar, bir ağı daha küçük, daha ölçeklenebilir ve daha organize bir yapıya dönüştürerek ağ yöneticilerine daha fazla kontrol ve esneklik sağlar.