Linux'ta Hard Link ve Symbolic Link Arasındaki Farklar ve Kullanım Alanları

Linux'ta dosyalara farklı isimlerle erişmenin iki yolu: hard link ve symbolic link. Bu makalede aralarındaki temel farklar, inode kavramı ve hangi durumlarda hangisini kullanmanız gerektiği detaylı olarak açıklanıyor.

L
Linuxize
2 görüntülenme
Linux'ta Hard Link ve Symbolic Link Arasındaki Farklar ve Kullanım Alanları

Linux'ta Hard Link ve Symbolic Link Arasındaki Farklar ve Kullanım Alanları

Linux sistemlerinde bir dosyaya birden fazla isimle erişmek için iki farklı yöntem kullanabilirsiniz: hard link (sert bağlantı) ve symbolic link (sembolik bağlantı). Bu bağlantılar ln komutu ile oluşturulur ve dizin listelerinde benzer görünürler, ancak çalışma prensipleri tamamen farklıdır. Yanlış bağlantı türünü seçmek, dosyanın taşınması durumunda bağlantının kopması veya orijinal dosya silindikten sonra bile bağlantının yer kaplamaya devam etmesi gibi beklenmedik sorunlara yol açabilir.

Bu rehberde hard link ve symbolic link arasındaki farklar, inode kavramı, bağlantılar hangi durumlarda bozulur ve hangi bağlantı türünün hangi senaryolarda tercih edilmesi gerektiği detaylı olarak açıklanmaktadır.

Inode Nedir?

Linux'ta bir dosyanın nasıl saklandığını anlamak için öncelikle inode kavramını bilmeniz gerekir. Her dosyanın verileri, dosya sisteminde bir inode tarafından izlenir. Inode, dosyanın meta verilerini (izinler, sahibi, boyutu, zaman damgaları) ve diskteki veri konumunu içeren bir yapıdır. Dosya adı ise dosyanın kendisi değil, bir dizin girdisidir ve bir inode'a işaret eder. Inode ise veriyi işaret eder.

Bu ayrım, hard link ve symbolic link arasındaki farkın temelini oluşturur:

  • Hard link: Aynı inode'a işaret eden başka bir dizin girdisidir.
  • Symbolic link: Başka bir dosya veya dizinin yolunu içeren ayrı bir küçük dosyadır.

ls -i komutu ile inode numaralarını görüntüleyebilirsiniz:

$ ls -i document.txt
1572881 document.txt

Soldaki sayı inode numarasıdır. Aynı inode numarasına sahip iki isim aynı dosyadır.

Bir hard link, mevcut bir inode'a başka bir isim daha ekler. Her iki isim de eşittir; hiçbiri "orijinal" değildir. Hard link oluşturmak için ln komutunu seçenek kullanmadan çalıştırın:

$ ln document.txt backup.txt

Artık hem document.txt hem de backup.txt aynı inode'a sahiptir. Bunu doğrulamak için ls -li komutunu kullanın:

$ ls -li document.txt backup.txt
1572881 -rw-r--r-- 2 dejan dejan 102 Jan 1 09:00 backup.txt
1572881 -rw-r--r-- 2 dejan dejan 102 Jan 1 09:00 document.txt

Her iki dosya da inode 1572881'yi paylaşır. İzinlerin yanındaki 2 sayısı, bağlantı sayısıdır (link count). Artık inode'un iki ismi vardır. Herhangi bir isimle yapılan düzenlemeler aynı veriyi değiştirir, çünkü yalnızca bir veri kümesi vardır.

Önemli: Hard linkler, her iki isim de eşittir. Hiçbiri "orijinal" değildir. Bu nedenle, birini silmek dosyanın kendisini silmez, yalnızca bağlantı sayısını azaltır.

Dosyayı silmek için:

$ rm document.txt

backup.txt hala tüm verileri içerir ve bağlantı sayısı 1'e düşer. Dosya, son isim de kaldırıldığında serbest bırakılır.

Hard Linklerin Sınırlamaları

Hard linkler, inode'ların nasıl çalıştığına bağlı olarak iki önemli sınırlamaya sahiptir:

  1. Dosya sistemleri arasında geçiş yapamazlar: Bir inode numarası yalnızca tek bir dosya sisteminde anlamlıdır. Bu nedenle, hard link ve hedefi aynı dosya sisteminde bulunmalıdır.
  2. Dizinlere bağlantı oluşturamazsınız: Bu, dizin ağacında döngüler oluşturmanıza izin vereceği için çekirdek tarafından sıradan kullanıcılar için yasaklanmıştır.

Bir symbolic link (sembolik bağlantı), başka bir dosya veya dizinin yolunu içeren ayrı bir küçük dosyadır. Kendi inode'una sahiptir ve içeriği yalnızca hedefin yoludur. Bir symbolic link oluşturmak için ln komutuna -s seçeneğini ekleyin:

$ ln -s report.txt shortcut.txt

Hem report.txt hem de shortcut.txt'yi ls -li komutu ile listeleyin:

$ ls -li report.txt shortcut.txt
1572895 -rw-r--r-- 1 dejan dejan 102 Jan 1 09:00 report.txt
1572902 lrwxrwxrwx 1 dejan dejan 10 Jan 1 09:05 shortcut.txt -> report.txt

Symbolic link farklı bir inode'a sahiptir (1572902). İzinler alanı l harfiyle başlar ve çıktıda -> işareti ile hedefi gösterilir. shortcut.txt'yi açtığınızda, çekirdek depolanan yolu takip eder ve report.txt dosyasıyla çalışır.

Symbolic Linklerin Avantajları

