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

Sanallaştırma Virtualization Nedir ?

Sanallaştırma Virtualization Nedir ?

Sanallaştırma, bir fiziksel makinenin işlemcisini, belleğini ve diskini birden çok bağımsız makineye bölmektir. Pratik sonucu şudur: bir sunucu satın alma kararı ile o sunucuda çalışacak sistemleri belirleme kararı birbirinden ayrılır — donanım geldikten sonra kaç makineye böleceğinize istediğiniz zaman karar verirsiniz.

İşletim Sistemi (Operating System) Nedir ve Nasıl Çalışır?

İşletim Sistemi (Operating System) Nedir ve Nasıl Çalışır?

Bilgisayarlar, karmaşık işlemleri gerçekleştirebilmek ve kullanıcıların bilgisayarı etkin bir şekilde yönetebilmek için işletim sistemlerine ihtiyaç duyarlar. İşletim sistemi (Operating System), donanım ve yazılım arasında bir köprü görevi görerek bilgisayarın temel işlevlerini yönetir ve kullanıcıların bilgisayarı verimli bir şekilde kullanmalarını sağlar. Bunu bir bakıma orkestra şefine benzetilebilir, Koordinasyon ve Yönetim, Zamanlama ve Hızlandırma, Hata Yönetim ve İletişim ve Arabuluculuk(Uygulamalar ve Donanım arasında)

GNU/Linux’a İlk Adım: Temel Kabuk Kavramları

GNU/Linux’a İlk Adım: Temel Kabuk Kavramları

GNU/Linux’u keşfetmek, bilgisayar dünyasında yolculuğa başlamak isteyenler için harika bir adımdır. GNU/Linux’un temel kabuk kavramlarına bir bakış atarak, yeni başlayanlar için temel bilgiler sağlayacağız.