NFS yani Network File System, uzaktaki bir bilgisayara ait dosya sistemini kendi bilgisayarımızda mount edebilmemizi sağlayan bir standarttır. Bu yazıda, Ubuntu tabanlı bir sunucuya NFS sunucusu kuracağız ve birkaç farklı işletim sistemine sahip kişisel bilgisayarlardan bu dosya sistemine erişeceğiz.

NFS bize neler vadeder?

  • Merkezi bir depolama sistemi oluşturmak için standart bir çözüm sunar.
  • Client’lar, uzaktaki dosya sistemine local’deki bir dosya sistemi gibi erişebilir.
  • Client’ların hangi dosya sistemine sahip olduğu önemli değildir.
  • Sunucuya erişebilecek client’lar için yetkilendirme yapılabilir.

Sunucu kurulumu

NFS sunucusunu Ubuntu 20.04 (LTS) üzerine kuracağım. Bunun için Ubuntu paket repolarında bulunan nfs-kernel-server isimli paketi kullanacağız. Bu paket bize NFS sunucusu için gerekli yazılımları kurup ayarlamaları yapacaktır.

sudo apt update
sudo apt install nfs-kernel-server

Şimdi genel amaçlı depolama için kullanılacak olan klasörü oluşturalım. Mesela projelerimizi saklayacağımız klasör için /var/nfs/projects yolunu seçiyorum.

sudo mkdir -p /var/nfs/projects

Bu klasörü root yetkisi ile oluşturduğumuz için bunu NFS dosya sisteminin işlem yapacağı yetkiye, yani nobody:nogroup yetkisine çevirmemiz gerekir.

sudo chown nobody:nogroup /var/nfs/projects

Bunu da yaptıktan sonra klasörümüz artık NFS için export edilmeye hazır demektir.

Sırada /etc/exports dosyasından, export edilecek klasörleri ve bu dosyalara erişecek client’ları belirlemek var. Dosyayı açtıysanız eğer üst açıklama satırında hangi formatla yazıldığı örnek bir şekilde anlatılıyor. Detaylı dökümanlara ulaşmak için man 5 exports komutunu da kullanabilirsiniz. Dökümanlardan işimize yarayanları aşağıda topladım.

Diyor ki, /etc/exports dosyası NFS sunucusunda NFS client’ları tarafından erişilebilecek dosya sistemi tablosu içermektedir ve dosyanın içeriği sunucunun sistem admini tarafından yönetilir. Tablodaki her bir dosya sistemi için bazı seçenekler ve erişim kontrol listesi bulunuyor. Bu dosya formatı SunOS’taki exports dosyasına benzemekte. Her bir satırda export point ve bu point’leri mount edebilecek boşluklarla ayrılmış client listesi bulunur. Her bir client’ı parantez içine alınmış ve virgül ile ayrılmış seçenekler listesi takip etmelidir. Client ile seçenek listesi arasında asla boşluk bırakılmamalı.

NFS client’larını tanımlamanın birden fazla yolu bulunmaktadır. Bir host (FQDN, IPv4 veya IPv6 adresi), IP network (Subnet 192.168.0.0/24 gibi), wildcard (FQDN için *.foo.edu, IP adresi için 192.168.0.* gibi) ve anonim (herkesi yetkilendirmek için tek bir * işareti) ile client’lar tanımlanabilir.

Eğer bir client birden fazla tanımlamaya uyuyorsa o halde ilk eşleştiği satır geçerli sayılır.

Seçenek listesi için ise bizim için önemli olanları topladım:

Genel seçenekler

  • secure: Client’a ait bağlantı port numarası IPPORT_RESERVED’dan (1024) az olanlara izin verilir. Bu seçenek varsayılan olarak aktiftir. Bu denetimi kapatmak için secure yerine insecure seçeneği kullanılmalıdır.
  • rw: NFS volume’u için okuma ve yazma izni verir. ro ise sadece okuma izni verir.
  • async: Değişiklikler commit edilmeden isteklere yanıt vermeye zorlar. Bu seçenek genelde performansı arttırır fakat öngörülmeyen kapanmaların (reboot gibi) yaşanması durumunda dosya kayıplarına sebep olabilir.
  • sync: Değişiklikler commit edildikten sonra isteklere yanıt verir. NFS 1.0.0 sürümünden itibaren bu seçenek varsayılan olarak aktiftir.
  • no_subtree_check: Alt klasör denetimini (subtree_check) devre dışı bırakır. Bu genelde kullanıcı yetkilerini alt klasörlerde de denetlemek için kullanılmakta. Fakat kullanıldığında çok fazla sorun yaşattığı için 1.1.0 sürümünden itibaren varsayılan olarak devre dışı bırakılmış olarak geliyormuş.

