# NFS Sunucu Kurulumu

**N**etwork **F**ile **S**ystem, Sun Microsystems tarafından 1984 yılında geliştirilmiş, ağa bağlı sistemlerin ağ üzerindeki NFS hizmeti veren sunculardaki paylaşımları yerel diskleri gibi kullanmasına olanak veren, RPC temelli dağıtık dosya sistemi yapısıdır.

Gömülü Linux sistemimiz üzerinde geliştirme yaparken, cihazımızı doğrudan üzerindeki depolama biriminden değil de (NAND Flash, eMMC, MMC vb.) ağ üzerindeki (genellikle geliştirme yaptığımız kendi bilgisayaramızdaki) bir NFS dosya paylaşımı üzerinden açmak çok kullanışlı ve zaman kazandırıcı bir uygulamadır.

Aynı zamanda daha nadir olmakla birlikte, sisteminizi doğrudan NFS paylaşımı üzerinden açmasanız bile, sistem açıldıktan sonra bir NFS paylaşımını mount edip, onun üzerinden dosya paylaşımları gerçekleştirmek de istenebilir.

Her iki senaryonun çalışması için de geliştirme yaptığınız bilgisayarda çalışan bir NFS sunucu kurulumu gerçekleştirilmelidir.

Bunun için Debian tabanlı bir sistem kullanıyorsanız, `nfs-kernel-server` paketini aşağıdaki gibi yüklemelisiniz:

```
$ sudo apt-get install nfs-kernel-server
```

İşlem bitiminde NFS sunucunuz otomatik olarak çalışacaktır. Ancak bu noktada NFS sunucumuz henüz bilgisayarımızda yer alan hangi dizinleri ağ üzerinde paylaşıma açmak istediğimizi bilmediğinden, herhangi bir paylaşım sağlamayacaktır.

Aynı NFS sunucu üzerinde, birden fazla dizini birbirinden farklı yetkilendirme ve kısıtlamalarla ağ paylaşımına açabiliriz.

Herhangi bir dizini NFS sunucu üzerinden paylaştırmak için, `/etc/exports` dosyasına dizinle ilgili bir ayar satırı girilmesi gereklidir. Bu dosyanın sahibi **root** kullanıcısı olduğundan, `sudo` mekanizmasıyla herhangi bir editörle açıp aşağıdaki gibi bir satır ekleyebiliriz:

```
# /etc/exports
/home/demirten/beagle  192.168.100.0/24(rw,no_root_squash,no_subtree_check)
```

NFS sunucu üzerindeki `/etc/exports` dosyasında izin verdiğiniz ip aralıklarının dışındaki bir sistem ilgili kaynağa ulaşmaya çalıştığında, NFS sunucunuz tarafından reddedilecektir. Gömülü sisteminizde nfs mount işlemlerinde `permission denied` mesajları alıyorsanız, NFS sunucunun çalıştığı bilgisayardaki `/var/log/syslog` dosyasının sonlarında aşağıdakine benzer hata mesajları görünecektir:

```
rpc.mountd[1041]: refused mount request from 192.168.2.2 for
/home/training/beagle/target (/home/training/beagle/target):
unmatched host
```

Yukarıdaki gibi bir `unmatched host` log mesajını gördüğünüzde, ilgili sistem için de paylaşım dizinini erişime açmak istiyorsanız, `/etc/exports` dosyasındaki ilgili kurala ait IP/Ağ Maskesi bölümünü genişletmeniz veya tüm IP adresleri için erişim vermek istiyorsanız, `*` özel karakterini kullanmalısınız.

`/etc/exports` dosyasında değişiklik yaptıktan sonra NFS servisini yeniden başlatabilir:

```
$ sudo service nfs-kernel-server restart
```

veya `exportfs` komutuna `-r` parametresini vermek suretiyle halihazırda paylaşıma açık olmasına rağmen bu örnekteki gibi paylaşımla ilgili herhangi bir ayarı değişmiş dizinleri yeniden paylaştırmasını ve yeni ayarların geçerli olmasını sağlayabiliriz:

```
$ sudo exportfs -r
```

## NFS Sunucu - Mount Gecikme Problemi

Sunucu üzerinde NFS protokolünün versiyon 4 ve yukarısı kullanıldığında, dağıtımlarda kullanılan NFS sunucu yazılımı uygulamalarının öntanımlı konfigürasyonları ile geleneksel çalışma senaryolarında, istemci tarafında mount işlemi sırasında 15 saniyeye varan gecikmeler yaşanabilmektedir.

Debian Jessie, Ubuntu 12.04, Fedora 19 ve yeni versiyonlarında bu sorun görünmektedir.

Benzer bir mount işlemlerinde gecikme durumu yaşıyorsanız, sunucu tarafındaki log dosyalarını inceleyerek (/var/log/syslog, /var/log/messages) aşağıdakine benzer bir log mesajı olup olmadığını kontrol edebilirsiniz:

```
... RPC: AUTH_GSS upcall timed out
```

Bu mesaj **Kerberos Authentication** işleminin başarısız olduğu ve zaman aşımına uğradığını belirtiyor. Ağ üzerinde güvenli kimlik denetimi için kullanılan Kerberos protokolü muhtemelen çalışma ortamınızda gerekli olmayacaktır. Bu şekilde yapılandırılmış bir ağda bulunuyor olsanız dahi en azından gömülü Linux sistemlerinizle Kerberos Authentication mekanizmasını devreye alma ihtiyacınız olmayacaktır. Her defasında mount işlemlerinde bu gecikmeyi yaşamak yerine, sorunu kökünden çözebilirsiniz. Her ne kadar problemin çözümü için NFS sunucu tarafında NFS ile birlikte GSSD servisini çalıştırma yönünde alternatifler önerilmiş olsa da, bu yöntemler tüm dağıtımlarda ve paket versiyonlarında aynı etkiyi göstermediğinden biz sorunu kökünden çözmeyi yeğliyoruz. Bunun için NFS sunucuyu çalıştırdığınız Linux sisteminde, `rpcsec_gss_krb5` kernel modülünün yüklenmesini engellemeniz (karalisteye almanız) gerekiyor. Bilgisayarınızı her açtığınızda bu ayarın devreye girmesi için `/etc/modprobe.d/blacklist-nfs-gss.conf` gibi yeni bir dosya oluşturup, dosya içerisinde aşağıdaki satırları eklemeniz yeterlidir:

```
blacklist rpcsec_gss_krb5
```

Dosyayı kaydedip sisteminizi yeniden başlattıktan sonra problemli senaryonun düzelmiş olduğu görünecektir.
