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.
Hard Link Nedir ve Nasıl Oluşturulur?
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:
- 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.
- 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.
Symbolic Link Nedir ve Nasıl Oluşturulur?
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:
- 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.
- 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:
- Tek bir dosya sistemi üzerinde iki ismin de aynı dosya olması gerektiğinde.
- Bir ismin silinmesi durumunda verilerin kalmasını istediğinizde.
- 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
-
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.
-
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.
-
Bir dosyanın symbolic link mi olduğunu nasıl anlarım?
ls -lkomutunu çalıştırın. Bir symbolic linkin izinler alanılharfiyle başlar ve çıktıda->işareti ile hedef gösterilir. Bir hard link normal bir dosya gibi görünür, ancakls -likomutu aynı inode numarasını paylaştığını gösterir. -
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.


