NFS ile Ağ Dosya Sistemi Paylaşımı

Ağ üzerinde dosya paylaşımı söz konusu olduğunda, Linux dünyasında NFS (Network File System) hala en güvenilir ve performanslı çözümlerden biri olmaya devam ediyor. Yıllar içinde SMB/Samba gibi alternatifler popülerleşse de, özellikle homojen Linux ortamlarında NFS’in sadeliği ve hızı rakipsiz. Bu yazıda NFS’i sıfırdan kurarak production ortamına hazır hale getireceğiz, yaygın sorunları çözeceğiz ve gerçek dünya senaryolarıyla konuyu pekiştireceğiz.

NFS Nedir ve Nasıl Çalışır?

NFS, Sun Microsystems tarafından 1984’te geliştirilen ve RFC standardlarına dayanan bir ağ dosya sistemi protokolüdür. Temel mantığı şu: sunucu tarafında bir dizin “export” edilir, istemci tarafında ise bu dizin yerel bir mount noktasına bağlanır. İstemci açısından bakıldığında, uzak dizin sanki yerel bir disk bölümüymüş gibi davranır.

Günümüzde en yaygın kullanılan versiyon NFSv4‘tür. NFSv3’e göre getirdiği başlıca iyileştirmeler şunlardır:

  • Stateful protokol: Bağlantı durumu sunucu tarafında takip edilir
  • Tek port (2049): Güvenlik duvarı yönetimi çok daha kolaydır
  • ACL desteği: Gelişmiş erişim kontrol listeleri
  • Kerberos entegrasyonu: Güçlü kimlik doğrulama desteği
  • Daha iyi performans: Büyük dosya transferlerinde belirgin fark

NFSv3 hala bazı eski sistemlerde kullanılıyor, ancak yeni kurulumlar için her zaman NFSv4 tercih edilmeli.

Senaryo: Merkezi Web Sunucu Dosya Paylaşımı

Gelin gerçekçi bir senaryo üzerinden ilerleyelim. Diyelim ki 3 adet web sunucunuz var ve hepsinin aynı /var/www/html içeriğine erişmesi gerekiyor. Bir NFS sunucusu kurarak bu paylaşımı merkezi hale getireceğiz.

Ortamımız şu şekilde:

  • NFS Sunucu: 192.168.1.10 (Ubuntu 22.04)
  • NFS İstemci 1: 192.168.1.21 (CentOS 8)
  • NFS İstemci 2: 192.168.1.22 (Ubuntu 20.04)
  • NFS İstemci 3: 192.168.1.23 (Debian 11)

NFS Sunucu Kurulumu

Gerekli Paketlerin Kurulması

Ubuntu/Debian tabanlı sistemlerde:

sudo apt update
sudo apt install -y nfs-kernel-server nfs-common

RHEL/CentOS/Rocky Linux tabanlı sistemlerde:

sudo dnf install -y nfs-utils
sudo systemctl enable --now nfs-server rpcbind

Ubuntu’da kurulum sonrası servis otomatik başlar, ama durumunu teyit edelim:

sudo systemctl status nfs-kernel-server
sudo systemctl enable nfs-kernel-server

Paylaşım Dizinlerinin Hazırlanması

Paylaşılacak dizinleri oluşturalım ve uygun izinleri verelim:

# Web içeriği için paylaşım dizini
sudo mkdir -p /srv/nfs/webdata
sudo mkdir -p /srv/nfs/shared

# İzinleri ayarlayalım
sudo chown -R www-data:www-data /srv/nfs/webdata
sudo chmod 755 /srv/nfs/webdata

# Genel paylaşım dizini
sudo chown nobody:nogroup /srv/nfs/shared
sudo chmod 777 /srv/nfs/shared

Burada nobody:nogroup kullanımı önemli bir detay. NFS’de root squashing mekanizması gereği, istemciden gelen root kullanıcısı sunucuda nobody kullanıcısına dönüştürülür. Bu bir güvenlik özelliğidir.

/etc/exports Dosyasının Yapılandırılması

NFS’in kalbi /etc/exports dosyasıdır. Her satır bir paylaşım kuralını tanımlar:

sudo nano /etc/exports

Dosyaya şu içeriği ekleyelim:

