NFS (dosya sistemi) kurulumu
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ımları
İ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