Symbolic linkler, yalnızca bir yol depoladığı için hard linklere göre çok daha esnektir:

  1. Farklı dosya sistemleri arasında bağlantı kurabilir: Inode numarası yerine bir yol depoladığı için farklı dosya sistemlerinde bulunan dosyalara da bağlantı oluşturabilir.
  2. Dizinlere bağlantı kurabilir: Bu, çoğu "klasöre kısayol" kurulumunun çalışma şeklidir.

Symbolic Linklerin Dezavantajları

Symbolic linklerin hedef dosyaya bağımlılığı vardır. Eğer report.txt'yi silerseniz veya yeniden adlandırırsanız, symbolic link hala eski yolu gösterir ve kopuk bir bağlantı (dangling link) haline gelir:

$ rm report.txt
$ cat shortcut.txt
cat: shortcut.txt: No such file or directory

Hata, bağlantının silinmesinden değil, hedefin eksikliğinden kaynaklanır. Kopuk bir symbolic link ls -l komutu ile hala görülebilir:

$ ls -l shortcut.txt
lrwxrwxrwx 1 dejan dejan 10 Jan 1 09:05 shortcut.txt -> report.txt

Bağlantı hala orada durur, ancak hiçbir yere işaret etmez. Hedefin taşınması da bir symbolic linki aynı şekilde bozar, ancak hard link etkilenmez çünkü hard link bir yola bağlı değildir.

Hard Link ve Symbolic Link Arasındaki Ana Farklar

Aşağıdaki tabloda iki bağlantı türünün karşılaştırması bulunmaktadır:

Özellik Hard Link Symbolic Link
Neye işaret eder? Aynı inode (veri) Başka bir ismin yolu
Kendi inode'una sahip mi? Hayır, hedefinkiyle paylaşır Evet, ayrı inode
Dosya sistemleri arasında geçiş yapabilir mi? Hayır Evet
Dizinlere bağlantı kurabilir mi? Hayır Evet
Hedef silindiğinde ne olur? Veri kalır Kopuk bağlantı olur
Hedef taşındığında ne olur? Kalır Bağlantı kopar
Nasıl oluşturulur? ln hedef isim ln -s hedef isim

Hangi Bağlantı Türü Kullanılmalı?

Günlük kullanımda çoğu durumda symbolic link tercih edilmelidir. Dizinlere bağlantı kurma, başka bir diskteki dosyaya işaret etme veya hedefin daha sonra değiştirilebileceği bir kısayol oluşturma gibi durumlarda symbolic link gereklidir. Ayrıca, ilişkilerin kolayca anlaşılmasını sağlayan -> hedef gösterimi de avantajdır. Mevcut yapılandırma dosyalarının çoğu ve /etc/alternatives dizinindeki girişler tam da bu nedenlerle symbolic linklerle yönetilir.

Hard link kullanmanız gereken durumlar:

  1. Tek bir dosya sistemi üzerinde iki ismin de aynı dosya olması gerektiğinde.
  2. Bir ismin silinmesi durumunda verilerin kalmasını istediğinizde.
  3. Yedekleme ve anlık görüntü (snapshot) araçları, değiştirilmeyen dosyaları paylaşmak için hard linkleri kullanır. Bu sayede veriler yalnızca bir kez depolandığı için verimli bir şekilde depolama alanı tasarrufu sağlanır.

Sıkça Sorulan Sorular

  1. Hard link ve symbolic link arasındaki temel fark nedir?

    Bir hard link, aynı inode'a işaret eden başka bir isimdir ve doğrudan dosyanın verilerini paylaşır. Bir symbolic link ise başka bir ismin yolunu içeren ayrı bir dosyadır. Hedefi silmek hard linki çalışır bırakırken, symbolic linki koparır.

  2. Neden iki disk arasında hard link oluşturamıyorum?

    Bir hard link, inode numarasına işaret eder ve bu numara yalnızca tek bir dosya sisteminde anlamlıdır. Başka bir dosya sistemindeki hedefin inode numarası, ilk dosya sisteminde anlamlı olmadığı için çekirdek hard link oluşturmayı reddeder. Bunun yerine symbolic link kullanmalısınız.

  3. Bir dosyanın symbolic link mi olduğunu nasıl anlarım?

    ls -l komutunu çalıştırın. Bir symbolic linkin izinler alanı l harfiyle başlar ve çıktıda -> işareti ile hedef gösterilir. Bir hard link normal bir dosya gibi görünür, ancak ls -li komutu aynı inode numarasını paylaştığını gösterir.

  4. Orijinal dosyayı sildiğimde hard link ne olur?

    Hiçbir şey kaybolmaz. İki isim de eşittir, bu nedenle birini silmek yalnızca bağlantı sayısını azaltır. Veriler, inode'a işaret eden son isim de kaldırıldığında serbest bırakılır.

Sonuç

Hard link ve symbolic link arasındaki fark, her birinin neye işaret ettiğine bağlıdır: Bir hard link, aynı inode ve veriye başka bir isim eklerken, bir symbolic link kopabilecek bir yola işaret eden bir pointer'dır. Dizinlere bağlantı kurma, farklı disklerdeki dosyalara işaret etme ve hedefi daha sonra değişebilecek kısayollar oluşturma gibi durumlarda symbolic link kullanın. Tek bir dosya sistemi üzerinde aynı dosyanın kalıcı isimlerini istediğinizde ise hard link kullanın. Komutlar hakkında daha fazla bilgi için symbolic link oluşturma ve symbolic link silme rehberlerimize göz atabilirsiniz.

Kaynak

Linuxize