ln Komutu: Linux’ta Sembolik ve Sabit Bağlantı Oluşturma Rehberi

Dosya sisteminde çalışırken bir dosyaya birden fazla yerden erişmek istediğinde, ya da bir uygulamanın beklediği path’e farklı bir konumdaki dosyayı “göstermek” gerektiğinde ln komutu tam olarak bu iş için var. Linux’ta “link” oluşturma kavramı basit görünse de arka planda ne olduğunu anlamadan kullanınca ciddi sorunlarla karşılaşabilirsin. Bu yazıda hem sembolik hem de sabit bağlantıları derinlemesine ele alacağız, gerçek dünyada ne zaman hangisini kullanman gerektiğini net bir şekilde göreceğiz.

Bağlantı Türleri: Symbolic Link mi, Hard Link mi?

Linux dosya sistemi her dosyayı bir inode üzerinden takip eder. İnode, dosyanın gerçek verilerinin diskte nerede olduğunu, izinlerini, sahibini ve diğer meta verileri tutan yapıdır. Dizin girişleri ise sadece bir isim ile bir inode numarasının eşleşmesinden ibarettir.

Hard link (sabit bağlantı): Aynı inode’a işaret eden ikinci (ya da üçüncü, dördüncü…) bir dizin girişi oluşturur. Yani iki farklı isim, tamamen aynı veriye sahip olur. Biri silinse bile diğeri hayatta kalmaya devam eder çünkü inode’a olan referans sayısı sıfıra düşmediği sürece veri silinmez.

Symbolic link (sembolik bağlantı / symlink): Başka bir dosyanın ya da dizinin yolunu içeren özel bir dosyadır. Windows’taki kısayola benzetebilirsin ama çok daha güçlüdür. Sembolik link, hedef dosya silinirse “kırık” hale gelir.

ln Komutunun Temel Sözdizimi

ln [seçenekler] KAYNAK HEDEF
ln [seçenekler] KAYNAK... DIZIN

En sık kullanılan parametreler:

  • -s: Sembolik link oluşturur (symbolic)
  • -f: Hedef zaten varsa üzerine yazar (force)
  • -i: Üzerine yazmadan önce onay ister (interactive)
  • -v: Ne yaptığını ekrana yazar (verbose)
  • -n: Hedef sembolik linkse onu bir dizin gibi değil link gibi işler
  • -r: Sembolik link’i göreli yol ile oluşturur (relative, GNU coreutils 8.16+)
  • -b: Üzerine yazılacak dosyaların yedeğini alır (backup)

Hard Link Oluşturma

En basit kullanımla başlayalım. Bir dosyaya hard link oluşturmak için sadece kaynak ve hedef belirtmen yeterli:

# Temel hard link oluşturma
ln /var/log/uygulama/app.log /home/admin/app.log

# Şimdi inode numaralarını kontrol edelim
ls -li /var/log/uygulama/app.log /home/admin/app.log

Çıktıda her iki dosyanın da aynı inode numarasına sahip olduğunu göreceksin. Link sayısı sütunu da 2 olarak görünecek.

# İnode kontrolü için stat komutu daha detaylı bilgi verir
stat /var/log/uygulama/app.log
stat /home/admin/app.log

Hard link’lerin önemli bir kısıtlaması var: Farklı dosya sistemleri arasında hard link oluşturamazsın. /dev/sda1 üzerindeki bir dosyaya /dev/sda2‘den hard link oluşturmak mümkün değil. Çünkü inode numaraları dosya sistemine özeldir. Bir diğer kısıtlama ise dizinlere hard link oluşturamamandır (birkaç sistem seviyesinde istisna var ama bunları görmezden gel).

Sembolik Link Oluşturma

Günlük işlerde hard link’ten çok daha fazla kullanacağın -s seçeneğidir:

# Basit sembolik link
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf

# Verbose ile ne olduğunu görmek için
ln -sv /opt/uygulama-2.4.1 /opt/uygulama

# Ev dizininde config linki
ln -s /mnt/nas/dotfiles/.bashrc ~/.bashrc