# Web içeriği - sadece web sunucularına, salt okunur
/srv/nfs/webdata 192.168.1.21(ro,sync,no_subtree_check) 192.168.1.22(ro,sync,no_subtree_check) 192.168.1.23(ro,sync,no_subtree_check)

# Genel paylaşım - tüm alt ağa, okuma/yazma
/srv/nfs/shared 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

# Yedekleme dizini - sadece yedekleme sunucusuna
/srv/nfs/backups 192.168.1.50(rw,sync,no_subtree_check,root_squash)

Kullandığımız parametreleri açıklayalım:

  • ro: Salt okunur (read-only) erişim
  • rw: Okuma ve yazma erişimi
  • sync: Yazma işlemleri diske yazılmadan istemciye onay verilmez, veri tutarlılığı için kritik
  • async: Daha hızlı ama veri kaybı riski taşır, dikkatli kullanın
  • no_subtree_check: Alt dizin kontrolünü devre dışı bırakır, performansı artırır ve çoğu durumda önerilir
  • subtree_check: Alt dizin kontrolü aktif, bazı güvenlik senaryolarında gerekli
  • root_squash: İstemciden gelen root kullanıcısını nobody’e dönüştürür (varsayılan)
  • no_root_squash: Root squashing’i devre dışı bırakır, güvenlik riski taşır, dikkatli kullanın
  • all_squash: Tüm kullanıcıları nobody’e dönüştürür
  • anonuid: Anonim kullanıcı için UID belirle
  • anongid: Anonim kullanıcı için GID belirle

Değişikliklerin Uygulanması

# Export tablosunu yenile
sudo exportfs -ra

# Mevcut export'ları görüntüle
sudo exportfs -v

Çıktı şuna benzer bir şey göstermelidir:

/srv/nfs/webdata 192.168.1.21(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/srv/nfs/shared 192.168.1.0/24(rw,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

Güvenlik Duvarı Ayarları

NFSv4 tek port kullandığı için güvenlik duvarı konfigürasyonu oldukça basit:

# Ubuntu (UFW)
sudo ufw allow from 192.168.1.0/24 to any port 2049
sudo ufw allow from 192.168.1.0/24 to any port 111
sudo ufw reload

# RHEL/CentOS (firewalld)
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload

NFSv3 kullanıyorsanız işler biraz karmaşıklaşıyor çünkü dinamik portlar devreye giriyor. Bu yüzden portları /etc/nfs.conf ile sabitlemek gerekir.

NFS İstemci Kurulumu ve Bağlantı

İstemci Paketlerinin Kurulması

# Ubuntu/Debian
sudo apt install -y nfs-common

# RHEL/CentOS/Rocky
sudo dnf install -y nfs-utils

Manuel Mount İşlemi

Önce sunucunun ne export ettiğini görelim:

showmount -e 192.168.1.10

Çıktı:

Export list for 192.168.1.10:
/srv/nfs/shared  192.168.1.0/24
/srv/nfs/webdata 192.168.1.21,192.168.1.22,192.168.1.23

Mount edelim:

sudo mkdir -p /mnt/webdata
sudo mount -t nfs 192.168.1.10:/srv/nfs/webdata /mnt/webdata

# Bağlantıyı doğrula
df -h | grep nfs
mount | grep nfs

/etc/fstab ile Kalıcı Mount

Manuel mount yeniden başlatma sonrası kaybolur. Kalıcı hale getirmek için /etc/fstab dosyasını düzenleyelim:

sudo nano /etc/fstab

Şu satırları ekleyin:

# NFS mount - Web data (salt okunur)
192.168.1.10:/srv/nfs/webdata  /var/www/html  nfs  defaults,ro,soft,timeo=30,retrans=3,_netdev  0  0

# NFS mount - Shared dizin
192.168.1.10:/srv/nfs/shared   /mnt/shared    nfs  defaults,rw,soft,timeo=30,retrans=3,_netdev  0  0

Fstab parametrelerini açıklayalım:

  • soft: Sunucu erişilemez olursa hata döndür (hard ile kıyasla uygulama donmaz)
  • hard: Sunucu erişilemez olursa süresiz beklemeye devam et
  • timeo=30: Timeout süresi (deciSaniye cinsinden, yani 3 saniye)
  • retrans=3: Timeout sonrası kaç kez tekrar denensin
  • _netdev: Ağ hazır olmadan mount etmeye çalışma, önemli!
  • noatime: Erişim zamanını yazma, performans artırır
  • nfsvers=4: Spesifik NFS versiyonu zorunlu kıl

Fstab’ı test etmek için:

# Önce mount edelim
sudo mount -a

# Sonra kontrol edelim
df -h

Performans Optimizasyonu

rsize ve wsize Ayarları

NFS’in performansı büyük ölçüde okuma/yazma blok boyutlarına bağlıdır. Modern ağlarda bu değerleri artırmak ciddi performans kazanımı sağlar:

# Fstab'da optimize edilmiş mount seçenekleri
192.168.1.10:/srv/nfs/webdata /var/www/html nfs rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,nfsvers=4 0 0
  • rsize=1048576: Okuma blok boyutu 1MB
  • wsize=1048576: Yazma blok boyutu 1MB

Sunucu tarafında da ayarlamalar yapabiliriz. /etc/nfs.conf dosyasını düzenleyin:

sudo nano /etc/nfs.conf
[nfsd]
# NFS sunucu thread sayısı - CPU çekirdeği başına 4-8 thread önerilir
threads=16
# NFSv3 desteğini kapat, sadece v4 kullan
vers3=n
vers4=y
vers4.1=y
vers4.2=y

Değişiklikler sonrası servisi yeniden başlatın:

sudo systemctl restart nfs-kernel-server

Mount Sonrası Performans Testi

# Yazma hızı testi
dd if=/dev/zero of=/mnt/shared/testfile bs=1M count=1000 conv=fdatasync

# Okuma hızı testi
dd if=/mnt/shared/testfile of=/dev/null bs=1M

# Test dosyasını temizle
rm /mnt/shared/testfile

Gerçek Dünya Senaryo 2: Otomatik Mount ile NFS

Büyük ortamlarda sunucu başlatıldığında NFS mount işlemlerinin otomatik yönetimi için autofs kullanmak çok daha temiz bir yaklaşım sunar. Autofs, dizine erişildiğinde otomatik mount eder, belirli süre kullanılmadığında ise unmount eder.

# Autofs kurulumu
sudo apt install -y autofs    # Ubuntu/Debian
sudo dnf install -y autofs    # RHEL/CentOS

Ana konfigürasyon dosyasını düzenleyin:

sudo nano /etc/auto.master
/mnt/nfs  /etc/auto.nfs  --timeout=60  --ghost

Şimdi /etc/auto.nfs dosyasını oluşturun:

sudo nano /etc/auto.nfs
webdata  -ro,soft,timeo=30  192.168.1.10:/srv/nfs/webdata
shared   -rw,soft,timeo=30  192.168.1.10:/srv/nfs/shared
backups  -rw,soft,timeo=30  192.168.1.10:/srv/nfs/backups

Autofs’u başlatın:

sudo systemctl enable --now autofs

# Test et - dizine girildiğinde otomatik mount olur
ls /mnt/nfs/webdata
ls /mnt/nfs/shared

--ghost seçeneği, mount noktası dizinlerini erişilmeden önce de görünür kılar. --timeout=60 ise 60 saniye kullanılmayan mount’ları otomatik olarak kaldırır.

Sorun Giderme

NFS’de karşılaşılan en yaygın sorunlar ve çözümleri:

“Permission denied” Hatası

# Sunucu tarafında export listesini kontrol et
sudo exportfs -v

# İstemci IP'sinin kural içinde olup olmadığını doğrula
showmount -e 192.168.1.10

# UID/GID uyumsuzluğunu kontrol et
# Sunucu ve istemcide aynı kullanıcı aynı UID'ye sahip olmalı
id www-data    # Her iki tarafta da çalıştır

“Stale file handle” Hatası

Bu hata genellikle sunucu yeniden başlatıldığında veya export edilmiş dizin değiştiğinde oluşur:

# İstemci tarafında zorla unmount et
sudo umount -f -l /mnt/webdata

# Yeniden mount et
sudo mount -t nfs 192.168.1.10:/srv/nfs/webdata /mnt/webdata

Bağlantı Sorunlarını Diagnose Etme

# RPC servislerini kontrol et
rpcinfo -p 192.168.1.10

# NFS istatistiklerini görüntüle
nfsstat -c    # İstemci istatistikleri
nfsstat -s    # Sunucu istatistikleri

# Mount edilmiş NFS dosya sistemlerini listele
mount | grep nfs

# Ağ bağlantısını test et
telnet 192.168.1.10 2049

Log Analizi

# NFS ile ilgili kernel loglarını izle
sudo journalctl -u nfs-kernel-server -f

# Daha detaylı NFS hata ayıklama
sudo rpcdebug -m nfs -s all    # İstemci debug
sudo rpcdebug -m nfsd -s all   # Sunucu debug

# Debug'ı temizle
sudo rpcdebug -m nfs -c all

Güvenlik En İyi Uygulamaları

NFS güçlü bir araç, ancak yanlış yapılandırılırsa ciddi güvenlik açıkları doğurabilir:

Ağ segmentasyonu: NFS trafiğini dedicated bir VLAN üzerinden geçirin. Production NFS trafiği asla genel ağla karışmamalı.

Minimum yetki prensibi: Mümkün olan her yerde ro kullanın. Yazma erişimi gerçekten gerekiyorsa vermek üzere verin.

IP bazlı kısıtlama: Export kurallarında mümkün olduğunca geniş ağ bloklarından kaçının. /24 yerine /32 (tek IP) tercih edin.

root_squash her zaman aktif: no_root_squash kullanmak zorundaysanız, bunu belgelendirin ve düzenli olarak gözden geçirin.

NFSv4 Kerberos: Yüksek güvenlik gerektiren ortamlarda sec=krb5p kullanın:

# /etc/exports
/srv/nfs/secure 192.168.1.0/24(rw,sync,no_subtree_check,sec=krb5p)

Mount seçeneklerinde nosuid ve noexec: İstemci tarafında güvenliği artırın:

192.168.1.10:/srv/nfs/shared /mnt/shared nfs defaults,rw,nosuid,noexec,nodev,_netdev 0 0
  • nosuid: SUID bit’li programların çalışmasını engeller
  • noexec: Executable dosyaların çalışmasını engeller
  • nodev: Cihaz dosyalarını devre dışı bırakır

İzleme ve Bakım

Sağlıklı bir NFS ortamı için düzenli izleme şart:

# NFS sunucu durumunu kontrol et
sudo systemctl status nfs-kernel-server

# Aktif NFS bağlantılarını listele
sudo ss -tnp | grep 2049

# Export edilmiş dosya sistemlerini göster
cat /proc/fs/nfsd/exports

# NFS sunucu thread durumu
cat /proc/fs/nfsd/threads

# Disk kullanımını NFS üzerinden kontrol et
df -h /mnt/webdata

Prometheus ve Grafana kullanıyorsanız, node_exporter NFS metriklerini otomatik olarak toplar. Dashboard’unuza NFS I/O metriklerini ekleyerek anlık izleme yapabilirsiniz.

Sonuç

NFS, doğru yapılandırıldığında son derece güvenilir ve performanslı bir çözümdür. Bu yazıda temel kurulumdan production-ready bir ortama kadar tüm adımları ele aldık. En çok dikkat edilmesi gereken noktaları özetleyecek olursak:

Sunucu tarafında /etc/exports dosyası düzgün yazılmazsa hem güvenlik açıkları hem de erişim sorunları yaşanır. İstemci tarafında _netdev mount seçeneğini asla atlamayın, yoksa ağ hazır olmadan mount denemesiyle sistem boot’ta takılabilir. Performans için rsize ve wsize değerlerini ağ kapasitesine göre optimize edin. Sorun giderme süreçlerinde rpcinfo, showmount ve nfsstat araçları en yakın dostlarınız olacak.

NFS’i bir adım ötesine taşımak isteyenler için Pacemaker/Corosync ile yüksek erişilebilirlik (HA) konfigürasyonu veya GlusterFS ile dağıtık depolama konularını araştırmanızı öneririm. Ancak çoğu senaryo için iyi yapılandırılmış bir NFS kurulumu fazlasıyla yeterli olacaktır.

Yorum yapın