Linux dosya sistemiyle ciddi işler yapmaya başladığınızda, er ya da geç karşınıza çıkan iki kavram vardır: sembolik linkler ve sabit linkler. Yüzeysel bakıldığında ikisi de “bir dosyaya kısayol oluşturur” gibi görünür, ama altında yatan mekanizmalar birbirinden çok farklıdır. Bu farkı anlamadan sistem yönetimi yapmak, karanlıkta iş yapmaya benzer. Yanlış link türünü seçmek; bozuk konfigürasyonlara, anlaşılmaz hatalara ve saatlerce süren debug seanslarına yol açabilir. Bu yazıda ln komutunu tüm detaylarıyla ele alacağız, gerçek dünya senaryolarıyla pekiştireceğiz.
İnode: Her Şeyin Başladığı Yer
Linkleri anlamak için önce inode kavramını kavramak gerekiyor. Linux dosya sisteminde her dosya, aslında iki ayrı şeyden oluşur: inode ve dosya adı. İnode, dosyanın gerçek kimliğidir; içindeki veri bloklarının disk üzerindeki konumunu, izinleri, sahipliği, boyutu ve zaman damgalarını saklar. Dosya adı ise sadece o inode’a işaret eden bir etikettir.
Bunu şöyle düşünün: İnode bir ev, dosya adı ise o evin kapı numarasıdır. Aynı eve birden fazla kapı numarası verebilirsiniz; hepsi aynı yere açılır. İşte sabit link tam da budur.
Bir dosyanın inode numarasını görmek için:
ls -li dosya.txt
# Çıktı: 2621441 -rw-r--r-- 1 ahmet ahmet 1024 Ara 15 10:30 dosya.txt
# İlk sütundaki sayı inode numarasıdır
Sabit Link (Hard Link) Nedir?
Sabit link, mevcut bir inode’a yeni bir isim eklemektir. Yani iki farklı dosya adı, diskte tamamen aynı veriyi gösterir. Hiçbiri “orijinal”, hiçbiri “kopya” değildir; ikisi de eşit derecede gerçektir.
# Sabit link oluşturma
ln kaynak.txt hedef.txt
# Her ikisinin inode numarasının aynı olduğunu görelim
ls -li kaynak.txt hedef.txt
# 2621441 -rw-r--r-- 2 ahmet ahmet 1024 Ara 15 10:30 hedef.txt
# 2621441 -rw-r--r-- 2 ahmet ahmet 1024 Ara 15 10:30 kaynak.txt
# Link sayısının 2'ye çıktığına dikkat edin
İkinci sütundaki “2” rakamı, bu inode’a kaç tane isim (hard link) bağlı olduğunu gösterir. Yeni bir dosya oluşturduğunuzda bu sayı 1’dir. Her sabit link eklediğinizde bir artar.
Sabit linklerin kritik bir özelliği: Kaynak dosyayı silseniz bile, inode ve veriler diskte kalmaya devam eder. Çünkü link sayısı sıfıra düşmedikçe işletim sistemi o disk bloklarını serbest bırakmaz.
# Orijinal dosyayı silelim
rm kaynak.txt
# Hedef hala çalışıyor
cat hedef.txt
# İçerik hala erişilebilir durumda
ls -li hedef.txt
# 2621441 -rw-r--r-- 1 ahmet ahmet 1024 Ara 15 10:30 hedef.txt
# Link sayısı tekrar 1'e düştü
Sabit Linklerin Kısıtlamaları
Sabit linkler her durumda kullanılamaz:
- Dizinler için kullanılamaz: Sabit link sadece dosyalar için çalışır. Dizinler için sabit link oluşturmaya çalışırsanız hata alırsınız. (Sistem dahili olarak
.ve..için kullanır, ama kullanıcı seviyesinde yasaktır.) - Farklı dosya sistemleri arasında çalışmaz: Hem kaynak hem hedef aynı dosya sisteminde olmalıdır.
/dev/sda1üzerindeki bir dosyaya/dev/sdb1‘den sabit link oluşturamazsınız. İnode numaraları her dosya sistemine özgüdür.
Sembolik Link (Symbolic Link / Symlink) Nedir?
Sembolik link, bir yola işaret eden özel bir dosya türüdür. Windows’taki kısayol (.lnk) dosyalarına benzetebiliriz ama çok daha güçlüdür. Sembolik link, içinde sadece hedef yolun metnini barındıran küçük bir dosyadır. Sistem bu dosyaya erişmeye çalıştığında, otomatik olarak o yola yönlendirir.
# Sembolik link oluşturma (-s parametresiyle)
ln -s /etc/nginx/nginx.conf nginx.conf.link
# Link türünü görelim
ls -la nginx.conf.link
# lrwxrwxrwx 1 ahmet ahmet 22 Ara 15 10:35 nginx.conf.link -> /etc/nginx/nginx.conf
# Başındaki 'l' harfi sembolik link olduğunu gösterir
Sembolik linkler sabit linklerden temel olarak farklıdır:
- Farklı dosya sistemleri arasında çalışır: Hedef tamamen farklı bir diskte bile olabilir.
- Dizinlere link oluşturulabilir: Dizinler için sembolik link kullanmak gayet normaldir.
- Hedef silinirse link “bozulur”: Kaynak dosya silindiğinde, sembolik link var olmayan bir yolu göstermeye devam eder. Buna “dangling symlink” denir.
- Farklı inode’a sahiptir: Sembolik link kendi inode’u olan bağımsız bir dosyadır.
# Dangling symlink örneği
ln -s /tmp/gecici.txt gecici_link.txt
rm /tmp/gecici.txt
ls -la gecici_link.txt
# lrwxrwxrwx 1 ahmet ahmet 16 Ara 15 10:40 gecici_link.txt -> /tmp/gecici.txt
cat gecici_link.txt
# cat: gecici_link.txt: Böyle bir dosya ya da dizin yok
# Link var ama hedefi yok
Bozuk linkleri sisteminizde bulmak için:
find /home/ahmet -type l ! -exec test -e {} ; -print
# -type l: Sadece sembolik linkler
# ! -exec test -e: Hedefi var olmayan linkler
ln Komutunun Parametreleri
ln komutunun en sık kullanılan parametrelerini inceleyelim:
- -s: Sembolik link oluşturur. Bu parametre olmadan sabit link oluşturulur.
- -f: Hedef konumda zaten bir dosya varsa üzerine yazar (force).
- -i: Üzerine yazmadan önce kullanıcıya sorar (interactive).
- -n: Hedef bir sembolik linkse, onu takip etmeyip üzerine yazar.
- -v: Ne yaptığını gösterir (verbose).
- -r: Sembolik linki kaynak dosyaya göre göreceli yol olarak oluşturur.
- -b: Üzerine yazılacak dosyaların yedeğini alır.
- –backup=numbered: Yedekleri numaralı şekilde alır.
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Konfigürasyonu
Nginx veya Apache kullanıyorsanız, sites-available ve sites-enabled yapısı tamamen sembolik linkler üzerine kuruludur. Bu yaklaşım, bir siteyi aktif etmek veya deaktif etmek için tek satır komutla çözmenizi sağlar.
# Nginx'te yeni bir site konfigürasyonu oluştur
sudo nano /etc/nginx/sites-available/myapp.conf
# Siteyi aktif et (sembolik link oluştur)
sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/myapp.conf
# Siteyi deaktif et (sadece linki sil, konfigürasyon kaybolmaz)
sudo rm /etc/nginx/sites-enabled/myapp.conf
# Tekrar aktif etmek istediğinde aynı komutu çalıştır
sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/myapp.conf
Bu yapının güzelliği şudur: Konfigürasyon dosyasını silmeden siteyi kapatıp açabilirsiniz. Birden fazla ortam için ayrı konfigürasyonlar tutabilirsiniz.
Senaryo 2: Python / Node.js Sürüm Yönetimi
Sistemde birden fazla Python sürümü kuruluyken hangi python3 komutunun çalışacağını sembolik linklerle kontrol edebilirsiniz.
# Mevcut durumu gör
ls -la /usr/bin/python3
# lrwxrwxrwx 1 root root 9 Oca 10 08:00 /usr/bin/python3 -> python3.10
# Python 3.11'e geçmek istiyorsun
sudo ln -sf /usr/bin/python3.11 /usr/bin/python3
# -f parametresi mevcut linki silip yerine yenisini koyar
python3 --version
# Python 3.11.x
Aynı mantık node, npm, java gibi araçlar için de geçerlidir. Bazı araçlar (pyenv, nvm, update-alternatives) arka planda tam olarak bu mekanizmayı kullanır.
Senaryo 3: Log Rotasyonu ve Sabit Link Kullanımı
Sabit linklerin en güzel kullanım alanlarından biri log yönetimidir. Bir log dosyasını bir uygulama yazmaya devam ederken, siz o dosyanın sabit linkini başka bir yere kopyalayıp güvenle analiz edebilirsiniz.
# Uygulama aktif olarak app.log'a yazıyor
# Anlık bir snapshot almak için sabit link oluştur
ln /var/log/myapp/app.log /tmp/app_snapshot.log
# Şimdi orijinal dosyayı döndür (rotate et)
mv /var/log/myapp/app.log /var/log/myapp/app.log.old
# Uygulama yeni dosyaya yazmaya devam eder
# /tmp/app_snapshot.log hala eski içeriği gösteriyor
# Çünkü sabit link aynı inode'u işaret ediyor
wc -l /tmp/app_snapshot.log
Senaryo 4: Disk Alanı Optimizasyonu ve Yedekleme
Sabit linkler, değişmeyen dosyaları çoğaltmadan yedekleme yapmayı mümkün kılar. rsync --link-dest opsiyonu bu temelde çalışır.
# Artımlı yedekleme: değişmeyen dosyalar için sabit link oluşturur
rsync -av --link-dest=/backup/2024-12-14
/home/ahmet/
/backup/2024-12-15/
# Sonuç: 2024-12-15 klasörü tam gibi görünür
# Ama değişmeyen dosyalar için ekstra disk alanı kullanılmaz
# Çünkü hepsi 2024-12-14'teki inode'ları paylaşır
du -sh /backup/2024-12-14 /backup/2024-12-15
# Her ikisi de "tam" görünür ama toplam boyut çok daha az
Senaryo 5: Dotfiles Yönetimi
Geliştiricilerin .bashrc, .vimrc, .gitconfig gibi konfigürasyon dosyalarını Git reposunda tutması yaygın bir pratiktir. Sembolik linkler bu yapıyı ayakta tutar.
# Dotfiles reposu klonlandı
git clone https://github.com/ahmet/dotfiles ~/dotfiles
# Konfigürasyonları home dizinine linkle
ln -s ~/dotfiles/.bashrc ~/.bashrc
ln -s ~/dotfiles/.vimrc ~/.vimrc
ln -s ~/dotfiles/.gitconfig ~/.gitconfig
ln -s ~/dotfiles/.tmux.conf ~/.tmux.conf
# Doğrulayalım
ls -la ~/.bashrc
# lrwxrwxrwx 1 ahmet ahmet 28 Ara 15 11:00 /home/ahmet/.bashrc -> /home/ahmet/dotfiles/.bashrc
Böylece dotfiles reposunda yapılan değişiklikler anında aktif olur. Birden fazla makinede aynı konfigürasyonu kullanmak da kolaylaşır.
Senaryo 6: Uygulama Dizini Taşıma
Bir uygulamanın veri dizinini daha büyük bir diske taşırken, uygulama konfigürasyonunu değiştirmeden bunu yapabilirsiniz.
# MySQL veri dizini doldu, yeni diske taşımak istiyoruz
sudo systemctl stop mysql
# Yeni diskin bağlı olduğu noktaya taşı
sudo mv /var/lib/mysql /mnt/bigdisk/mysql
# Sembolik link oluştur
sudo ln -s /mnt/bigdisk/mysql /var/lib/mysql
# MySQL'in görmesi gereken path hala /var/lib/mysql
# Ama gerçek veri /mnt/bigdisk/mysql'de
sudo systemctl start mysql
# Kontrol
ls -la /var/lib/
# lrwxrwxrwx 1 root root 19 Ara 15 11:15 mysql -> /mnt/bigdisk/mysql
Göreli ve Mutlak Yollar: Önemli Bir Fark
Sembolik link oluştururken mutlak yol mu yoksa göreli yol mu kullanacağınız önemlidir. Mutlak yollar her yerden çalışır ama dosyaları taşıdığınızda kırılır. Göreli yollar ise linkin bulunduğu dizine göre hesaplanır.
# Mutlak yol ile sembolik link
ln -s /home/ahmet/projects/myapp/config.ini /home/ahmet/config.ini
# Göreli yol ile sembolik link (-r parametresi otomatik hesaplar)
ln -sr /home/ahmet/projects/myapp/config.ini /home/ahmet/config.ini
# Manuel göreli yol
cd /home/ahmet
ln -s projects/myapp/config.ini config.ini
# Bu link doğru çalışır çünkü hedef path
# linkin bulunduğu /home/ahmet'e göre hesaplanır
Bir yapıyı başka bir makineye veya yola taşıyacaksanız, göreli yollu linkler çok daha sağlam bir yapı sunar.
Linklerle Çalışmak: Pratik İpuçları
Sistem yönetiminde sık kullanılan bazı operasyonlar:
# Bir symlinkin gerçekte nereye işaret ettiğini bul
readlink /usr/bin/python3
# /usr/bin/python3.10
# Tüm ara linkleri çözüp gerçek yolu bul
readlink -f /usr/bin/python3
# /usr/bin/python3.10
# Bir dizindeki tüm sembolik linkleri listele
find /etc -maxdepth 1 -type l -ls
# Sembolik linkin hedefini değiştir (önce sil, sonra yeniden oluştur)
ln -sf /usr/bin/python3.11 /usr/bin/python3
# Bir dosyanın kaç hard link'i olduğunu gör
stat dosya.txt | grep "Links"
# Links: 2
# Aynı inode'u paylaşan tüm dosyaları bul
find /home/ahmet -inum 2621441
Dikkat Edilmesi Gereken Durumlar
Döngüsel sembolik linkler: Bir link kendine ya da bir zincir oluşturacak şekilde bir diğerine işaret ederse sistem sonsuz döngüye girer. Kernel bunu belirli bir derinlikte keser ama yine de can sıkıcıdır.
# Tehlikeli örnek - yapmayın
ln -s /tmp/a /tmp/b
ln -s /tmp/b /tmp/a
# Bu iki link birbirini gösteriyor
ls /tmp/a
# ls: cannot access '/tmp/a': Çok fazla sembolik link düzeyi
cp ve mv davranışı: cp komutu varsayılan olarak sembolik linki takip eder ve hedef dosyayı kopyalar. Linkin kendisini kopyalamak için cp -P kullanın. mv ise linkin kendisini taşır, hedefi değil.
# Linkin kendisini kopyala (hedefi değil)
cp -P mylink.txt /tmp/
# mv linkin kendisini taşır
mv mylink.txt /tmp/
Tar ile yedekleme: tar varsayılan olarak sembolik linkleri takip eder ve hedef dosyayı arşive ekler. Linkin kendisini korumak için --no-dereference kullanın.
# Sembolik linkleri koruyarak arşivle
tar --no-dereference -czf yedek.tar.gz /etc/nginx/sites-enabled/
İzinler ve Sahiplik
Sembolik linklerin izinleri her zaman lrwxrwxrwx olarak görünür. Bu aldatıcıdır; asıl izinler hedef dosyanın izinleridir. Sembolik link izinlerini chmod ile değiştirmeye çalıştığınızda, bu değişiklik hedef dosyaya yansır, linkin kendisine değil.
Sabit linklerde ise durum farklıdır. Tüm hard linkler aynı inode’u paylaştığından, birisinin izinlerini değiştirmek hepsini etkiler; zaten hepsi aynı şeydir.
# Sembolik linkten izin değiştirmek hedefi etkiler
ln -s /tmp/ornek.txt /home/ahmet/ornek_link.txt
chmod 600 /home/ahmet/ornek_link.txt
# Bu komut aslında /tmp/ornek.txt'nin izinlerini değiştirdi
# Linkin sahibini değiştirmek (hedefi değil, linkin kendisini)
chown -h ahmet:ahmet /home/ahmet/ornek_link.txt
# -h parametresi sembolik linkin kendisini etkiler
Sonuç
ln komutu basit görünür ama altındaki dosya sistemi mekaniğini anlamadan kullanmak ciddi sorunlara yol açabilir. Sabit linkler, aynı dosya sistemi içinde veri bütünlüğünü korumak, disk alanı optimizasyonu ve yedekleme stratejileri için güçlü bir araçtır. Sembolik linkler ise esneklikleriyle farklı dosya sistemleri arasında köprü kurmak, dizinlere link oluşturmak ve sistemin farklı katmanlarını birbirine bağlamak için vazgeçilmezdir.
Günlük sysadmin işlerinde sembolik linkleri çok daha sık kullanacaksınız; web sunucusu konfigürasyonlarından sürüm yönetimine, dotfiles organizasyonundan disk taşıma operasyonlarına kadar her yerde karşınıza çıkacaklar. Sabit linkler ise yedekleme araçlarının ve bazı sistem operasyonlarının perde arkasında sessiz sedasız çalışmaya devam edecek.
En iyi öğrenme yöntemi, bir test ortamında bu komutları çalıştırıp ls -li, stat ve readlink ile sonuçları incelemektir. İnode numaralarının nasıl paylaşıldığını, link sayacının nasıl değiştiğini gözlerinizle gördüğünüzde her şey çok daha net oturur.