Sembolik link oluşturduğunda ls -l çıktısında dosya adının yanında -> işareti ve hedef path görünür:

ls -la /etc/nginx/sites-enabled/
# lrwxrwxrwx 1 root root 45 Oca 15 10:23 mysite.conf -> /etc/nginx/sites-available/mysite.conf

lrwxrwxrwx satırının başındaki l harfi bu girişin bir sembolik link olduğunu gösterir.

Gerçek Dünya Senaryosu 1: Uygulama Versiyonlarını Yönetmek

Birden fazla versiyon barındıran uygulamaları yönetirken symlink kullanmak hayat kurtarır. Diyelim ki sunucunda birden fazla Python versiyonu var:

# Python versiyonları kurulu
ls /usr/local/bin/python3.10
ls /usr/local/bin/python3.11

# Aktif versiyonu symlink ile belirle
ln -sf /usr/local/bin/python3.11 /usr/local/bin/python3

# Versiyonu kontrol et
python3 --version
# Python 3.11.x

# Geriye dönmek gerekirse tek komut yeterli
ln -sf /usr/local/bin/python3.10 /usr/local/bin/python3

Burada -f seçeneği kritik. Zaten var olan bir symlink’in üzerine yazmak istiyorsan -f olmadan hata alırsın. -sf kombinasyonu en sık kullandığım şeylerden biri.

Aynı mantığı web uygulamaları için de uygulayabilirsin:

# Uygulama versiyonları
ls -la /opt/
# /opt/myapp-1.2.0/
# /opt/myapp-1.3.0/

# Aktif versiyona link ver
ln -s /opt/myapp-1.3.0 /opt/myapp

# Nginx ya da uygulama config'inde /opt/myapp kullan
# Yeni versiyon geldiğinde sadece linki güncelle:
ln -sfn /opt/myapp-1.4.0 /opt/myapp

-n seçeneği burada önemli. /opt/myapp zaten bir symlink olduğunda ve -n kullanmadığında, -sf bazen linkin içine yeni bir link oluşturabilir. -sfn bu sorunu engeller.

Gerçek Dünya Senaryosu 2: Nginx Sites-Available / Sites-Enabled

Linux’ta en klasik symlink kullanımlarından biri Nginx ya da Apache konfigürasyonu yönetimidir:

# Site config dosyasını oluştur
vim /etc/nginx/sites-available/example.com

# Siteyi aktifleştirmek için symlink oluştur
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

# Nginx'i reload et
systemctl reload nginx

# Siteyi deaktive etmek için sadece linki sil (orijinal dosya kalır)
rm /etc/nginx/sites-enabled/example.com
systemctl reload nginx

Bu pattern’ın güzelliği şu: Orijinal config dosyan her zaman sites-available‘da duruyor, sadece bir symlink ile aktif/pasif yapabiliyorsun. sites-available senin konfigürasyon arşivin gibi çalışıyor.

Gerçek Dünya Senaryosu 3: Log Dosyalarını Merkezi Bir Yerde Toplamak

Farklı uygulamaların loglarını tek bir dizinden takip etmek istiyorsun ama uygulamaların log dizinlerini değiştirmek istemiyorsun:

# Merkezi log takip dizini
mkdir -p /var/log/merkez

# Çeşitli uygulama loglarına symlink oluştur
ln -s /var/log/nginx/access.log /var/log/merkez/nginx-access.log
ln -s /var/log/nginx/error.log /var/log/merkez/nginx-error.log
ln -s /var/log/postgresql/postgresql.log /var/log/merkez/postgresql.log
ln -s /opt/myapp/logs/app.log /var/log/merkez/myapp.log

