ln Komutu Nedir ve Neden Önemli?
Linux dünyasında çalışıyorsan, er ya da geç ln komutuyla yüzleşmek zorunda kalacaksın. Özellikle web sunucusu yönetiyorsan, bu komut senin en yakın dostlarından biri haline gelecek. Nginx veya Apache konfigürasyonlarını yönetirken, deployment scriptleri yazarken ya da paylaşılan kütüphaneleri düzenlerken ln olmadan işlerin çok daha zor olacağını garantiyle söyleyebilirim.
Temel mantığını şöyle açıklayayım: ln komutu, bir dosya ya da dizine başka bir isimden erişmeni sağlayan bağlantılar oluşturur. İki türü var: sembolik bağlantılar (symbolic links) ve sabit bağlantılar (hard links). Bunların arasındaki fark sandığından çok daha önemli, o yüzden ikisini de iyi anlamak gerekiyor.
Sabit Bağlantı (Hard Link) Nedir?
Sabit bağlantıyı anlamak için önce inode kavramını bilmen gerekiyor. Linux dosya sisteminde her dosyanın bir inode numarası vardır. Bu inode, dosyanın gerçek verisinin diskte nerede tutulduğunu, izinlerini, sahibini ve diğer meta verilerini saklar. Bir dosya adı aslında sadece bu inode numarasına bir referanstır.
Sabit bağlantı oluşturduğunda, aynı inode’a işaret eden ikinci bir dosya adı yaratmış olursun. Yani iki farklı isim, aynı veriye bakıyor. Orijinal dosyayı silsen bile, hard link varken veri diskten kalkmaz çünkü inode’a en az bir referans kaldığı sürece veri yaşamaya devam eder.
# Temel hard link oluşturma
ln /var/www/html/config.php /var/www/html/config_backup.php
# İki dosyanın aynı inode'a sahip olduğunu doğrula
ls -li /var/www/html/config.php /var/www/html/config_backup.php
Çıktıda her iki dosyanın da aynı inode numarasını göreceğini fark edeceksin. Bu, iki ismin gerçekten aynı veriye baktığının kanıtıdır.
Uyari: Sabit bağlantılar farklı dosya sistemleri (partition’lar) arasında çalışmaz. /home üzerindeki bir dosyaya /var üzerinden hard link oluşturamazsın. Bu sınırlamayı aklında tut.
Bilgi: Hard link’ler dizinler için oluşturulamaz. Sadece düz dosyalar (regular files) için geçerlidir. Dizin bağlantısı oluşturman gerekiyorsa sembolik bağlantı kullanman gerekecek.
Sembolik Bağlantı (Symbolic Link / Symlink) Nedir?
Sembolik bağlantı ise tamamen farklı bir mantıkla çalışır. Bir symlink, içinde başka bir dosyanın yolunu tutan özel bir dosyadır. Windows’taki kısayollara benzetebilirsin ama çok daha güçlü ve sistem düzeyinde entegre çalışıyor.
Symlink, farklı dosya sistemleri arasında çalışabilir, dizinlere link oluşturabilirsin ve orijinal dosya silindiğinde link kırık (dangling link) hale gelir. Bu son özellik hem avantaj hem dezavantajdır, duruma göre değerlendirmek gerekiyor.
# Temel sembolik bağlantı oluşturma (-s parametresi şart)
ln -s /var/www/html/sites/mysite.com /var/www/html/current
# Sembolik bağlantıyı doğrulama
ls -la /var/www/html/current
# Çıktı: lrwxrwxrwx 1 www-data www-data 28 ... current -> /var/www/html/sites/mysite.com
# Bağlantının nereye işaret ettiğini öğrenme
readlink /var/www/html/current
readlink -f /var/www/html/current # Tam gerçek yolu gösterir
Çıktıdaki o ok işareti (->), dosyanın bir symlink olduğunu ve nereye işaret ettiğini gösterir. İzin kısmındaki “l” harfi de bu dosyanın bir link olduğunun göstergesidir.
Hard Link ve Symlink Karşılaştırması
| Özellik | Hard Link | Sembolik Link |
|---|---|---|
| Farklı dosya sistemi | Hayır | Evet |
| Dizin bağlantısı | Hayır | Evet |
| Orijinal silinirse | Veri korunur | Link kırılır |
| Farklı inode | Hayır (aynı) | Evet |
| Dosya boyutu | Orijinalle aynı | Yol uzunluğu kadar |
| Web sunucu kullanımı | Nadir | Çok yaygın |
ln Komutunun Temel Parametreleri
Komutun sözdizimi şu şekildedir:
ln [SECENEK] KAYNAK HEDEF
# En sık kullanilan parametreler:
# -s : Sembolik link oluştur
# -f : Hedef varsa zorla üzerine yaz (force)
# -n : Hedef sembolik linkse dereferans etme
# -v : Ayrıntılı çıktı ver (verbose)
# -r : Göreceli sembolik link oluştur (relative)
# -b : Üzerine yazmadan önce yedek al (backup)
Mevcut Linki Güncellemek
Web sunucusu yönetiminde en sık karşılaşacağın senaryo, mevcut bir symlink’i güncellemektir. Örneğin yeni bir deployment yaptın ve “current” linkini yeni versiyona yönlendirmen gerekiyor.
# Yanlis yontem - bu hata verir ya da beklenmedik davranir
ln -s /var/www/html/releases/v2.0 /var/www/html/current
# Dogru yontem: -sfn kombinasyonu
ln -sfn /var/www/html/releases/v2.0 /var/www/html/current
# Detayli aciklama:
# -s : sembolik link
# -f : varsa uzerine yaz
# -n : hedef dizin linkse, onu takip etme
# Sonucu dogrula
ls -la /var/www/html/current
Uyari: -f parametresini -n olmadan kullanırsan ve hedef bir sembolik link ise, ln yeni linki hedefin içine oluşturabilir. Bu sessiz bir hatadır ve deployment’larında beklenmedik davranışlara yol açar. Her zaman -sfn kullan.
Web Sunucusu Senaryoları: Gerçek Hayattan Örnekler
Nginx: sites-available ve sites-enabled Yönetimi
Nginx kullanıyorsan bu pattern’i mutlaka biliyorsundur. Konfigürasyon dosyaları sites-available altında tutulur, aktif etmek için sites-enabled altına sembolik link oluşturulur. Bu yapı hem düzenli hem de güvenli bir yaklaşım sağlar.
# Yeni bir site konfigurasyonu olustur
nano /etc/nginx/sites-available/mysite.com
# Siteyi aktif et (sembolik link olustur)
ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/mysite.com
# Konfigurasyonu test et
nginx -t
# Nginx'i yeniden yukle
systemctl reload nginx
# Siteyi deaktif etmek icin linki sil (kaynak dosya kalir)
rm /etc/nginx/sites-enabled/mysite.com
# Tum aktif siteleri listele
ls -la /etc/nginx/sites-enabled/
Bu yaklaşımın güzelliği şu: sites-available altındaki konfigürasyonun kendisine hiç dokunmadan siteyi aktif/pasif edebiliyorsun. Bir şeyler ters giderse konfigürasyon hâlâ orada duruyor, sadece linki silip ekleyerek yönetiyorsun.
Apache: a2ensite ile Aynı Mantık
Apache’de a2ensite ve a2dissite komutları arka planda zaten ln kullanır. Ama bazen bunları bypass ederek doğrudan link oluşturman gerekebilir.
# Apache icin manuel sembolik link
ln -s /etc/apache2/sites-available/mysite.conf /etc/apache2/sites-enabled/mysite.conf
# Veya Apache'nin kendi aracini kullan (tercih edilen)
a2ensite mysite.conf
a2dissite mysite.conf
# SSL sertifikasi icin ornek link yapisi
ln -s /etc/letsencrypt/live/mysite.com/fullchain.pem /etc/ssl/certs/mysite.com.pem
ln -s /etc/letsencrypt/live/mysite.com/privkey.pem /etc/ssl/private/mysite.com.key
Zero-Downtime Deployment: Capistrano Tarzı
Bu senaryo gerçekten değerli. Bir web uygulamasını sıfır kesinti ile güncellemenin en klasik yolu sembolik link rotasyonudur. Capistrano, Deployer ve benzeri araçlar tam olarak bunu yapar.
# Dizin yapisi su sekilde olacak:
# /var/www/myapp/
# releases/
# 20240101120000/
# 20240115093000/
# 20240120150000/ <- en yeni
# shared/ releases/20240120150000 <- aktif versiyon
# Yeni deployment
NEW_RELEASE="/var/www/myapp/releases/$(date +%Y%m%d%H%M%S)"
mkdir -p $NEW_RELEASE
# Kodu kopyala / git clone yap
git clone https://github.com/user/myapp.git $NEW_RELEASE
# Paylasilan dizinleri linkle
ln -s /var/www/myapp/shared/uploads $NEW_RELEASE/public/uploads
ln -s /var/www/myapp/shared/.env $NEW_RELEASE/.env
# Yeni versiyonu aktif et (atomik islem)
ln -sfn $NEW_RELEASE /var/www/myapp/current
# Rollback icin bir onceki versiyona don
PREV_RELEASE=$(ls -t /var/www/myapp/releases/ | sed -n '2p')
ln -sfn /var/www/myapp/releases/$PREV_RELEASE /var/www/myapp/current
echo "Rollback tamamlandi: $PREV_RELEASE"
# Eski surumlerden sadece son 5'ini tut
cd /var/www/myapp/releases && ls -t | tail -n +6 | xargs rm -rf
Ipucu: ln -sfn ile symlink’i değiştirme işlemi atomiktir, yani yarım kalmaz. Bu yüzden Nginx veya Apache bu işlem sırasında asla kırık bir link görmez. Zero-downtime deployment’ın sırrı büyük ölçüde budur.
PHP Sürüm Yönetimi
Birden fazla PHP sürümü kurulu olan sunucularda hangi sürümün varsayılan olduğunu sembolik linklerle yönetebilirsin.
# Mevcut php linkini kontrol et
ls -la /usr/bin/php
readlink -f /usr/bin/php
# PHP 8.2'ye gec
update-alternatives --set php /usr/bin/php8.2
# Ya da manuel olarak:
ln -sfn /usr/bin/php8.2 /usr/local/bin/php
# PHP-FPM socket linkini kontrol et
ls -la /var/run/php/
# php-fpm.sock -> php8.2-fpm.sock gibi bir yapi gormeli
Göreceli ve Mutlak Yol Farkı
Sembolik link oluştururken mutlak yol mu göreceli yol mu kullanmalısın? Bu sorunun net bir cevabı var: genellikle mutlak yol kullanmak daha güvenlidir, ama bazı durumlarda göreceli yol tercih edilir.
# Mutlak yol ile sembolik link (tavsiye edilen)
ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/mysite.com
# Goreceli yol ile sembolik link
cd /etc/nginx/sites-enabled
ln -s ../sites-available/mysite.com mysite.com
# -r parametresi ile otomatik goreceli link
ln -sr /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/mysite.com
# Goreceli linkin icerigi
readlink /etc/nginx/sites-enabled/mysite.com
# Cikti: ../sites-available/mysite.com
Göreceli yollar, link ve hedef birlikte taşınacaksa mantıklıdır. Örneğin tüm yapıyı farklı bir sunucuya kopyalıyorsan göreceli linkler bozulmaz. Ama sabit bir sunucu yapısında mutlak yollar daha okunabilir ve sorun ayıklaması kolaydır.
Sık Karşılaşılan Sorunlar ve Çözümleri
Kırık Sembolik Linkler (Dangling Links)
Hedef dosya veya dizin silindiğinde symlink kırık kalır. Bunu tespit etmek ve temizlemek için şunları kullanabilirsin:
# Kirık linkleri bul
find /etc/nginx/sites-enabled -type l ! -exec test -e {} ; -print
# Daha kapsamlı arama
find /var/www -maxdepth 3 -xtype l 2>/dev/null
# Kirık linkleri otomatik sil (dikkatli kullan!)
find /etc/nginx/sites-enabled -type l ! -exec test -e {} ; -delete
# Link zinciri takibi
ls -la /etc/nginx/sites-enabled/mysite.com
readlink -f /etc/nginx/sites-enabled/mysite.com # Son hedefi goster, kirıksa hata verir
Uyari: Kırık sembolik linkleri toplu silerken çok dikkatli ol. Özellikle /etc altında otomatik silme işlemi yapmadan önce mutlaka ne bulduğunu listele ve gözden geçir.
İzin Sorunları
Sembolik linkin izinleri her zaman lrwxrwxrwx görünür, bu normaldir. Önemli olan hedef dosyanın izinleridir. Ama link oluştururken de dikkat edilmesi gereken noktalar var:
# Link uzerindeki izinler (her zaman 777 gorunur, yaniltici olma)
ls -la /etc/nginx/sites-enabled/mysite.com
# lrwxrwxrwx 1 root root 42 Jan 20 15:00 mysite.com -> /etc/nginx/sites-available/mysite.com
# Asıl onemli olan hedef dosyanin izni
ls -la /etc/nginx/sites-available/mysite.com
# -rw-r--r-- 1 root root 1234 Jan 20 14:00 mysite.com
# www-data kullanicisi linke erisemiyorsa, hedefin izinlerini kontrol et
namei -l /etc/nginx/sites-enabled/mysite.com # Tum yol boyunca izinleri goster
Log Yönetiminde ln Kullanımı
Web sunucularında log yönetimi de ln’nin sıkça kullanıldığı bir alan. Farklı lokasyonlardaki logları merkezi bir yere toplamak ya da logrotate yapısını düzenlemek için faydalanabilirsin.
# Dagitik loglari merkezi klasore topla
mkdir -p /var/log/webapps
ln -s /var/log/nginx/mysite.access.log /var/log/webapps/mysite-access.log
ln -s /var/log/nginx/mysite.error.log /var/log/webapps/mysite-error.log
ln -s /var/log/php8.2-fpm.log /var/log/webapps/php-fpm.log
# /dev/stdout ve /dev/stderr'a link - Docker konteynerlerinde yaygin
# Bazi uygulamalarda log dosyasini stdout'a yonlendirmek icin:
ln -sf /dev/stdout /var/log/nginx/access.log
ln -sf /dev/stderr /var/log/nginx/error.log
Bilgi: Docker imajlarında /dev/stdout’a sembolik link oluşturmak yaygın bir pattern’dir. Bu sayede uygulama log dosyasına yazarken aslında container loglarına yazıyor, docker logs komutuyla takip edebiliyorsun.
Özet: Ne Zaman Hangisini Kullanmalısın?
Pratikte bakacak olursan, web sunucusu yönetiminde neredeyse her zaman sembolik link kullanırsın. Hard link’lerin kullanım alanı daha çok yedekleme araçları ve dosya sistemi düzeyindeki optimizasyonlardır. Ama ikisini de bilmek işinin gereğidir.
- Nginx/Apache site konfigürasyonlarını aktif/pasif etmek icin sembolik link kullan
- Zero-downtime deployment ve versiyon yönetimi icin sembolik link kullan
- Birden fazla yerde erişilmesi gereken paylaşılan konfigürasyon dosyaları icin sembolik link kullan
- Log merkezi yönetimi icin sembolik link kullan
- Yedekleme araçları (rsync –hard-links gibi) disk alanı optimizasyonu icin hard link kullan
- Orijinal silindiğinde verinin kaybolmamasını istediğin durumlarda hard link kullan
Sonraki Adımlar
ln komutunu iyi kavradıktan sonra deployment otomasyonu tarafına bakmanı tavsiye ederim. Bash ile basit bir deployment scripti yazmak, ln -sfn komutunu gerçek ortamda nasıl kullanacağını somutlaştıracak. Bunun yanında inotifywait ile symlink değişikliklerini izleyebileceğini, rsync’in –copy-links ve –keep-dirlinks parametreleriyle link’leri nasıl ele aldığını ve logrotate’in postrotate scriptlerinde ln kullanımını da araştırabilirsin. Bir sonraki yazıda Nginx’in sites-available/sites-enabled yapısını sıfırdan kurarak üzerine otomatik SSL entegrasyonu eklemeyi ele alacağım.