Kullanıcı haritalama seçenekleri

  • root_squash: Superuser yetkili client kullanıcılarının NFS üzerinde nobody kullanıcısı ve grubu olarak haritalanmalarını sağlar. Böylece herhangi bir client’ın root kullanıcısı, sunucunun da root kullanıcısı olmaz. Bu, root squashing olarak adlandırılır.
  • no_root_squash: Root squashing işlevini devre dışı bırakır.
  • all_squash: root_squash‘ten farklı olarak tüm kullanıcıların nobody kullanıcısı ve grubu olarak haritalanmalarını sağlar. Genelde herkese açık erişimler için kullanılır.
  • no_all_squash: all_squash‘ın tam tersidir. Bu seçenek varsayılan olarak kullanılır.

Örnek bir /etc/exports dosyası:

/var/nfs/projects  192.168.0.*(rw,sync,no_subtree_check,all_squash)
/var/nfs/my-images dual-macbook(rw,sync,no_subtree_check)

Tüm ayarlamaları yaptıktan sonra NFS sunucumuzu yeniden başlatıyoruz.

sudo service nfs-kernel-server restart

Client kurulumu

UNIX ve türevi işletim sistemlerinde mount komutu halihazırda bulunduğundan mount etmek için ekstra bir program gerekmiyor. Fakat showmount gibi daha specific bir komut için Linux dağıtımları için ekstra bir paket gerekebilir. Windows için ise bir fikrim yok fakat Google’da NFS bağlantısı için gereken tüm bilgiyi bulabileceğinizden hiç kuşkum yok.

showmount komutuyla hedef NFS sunucusunun erişim için izin verilen dosya sistemlerini ve client’larını listeleyebiliriz. macOS için Terminal’i açıp aşağıdaki komutu yollamanız yeterlidir. Ubuntu ve Debian için ise nfs-common paketini kurmamız gerekiyor. Diğer Linux dağıtımları ise nfs-utils veya nfs-client paketlerine gereksinim duyabilir.

showmount -e 192.168.0.10

Görüldüğü üzere /etc/exports‘ta belirttiğimiz tüm tanımlamaları görebiliyoruz. Bunun için illa yetki verilmiş olmasına da gerek yoktur.

Export list for 192.168.0.10:
/var/nfs/projects  192.168.0.*
/var/nfs/my-images dual-macbook

macOS

İlk önce Terminal’i açıyoruz ve mount edilecek olan klasörü oluşturuyoruz. macOS için genelde /Volumes klasörü kullanıldığı için bu yolu kullandım.

sudo mkdir /Volumes/projects

Daha sonra ise remote NFS dosya sistemini, oluşturduğum klasöre mount ediyorum. Hata çıkmaması için nolocks gibi bazı seçenekleri kullanma gereği duydum.

sudo mount -o nolocks,resvport,rw -t nfs 192.168.0.10:/var/nfs/projects /Volumes/projects

Linux dağıtımı

İlk önce favori bir terminalimizi açıyoruz ve mount edilecek olan klasörü oluşturuyoruz. Linux’ta genelde /mnt klasörü kullanıldığı için bu yolu kullandım.

sudo mkdir /mnt/projects

Daha sonra ise remote NFS dosya sistemini, oluşturduğum klasöre mount ediyorum.

sudo mount -t nfs 192.168.0.10:/var/nfs/projects /mnt/projects

Bilgisayar her açıldığında mount edilebilmesi için de /etc/fstab dosyasında aşağıdaki formata uygun olarak düzenleme yapın ve dosyayı kaydedin.

192.168.0.10:/var/nfs/projects  /mnt/projects  nfs defaults 0 0
192.168.0.10:/var/nfs/my-images /mnt/my-images nfs defaults 0 0