# Artık tek yerden hepsini takip edebilirsin
tail -f /var/log/merkez/*.log

# Ya da multitail ile
multitail /var/log/merkez/nginx-error.log /var/log/merkez/myapp.log

Göreli ve Mutlak Yol Farkı

Symlink oluştururken mutlak yol mu yoksa göreli yol mu kullanacağına karar vermek önemli. Her ikisinin de avantajı ve dezavantajı var.

Mutlak yol ile oluşturulan link her yerden çalışır ama dosya sistemi yapısı değişirse kırılır:

ln -s /etc/nginx/sites-available/site.conf /etc/nginx/sites-enabled/site.conf

Göreli yol ile oluşturulan link, dizin yapısı bütün olarak taşınsa bile çalışır:

# Önce sites-enabled dizinine geç
cd /etc/nginx/sites-enabled

# Göreli yol ile link oluştur
ln -s ../sites-available/site.conf site.conf

# Ya da -r seçeneği ile ln'nin bunu otomatik yapmasını sağla
ln -sr /etc/nginx/sites-available/site.conf /etc/nginx/sites-enabled/site.conf

Genel kural olarak şunu söyleyebilirim: Eğer hem kaynak hem hedef aynı root altındaysa ve bu yapının bütün olarak taşınabilmesini istiyorsan göreli yol kullan. Sistem genelinde sabit bir konumu gösteriyorsan mutlak yol daha güvenli.

Kırık Symlink’leri Tespit Etmek ve Temizlemek

Symlink kullanırken er ya da geç “kırık” (dangling/broken) linklerle karşılaşırsın. Hedef dosya silinmiş ya da taşınmış ama link hala orada duruyor:

# Kırık symlink'leri bul
find /etc/nginx/sites-enabled -xtype l

# Belirli bir dizindeki tüm kırık linkleri bul
find /opt -xtype l -print

# Kırık linkleri bul ve sil (dikkatli kullan!)
find /opt -xtype l -delete

# ls ile kırık link pembe/kırmızı renkte görünür (renk desteği olan terminallerde)
ls -la /etc/nginx/sites-enabled/

-xtype l parametresi önemli. Normal -type l sembolik linkin kendisini arar, -xtype l ise linkin gösterdiği hedefe bakarak değerlendirir. Eğer hedef yoksa link kırık demektir ve -xtype l ile bulunur.

Hard Link Senaryosu: Yedekleme Optimizasyonu

Hard link’lerin en güçlü kullanım alanlarından biri incremental backup sistemleri. rsync‘in --link-dest seçeneği tam da bunu yapar ama mantığı anlatmak için basit bir örnek:

#!/bin/bash
# Basit hard-link tabanlı yedekleme örneği

KAYNAK="/home/kullanici"
YEDEK_DIZIN="/backup"
TARIH=$(date +%Y-%m-%d)
ONCEKI="$YEDEK_DIZIN/onceki"
YENI="$YEDEK_DIZIN/$TARIH"

# Önceki yedeği temel alarak sadece değişenleri kopyala, değişmeyenlere hard link ver
rsync -a --link-dest="$ONCEKI" "$KAYNAK/" "$YENI/"

# "onceki" linkini güncelle
ln -sfn "$YENI" "$ONCEKI"

echo "Yedekleme tamamlandı: $YENI"

Bu yaklaşımın güzelliği şu: Her yedekleme dizini tam ve bağımsız görünür ama aslında değişmemiş dosyalar hard link sayesinde disk alanı tüketmez. Aynı inode’a birden fazla link olduğu için her dosya sadece bir kez diskte yer kaplar.

/proc ve /sys Üzerinde Çalışırken Dikkat

Sanal dosya sistemlerinde (/proc, /sys) ln beklendiği gibi çalışmaz. Bu dizinlerdeki “dosyalar” gerçek dosya değil, kernel tarafından anlık üretilen veri akışlarıdır. Hard link oluşturmaya çalışırsan hata alırsın, sembolik link oluşturabilirsin ama anlamlı olmaz.

# Bu çalışmaz
ln /proc/cpuinfo /tmp/cpuinfo_link
# ln: '/proc/cpuinfo': hard link not allowed for special file

# Bu çalışır ama /proc her process başladığında değişir
ln -s /proc/cpuinfo /tmp/cpuinfo_symlink

Symlink ile Dizin Yönetimi

Symlink’leri dizinlere de verebilirsin, bu özellikle depolama yönetiminde işe yarıyor:

# /var/log dizini disk doldu, logları başka bir diske taşı
# 1. Adım: Logları yeni diske kopyala
cp -a /var/log /mnt/veri-diski/log

# 2. Adım: Orijinal dizini sil (ya da yedekle)
mv /var/log /var/log.bak

# 3. Adım: Symlink oluştur
ln -s /mnt/veri-diski/log /var/log

# 4. Adım: Her şey çalışıyor mu kontrol et
ls -la /var/log/
tail -f /var/log/syslog

# Sorun yoksa yedeği sil
rm -rf /var/log.bak

Dikkat: cp -r ya da rsync kullanırken symlink davranışını iyi anlamak gerekiyor. cp -r default olarak sembolik linkleri kopyalar (linkin kendisini), -L seçeneği ile hedefi kopyalar.

ln ile Yanlış Yapılan Yaygın Hatalar

1. Göreli yol karmaşası: Symlink oluştururken şu anda hangi dizinde olduğunun önemi var. Göreli yol belirtirken linkin bulunacağı konuma göre değil, şu anki dizine göre hesaplanır:

# Yanlış! /home/admin dizinindeyken
ln -s config/app.conf /etc/myapp/app.conf
# Bu link /etc/myapp/config/app.conf'u gösterir, yanlış!

# Doğru: Mutlak yol kullan
ln -s /home/admin/config/app.conf /etc/myapp/app.conf

# Ya da -r ile göreli yol oluştur
ln -sr /home/admin/config/app.conf /etc/myapp/app.conf

2. Dizin içine link oluşturma tuzağı: Hedef olarak var olan bir dizin verirsen link o dizinin içinde oluşturulur:

mkdir /tmp/testdir
ln -s /etc/hosts /tmp/testdir
# Bu /tmp/testdir/hosts symlink'ini oluşturur, /tmp/testdir'i değiştirmez!

# Dizinin tam adını ver
ln -s /etc/hosts /tmp/testdir/hosts_linki

3. Döngüsel sembolik link: İki symlink birbirini gösterirse sistem döngüye girer:

ln -s /tmp/link_b /tmp/link_a
ln -s /tmp/link_a /tmp/link_b

# Erişmeye çalışırsan:
cat /tmp/link_a
# Too many levels of symbolic links

Bağlantıları Kontrol Etmek için Yararlı Komutlar

# Bir dosyanın gerçek yolunu bul (symlink'leri çöz)
realpath /usr/bin/python3
readlink -f /usr/bin/python3

# Sadece bir adım çöz (zincirleme değil)
readlink /usr/bin/python3

# Bir dosyanın kaç hard link'i olduğunu göster
stat dosya.txt | grep "Links"

# Aynı inode'a sahip dosyaları bul
find /home -inum $(stat -c %i dosya.txt) 2>/dev/null

# Tüm symlink'leri listele
find /etc -type l -ls

Sonuç

ln komutu sade görünümünün arkasında gerçekten güçlü bir araç. Özetlemek gerekirse:

  • Hard link kullan: Aynı dosya sisteminde, dosya verilerinin korunması kritikse, disk alanını optimize eden yedekleme sistemleri kuruyorsan.
  • Sembolik link kullan: Farklı dosya sistemleri arasında, dizinleri link olarak göstermek istiyorsan, uygulama versiyonlarını yönetiyorsan, ya da kaynağın taşınma ihtimali varsa ve bunu yönetilebilir tutmak istiyorsan.

Günlük operasyonlarda en çok ln -sfn kombinasyonunu kullanacaksın. Deployment süreçlerinde versiyon geçişleri, Nginx/Apache site yönetimi, /etc/alternatives benzeri sistemler, hepsi bu basit mekanizma üzerine kurulu. Bir kez inode mantığını içselleştirdin mi, dosya sistemini çok daha özgürce yönetebiliyorsun.

Kırık linklere dikkat et, göreli/mutlak yol farkını aklında tut ve özellikle dizinlere link verirken hedef path’i tam olarak belirt. Bu üç kurala uyarsan ln seni hiç yanıltmaz.

Yorum yapın