İçindekiler

NFS  (Network  File  System),  1984  yılında  Sun  Microsystems  tarafından  geliştirilmişbir protokoldür. Uzaktaki makine üzerinde bulunan dosya sistem(lerin)i, farklı bir işletim sistemine  bağlayabilmeniz  (mount)  için  geliştirilmiştir.  Ve  bunu  yaparken,  kullanıcının sanki yerel bir dosya sistemi üzerindeymiş gibi çalışmasını sağlar.

TCP / IP’nin evriminin başlarında, kullanıcının ağ üzerinden başka bir makineye erişmesine izin vermek için bazı araçlar oluşturulmuştu. Telnet gibi remote access protocols (uzaktan erişim protolleri), kullanıcının başka bir bilgisayarda oturum açmasına ve buradaki kaynakları kullanmasına izin verdi. File Transfer Protocol  (FTP), birinin uzak bir makineden bir dosyayı kendi dosyasına kopyalamasına ve düzenlemesine izin verdi.

Ancak, bu çözümlerin hiçbiri, bir kullanıcının uzak bir makinedeki bir dosyaya, yerel bir dosyanın kullanıldığına benzer bir şekilde erişmesine izin verme kurallarına uymuyordu. Sun bu ihtiyacı karşılamak için Network File System (Ağ Dosya Sistemi)’i (NFS) yarattı. NFS, yerel ve uzak bir dosya arasındaki ayrımı ortadan kaldırmak amacıyla özel olarak tasarlanmıştır. Bir kullanıcı için, uygun kurulum yapıldıktan sonra, uzak bilgisayardaki bir dosya, kullanıcının yerel bilgisayarındaki bir sabit disk üzerindeymiş gibi kullanılabilir. Sun ayrıca, hem Sun tarafından hem de diğer şirketler tarafından yapılan donanımların birlikte çalışabilmesini sağlamak için NFS’yi özellikle satıcıdan/üreticiden bağımsız olacak şekilde üretti.

NFS, klasik TCP / IP client/server modelini izler. Bir sabit disk veya belirli bir bilgisayarın depolama aygıtındaki dizin, yönetici tarafından paylaşılan bir kaynak olarak ayarlanabilir. Bu kaynağa daha sonra paylaşılan sürücü(shared drive) veya directory denir ve client makinede yerel bir dizin gibi görünmesini sağlayarak bilgisayarlardan erişilebiliriz.

NFS, çalışmasını tanımlayan üç ana bileşen içeren bir mimari kullanır. External Data Representation (XDR) standardı, verilerin client ve server arasındaki değişimlerde nasıl temsil edildiğini tanımlar. Remote Procedure Call (RPC) protokolü, uzak makinelerde procedure çağırma yöntemi olarak kullanılır. Ardından, bir dizi NFS prosedürü ve işlemi çeşitli istekleri yerine getirmek için RPC kullanarak çalışır. Mount protokolü, kaynakları yukarıda belirtildiği gibi bağlamak için kullanılır.

NFS’nin en önemli tasarım hedeflerinden biri performanstı. Açıkçası, uzaktaki bir makineye yerelmiş gibi bir dosya ayarlasanız bile, gerçek okuma ve yazma işlemleri bir ağ üzerinde ilerlemek zorunda. Genellikle bu sadece bir bilgisayar içerisine veri göndermekten daha fazla zaman alır, bu yüzden protokolün kendisinin mümkün olduğunca “yalın ve ortalama” olması gerekiyordu. Bu karar, çoğu dosya aktarım protokolünün yaptığı gibi güvenilir TCP yerine TCP / IP’de aktarım için güvenilir olmayan User Datagram Protocol’nün (UDP) kullanılması gibi bazı ilginç kararlara yol açmıştır. Bu da protokolün bir bütün olarak nasıl çalıştığı üzerinde ilginç sonuçlara sahiptir.

NFS için bir diğer önemli tasarım amacı basitti (elbette performansla ilgili). NFS sunucularının durumsuz olduğu söyleniyor, bu protokolün hangi sunucuların hangi clientler tarafından hangi dosyaların açıldığını takip etmesine gerek kalmayacak şekilde tasarlandığı anlamına geliyor. Bu, isteklerin birbirinden bağımsız olarak yapılmasına izin verir ve bir sunucunun karmaşık kurtarma prosedürlerine ihtiyaç duymadan çökmeler gibi olaylarla incelikle başa çıkmasını sağlar. Protokol ayrıca, isteklerin kaybolması veya çoğaltılması durumunda dosya bozulması yaşanmayacak şekilde tasarlanmıştır.

NFS Sürüm ve Standartları

NFS’in şu  zamana  kadar  dört  temel  sürümü  (NFS,  NFSv2,  NFSv3  ve  NFSv4) çıkmıştır.  NFS’nin ilk yaygın sürümü sürüm 2 idi. NFS sürüm 3 ve sürüm 2’ye benzer, ancak birkaç değişiklik yapar ve bazı yeni özellikler ekler. Bunlar, daha büyük dosya transferleri için destek, dosya özniteliklerini(attributes) ayarlama konusunda daha iyi destek ve birkaç yeni dosya erişim ve işleme prosedürünü içerir. NFS Sürüm 4, 2000 yılında yayınlandı. NFS sürüm 3, sürüm 2’de yalnızca küçük değişiklikler içerdiğini söylemiştik, NFSv4, NFS’nin neredeyse yeniden yazmasıdır. En çok aşağıdakileri içeren çok sayıda değişiklik içerir:

  • Modern internet çalışmasının ihtiyaçlarını yansıtan NFSv4, güvenlik konusuna daha fazla önem vermektedir.
  • NFSv4, birkaç basit prosedürün bir client’den sunucuya grup olarak gönderilmesine izin veren bir Bileşik prosedür kavramını sunar.
  • NFSv4, clientden NFS sunucusundaki bir dosyaya erişirken kullanabileceği bireysel prosedürlerin sayısını neredeyse iki katına çıkarır.
  • Sürüm 4 ayrıca, NFS için aktarım protokolü olarak TCP’nin belirtilmesi ile mesajlaşmada önemli bir değişiklik yapar.
  • Son olarak, NFS, mount protokolünün işlevlerini temel NFS protokolüne entegre eder ve 2. ve 3. sürümlerde olduğu gibi ayrı bir protokol olarak ortadan kaldırır.

Alt  versiyon  olarak  çıkan  NFSv4.1  sürümüyle  birlikte  paralellik  özelliği (pNFS) gelmiştir. Böylece uzaktaki veriye paralel erişim imkanı getirilmiştir.

NFS Mimarisi

Bir bütün olarak TCP/IP protokol paketi açısından bakıldığında, Network File System (NFS), TCP / IP (DOD) modelinin application katmanında bulunan tek bir protokoldür. Bu TCP / IP katmanı, OSI Referans Modelinin session, presentation ve application katmanlarını kapsar.

NFS’nin çalışması, TCP / IP application katmanına karşılık gelen üç OSI model katmanının her birinde mantıksal olarak görülebilecek üç ana bileşen şeklinde tanımlanır.

  • Remote Procedure Call (RPC):RPC, client/server ağ çalışması işlevselliğini uygulamak için kullanılan genel bir session katmanı hizmetidir. Belirli bir ana bilgisayarda yerel bir prosedürü çağıran bir program nosyonunu, bir ağdaki uzak cihazdaki prosedür çağıracak şekilde genişletir.
  • External Data Representation (XDR): XDR, veri türlerinin tutarlı bir şekilde tanımlanmasını sağlayan açıklayıcı bir dildir. XDR kavramsal olarak presentation katmanında bulunur; evrensel gösterimleri, verilerin depolanmasında çok farklı dahili yöntemler kullanabilecek bilgisayarlar arasında NFS kullanılarak değiştirilmesine izin verir.
  • NFS Procedures and Operations:NFS’nin gerçek işlevselliği, OSI modelinin yedinci katında kavramsal olarak çalışan prosedürler ve işlemler şeklinde gerçekleştirilir. Bu prosedürler, ağ üzerinden dosyalarda gerçekleştirilecek, görevleri temsil etmek için XDR ve komutları bir internet ağında taşımak için RPC kullanan belirli görevleri belirtir.

NFS 1 - OSI Model

Bu üç bileşenin yanı sıra, bir bütün olarak NFS protokolü, bahsetmeye değer olduğunu düşündüğüm bir dizi başka işlevi içermektedir:

  • Mount Protocol:NFS’nin yazanlar, NFS’nin dosya açma ve kapama ile ilgili detaylarıyla ilgilenmemesi konusunda özel bir karar aldı. Bunun yerine, Mount protokolü adı verilen ayrı bir protokol bu amaç için kullanılır. Ağ üzerinden bir dosyaya veya başka bir kaynağa erişmek, önce bu protokolü kullanarak onu bağlamayı içerir. Mount Protokolü mimari olarak farklıdır, ancak açıkça NFS ile yakından ilgilidir ve hatta NFS standardının bir ekinde tanımlanmıştır.
  • NFS File System Model: NFS, onu kullanan sistemlerin dizin ve dosya yapısını uygulamak için belirli bir model kullanır. Bu model, UNIX’in dosya sistemi modeline yakından dayanmaktadır, ancak yalnızca bu işletim sistemine özgü değildir. Mount Protokolünün açıklaması ile birlikte ele alınmıştır.
  • Security: NFS’nin 2. ve 3. sürümleri yalnızca sınırlı güvenlik hükümleri içermektedir. Çeşitli işlemlerin izinlerini kontrol etmek için UNIX stili kimlik doğrulamasını kullanırlar. NFS sürüm 4, NFS uygulamaları için kullanılabilen güvenlik seçeneklerini büyük ölçüde artırır. Bu, hem çoklu kimlik doğrulama(multiple authentication) hem de şifreleme algoritmaları seçeneğini ve protokolü daha “güvenlik anlayışı içinde” yapmak için bir bütün olarak yapılan birçok değişikliği içerir.

Diğer TCP / IP protokolleri gibi, NFS de yukarıdaki işlevleri uygulayan client ve server yazılımı biçiminde uygulanır. NFS standartları, özellikle sürüm 3 ve 4 için, sunucular ve clientler arasındaki etkileşim, dosya kilitleme(lock), izin sorunları(permission issues), önbellekleme(caching), yeniden iletme politikaları, uluslararası destek ve daha fazlası dahil olmak üzere uygun NFS client / server uygulamasına ilişkin sayısız konuyu tartışır

NFS Data Storage and Data Types, and the External Data Representation (XDR) Standard

NFS’nin arkasındaki genel fikir, bilgisayardaki birinin yerel bir makinede olduğu gibi kolayca başka bir bilgisayardaki bir dosyayı okumasını veya yazmasını sağlamaktır. Elbette, yerel makinenizdeki dosyaların hepsi aynı dosya sisteminde, aynı dosya yapısını ve farklı veri türlerini temsil etmek için aynı araçları kullanarak depolanır. Uzak bir cihaza erişirken durumun böyle olacağından emin olamazsınız ve bu NFS ile ilgilenmesi gereken bir parça “Tower of Babel” problemi yaratır.

Universal Data Exchange: XDR

Representation consistenc yaklaşımlardan biri, sadece aynı işletim sistemini kullanan makinelerdeki uzak dosyalara erişimi kısıtlamak olacaktır. Bununla birlikte, bu NFS’nin etkinliğinin çoğunu ortadan kaldıracaktır. Ayrıca, her bilgisayarın diğerlerinin içsel temsilini anlamalarını istemek de oldukça pratik olacaktır. Çok farklı makinelerin bile veri paylaşmasını sağlamak için daha genel bir metoda ihtiyaç vardı. Bu amaçla, NFS yazanlar onu universal data description language kullanan verilerle ilgilenecek şekilde tanımlamışlardır.

XDR’nin arkasındaki fikir basit ve bir analoji şeklinde kolayca anlaşılabilir. Bir kongrede 50 farklı dil konuşan delegeleriniz olsaydı, iletişim kurmakta zorlanırlardı. Kolaylaştırmak için tercüman kiralayabilirsiniz, ancak dillerin olası tüm farklı kombinasyonlarını idare edecek tercümanlar asla bulamazsınız. Daha pratik bir çözüm, İngilizce gibi bir dili ortak bir dil olarak ilan etmektir. O zaman sadece 49 tercümana ihtiyacınız var: İngilizce’den İngilizce olmayan dillerin her birine tercüme edip tekrar çevirmek. İsveççe’den Portekizce’ye çeviri yapmak için İsveççe’den İngilizceye, ardından İngilizce’den Portekizce’ye çeviriyorsunuz. Ortak dil, tüm diğer dillerden bu ortak dile çevirmen bulunabildiği sürece, Fransızca veya İspanyolca veya başka bir şey olabilir.

XDR aynı şekilde çalışır. Bir dosyaya nasıl erişileceği hakkındaki bilgiler cihaz A’dan cihaz B’ye aktarılacaksa, cihaz A önce A’yı iç temsilinden bu veri türlerinin XDR sunumuna dönüştürür. Bilgi XDR kodlaması kullanılarak ağ üzerinden iletilir. Daha sonra, B cihazı, XDR’den kendi dahili temsiline geri döner, böylece kullanıcıya yerel dosya sistemindeymiş gibi sunulabilir. Her cihazın sadece kendi “dilinden” XDR’ye nasıl dönüştüğünü ve tekrar nasıl döneceğini bilmesi gerekir; A cihazının B cihazının iç detaylarını ve tam tersini bilmesi gerekmez. Elbette bu tür bir çeviri, XDR’nin OSI Referans Modeli’nde bulunduğu presentation katmanının klasik bir işidir. XDR, Abstract Syntax Notation adlı bir ISO standardına dayanmaktadır.

NOT : Bu arada, burada açıklanan fikir, altta yatan sistemlerin doğasından bağımsız olarak veri alışverişine izin vermek için diğer protokollerde de kullanılır. Örneğin, benzer bir fikir, Simple Network Management Protocol (SNMP) kullanılarak yönetim bilgilerinin değiş tokuşunun arkasındadır. Aynı temel fikir, Telnet protokolünde kullanılan önemli Network Virtual Terminal  (NVT) paradigmasının altındadır.

XDR’nin evrensel olması için, bilgisayarlarda kullanılan tüm yaygın veri türlerinin tanımlanmasına izin vermesi gerekir. Örneğin, tamsayıların, floating point numbers, dizelerin ve diğer veri yapılarının değiş tokuş edilmesine izin vermesi gerekir.

NFS 2 - Veri Yapıları

Remote Procedure Calls (RPCs)

Belirli bir bilgisayardaki bir yazılım programı bir dosyayı okumak, bir dosya yazmak veya ilgili görevleri gerçekleştirmek istediğinde, bu amaç için doğru yazılım talimatlarını kullanması gerekir. Her yazılım programından bu talimatların bir kopyasını içermesini istemek verimsiz olacaktır, bu yüzden bunlar yerine prosedür olarak adlandırılan standart yazılım modülleri olarak kodlanırlar. Bir eylemi gerçekleştirmek için, bir yazılım parçası prosedürü çağırır; prosedür, ana program için geçici olarak devralınır ve veri okuma veya yazma gibi bir görevi yerine getirir. Daha sonra prosedür, programın kontrolünü, onu çağıran yazılıma geri döndürür ve isteğe bağlı olarak verileri de döndürür.

NFS’nin ana konsepti, uzaktan dosya erişiminin yerel dosya erişimi gibi görünmesini sağlamak olduğundan, daha önce açıklanan prosedür çağırma yönteminin ağ tabanlı bir versiyonunun kullanımı etrafında tasarlanmıştır. Bir dosya ile bir şey yapmak isteyen bir yazılım uygulaması hala bir prosedür çağrısı yapar, ancak yerel bir arama yerine farklı bir bilgisayarda bir prosedürü çağırır. Çağrının şebeke üzerinden iletilmesini, çağrıyı yapan yazılıma büyük ölçüde görünmeyecek şekilde yönetmek için özel bir prosedür kümesi kullanılır.

Bu işlevsellik doğrudan NFS’de uygulanabilirdi, ancak Sun bunun yerine Remote Procedure Call (RPC) belirtimi adı verilen ve bunun nasıl çalıştığını tanımlayan ayrı bir session katmanı protokol bileşeni oluşturdu.

RPC, NFS’de iletişim kurmanın gerçek süreci olduğundan, NFS’nin kendisi diğer TCP / IP protokollerinden farklıdır. İşlemi, belirli mesaj değişimleri ve durum diyagramları ile tanımlanamaz, çünkü HTTP veya DHCP, hatta TCP gibi bir protokolün yapabileceği şekli, RPC bunların hepsini yapar. NFS aslında, bir NFS sunucusunun NFS client için sunduğu bir dizi RPC sunucusu prosedürü ve işlemi olarak tanımlanmaktadır. Bu prosedür ve işlemlerin her biri, dosyadan okumak, dosyaya yazmak veya silmek gibi bir dosya üzerinde belirli bir işlem yapılmasını sağlar.

Bir client belirli bir makinedeki bir dosyada bir tür eylem yapmak istediğinde, bu makinedeki NFS sunucusuna çağrı yapmak için RPC’yi kullanır. Sunucu isteği kabul eder ve gerekli eylemi gerçekleştirir, ardından isteğe bağlı olarak bir sonuç kodu ve muhtemelen verileri müşteriye geri döndürür. Sonuç kodu, eylemin başarılı olup olmadığını gösterir. Öyleyse, müşteri ne yapılması istendiyse tamamlandığını varsayabilir. Örneğin, veri yazma durumunda, müşteri verilerin uzun süreli depolamaya başarıyla yazıldığını varsayabilir.

NFS, session katmanında geçerli bir RPC uygulaması olan tüm taşıma mekanizmaları üzerinde çalışabilir. Tabii ki TCP / IP’de UDP ve TCP olmak üzere iki taşıma protokolümüz var. NFS’nin ulaşım protokolünü kullanırken bir çeşit evrim geçirdiğini görmek ilginç. NFSv2 standardı, UDP kullanarak “normal” çalıştığını söylüyor ve bu hala NFS bilgilerinin taşınması için yaygın bir yöntem. NFSv3, UDP veya TCP’nin kullanılabileceğini, ancak NFSv4’ün veri taşımak için TCP’yi belirttiğini söylüyor. NFS tarafından kullanılmak üzere nominal kayıtlı port numarası 2049’dur, ancak aslında RPC’nin “port mapper” özelliği kullanılarak NFS için başka port numaraları da kullanılmaktadır.

UDP güvenilir olmadığından, bu protokolün önemli bilgileri aktarmak için kullanılması garip görünebilir. Örneğin, aktarım sırasında kaybedilecek bir dosyaya yazmaya çalıştığımız verileri açık bir şekilde istemiyoruz. Bununla birlikte, UDP’nin güvenilir iletişimi sağlamak için önlemlerin kullanılmasını engellemediğini, sadece bu yetenekleri sağlamadığını unutmayın. UDP NFS tarafından kullanılabilir çünkü protokolün kendisi aktarılan veri kaybını tolere etmek ve ondan kurtarmak için tasarlanmıştır.

Bu konsepte uygun olarak, NFS’nin genel tasarımı, protokolün sunucuya değil client uygulanması sorumluluğunun çoğunu getirir. NFSv3 standardının dediği gibi, “NFS sunucuları aptaldır ve NFS clientleri akıllıdır.” Bunun anlamı, sunucuların yalnızca isteklere yanıt vermeye odaklanırken, client protokolün “nitty-gritty” ayrıntılarının çoğuna dikkat etmek zorundadır. , başarısız iletişimden kurtarma da dahil olmak üzere. Aslında bu, UDP kullanıldığında sık karşılaşılan bir gerekliliktir, çünkü bir müşteri talebi transfer yolunda kaybedilirse, sunucunun gönderildiğini bilmenin hiçbir yolu yoktur.

NFS sunucuları “stateless” olacak şekilde tasarlanmıştır. Basitleştirilmiş terimlerle, NFS sunucusunun bir istemden diğerine kullanan istemcilerin durumunu takip etmediği anlamına gelir. Her istek öncekinden bağımsızdır ve esasen sunucu, bir müşteriden yeni bir komut aldığında daha önce yaptıklarından “hafızasına” sahip değildir. Bu yine clientlere daha fazla “akıllı” olmasını gerektirir, ancak sunucunun çökmesi durumunda kurtarmayı basitleştirme konusunda önemli bir avantaja sahiptir. Sunucunun müşteri için takip ettiği hiçbir şey olmadığından, kaybedilecek hiçbir şey yoktur. Bu, ağ sorunları veya tıkanıklığı nedeniyle dosyaların zarar görmemesini sağlamanın önemli bir parçasıdır.

Hem NFS clientleri hem de sunucular, performansı artırmak için önbelleklemeyi(caching) kullanabilir. Sunucular, tekrar gerekli olması durumunda, en son istenen bilgileri saklamak için önbelleği kullanabilir. Ayrıca bazen predictive caching(tahmini caching) olarak da adlandırılan önbelleğe alma özelliğini kullanabilirler. Bu teknikte, bir dosyadan bir veri bloğunu okuma isteği alan bir sunucu, bir sonraki bloğun belleğe yüklenebileceği teorisine göre bir sonraki bloğa yüklenebilir. Client tarafında önbellekleme, ek RPC çağrılarını engellerken uygulamalardan gelen NFS isteklerini tekrarlamak için kullanılır. NFS ile ilgili hemen hemen her şey gibi, önbellekleme de NFS sürüm 4’te önceki sürümlerde olduğundan çok daha ayrıntılı bir şekilde uygulanır.

NFS Sunucu Prosedürleri ve İşlemleri

Bir NFS client ile sunucu arasındaki gerçek bilgi alışverişi, Remote Procedure Call (RPC) protokolü ile gerçekleştirilir. Bu nedenle NFS işlevselliği, belirli protokol işlemleri açısından değil, bir müşterinin bir sunucuda bulunan dosyalar üzerinde gerçekleştirebileceği farklı eylemleri tanımlayarak açıklanmaktadır. NFS’nin orijinal sürümünde, NFSv2, bunlara NFS sunucusu prosedürleri denir.

Her prosedür, bir müşteriden dosyadan okuma, bir dosyaya yazma veya bir dizin oluşturma veya kaldırma gibi gerçekleştirebileceği belirli bir işlemi temsil eder. Dosya üzerinde gerçekleştirilen işlemler, dosyanın dosya tanıtıcısı(file handle) adı verilen bir veri yapısı kullanılarak referans alınmasını gerektirir. Adından da anlaşılacağı gibi, dosya tanıtıcısı, gerçek bir nesnenin tanıtıcısı gibi, istemcinin ve sunucunun dosyayı “kavramasını” sağlar. Mount protokolü, bir dosya sistemini bağlamak için, bir dosya tanıtıcısının NFS prosedürleri tarafından kullanılmak üzere erişilmesini sağlamak için kullanılır.

NFS’nin 2. ve 3. sürümlerinde tanımlanan sunucu prosedürlerini gösterir. Tabloda hem NFSv2 hem de NFSv3 için işlem numaralarının yanı sıra her işlemin adı ve ne olduğu ile ilgili bir açıklama gösterilmektedir.

NFS 3 - Veri yapıları

Bir müşterinin bir dosya üzerinde birden fazla işlem yapmak istemesi yaygındır: örneğin, birkaç ardışık okuma. NFSv2 ve NFSv3’teki sunucu prosedürü sistemindeki sorunlardan biri, her client işleminin ayrı bir prosedür çağrısı gerektirmesidir. Bu, özellikle NFS yüksek gecikmeli(high-latency) bir bağlantı üzerinden kullanıldığında, verimsizdi.

Sunucu prosedürlerinin etkinliğini artırmak için, NFS sürüm 4 sunucu prosedürlerinin uygulanma biçiminde önemli bir değişiklik yapar. Her müşteri eyleminin ayrı bir prosedür yerine, bileşik (compound) adı verilen tek bir prosedür tanımlanmaktadır. Bu “bileşik” prosedürde, çok sayıda sunucu işlemi kapsüllenir. Bunların hepsi tek bir birim olarak gönderilir ve sunucu her bir işlemdeki talimatları sırayla yorumlar ve izler.

Bu değişiklik aslında aşağıda gösterildiği gibi NFSv4’te yalnızca iki RPC prosedürü olduğu anlamına gelir.

NFS 4

Aşağıdaki resimden de anlaşılacağı gibi NFSv4 işlemlerinin sayısının, NFSv2 ve NFSv3’teki işlem sayısından çok daha büyük olduğunu fark edeceksiniz. Bunun nedeni hem sürüm 4’teki özellikler hem de NFSv4’ün daha önce ayrı Mount protokolü tarafından gerçekleştirilen işlevleri NFS’nin kendisine dahil etmesidir.

NFS 5 arka plan

NFS Dosya Sistemi Modeli ve Mount Protokolü

NFS, client tarafından uzaktaki dizin dosyalarına erişimi yerelmiş gibi taklit etmek için kullanıldığından, protokol uzaktaki sistemden yerel kullanıcıya dosyaları “sunmalıdır”. Yerel bir depolama cihazındaki dosyalar belirli bir dosya sistemi kullanılarak düzenlenirken, NFS de dosyaların bir kullanıcıya nasıl gösterildiğini göstermek için bir dosya sistemi modeli kullanır.

NFS tarafından kullanılan dosya sistemi modeli, çoğumuzun aşina olduğu yöntemle aynıdır: dosyaları ve alt dizinleri içeren dizinlerin hiyerarşik bir dizilimi. Hiyerarşinin tepesi, herhangi bir sayıda dosyayı ve birinci seviye dizinleri içeren köktür. Her dizin, isteğe bağlı bir ağaç yapısının oluşturulmasına izin vererek daha fazla dosya veya başka dizinler içerebilir.

Bir dosya, dosya adını ve dosyayı bulmak için kökten geçmesi gereken dizinlerin sırasını gösteren bir yol adı kullanılarak benzersiz bir şekilde belirtilebilir. NFS, UNIX ile ilişkilendirildiğinden, NFS tartışmalarındaki dosyalar genellikle UNIX notasyonunda gösterilir; örneğin “/etc/hosts”, aynı temel ağaç fikri, Microsoft işletim sistemleri tarafından izlenen yöntem kullanılarak da ifade edilebilir: “C:\WINDOWS\HOSTS”

NFS, bir clientin uzak sunucudaki bir dosyaya erişmesine izin vermek için kullanılmadan önce, cliente dosyaya erişmesi için bir yol verilmelidir. Bu, uzak dosya sisteminin bir kısmının cliente sunulması gerektiği ve dosyanın erişim için açıldığı anlamına gelir. NFS’nin dosya erişimini engelleme, işlevleri açma ve kapatma işlevlerini NFS’ye uygun hale getirmek için belirli bir karar verildi. Bunun yerine, NFS ile çalışmak için ayrı bir protokol oluşturuldu; gelecekte dosya erişimi sağlama yönteminin değiştirilmesi gerekiyorsa, NFS’de değişiklik yapılması gerekmeyecekti. Bu ayrı mekanizmaya Mount Protokolü denir. İşlevsel olarak farklı olsa da, Mount’ın genel NFS paketinin bir parçası olarak kabul edildiğini unutmayın.

“Mount” terimi aslında fiziksel bir depolama hacminin kullanılabilir hale getirilmesi anlamına gelen bir donanım terimine benzer. “Olden dayse” ‘da depolama aygıtları genellikle çıkarılabilir disk paketleridir ve onu kullanmak için sürücü ünitesine monte ettiler. Benzer şekilde, NFS kaynakları, paylaşılan dosya sistemini istemciye uygun kılan Mount protokolü kullanılarak mantıksal olarak bağlanır. Daha sonra bir dosya açılabilir ve bir dosya tanıtıcısı NFS istemcisine geri gönderilebilir, böylece dosyaya okuma ve yazma gibi işlemler için başvuruda bulunabilir.

Mount ve NFS arasındaki temel fark, basitçe Mount’un dosya erişim işlemleri yerine dosya sistemlerini açma ve kapama ile ilgili prosedürleri tanımlamasıdır.

NOT : NFS sürüm 4, dosya bağlama işlemlerini doğrudan NFS’ye dahil eden ayrı bir Mount protokolü kavramını ortadan kaldırır.

Örnek NFS sunucu ve Client yapılandırması

  • NFS Server IP : 192.168.100.10
  • NFS Client IP : 192.168.100.11

Aşağıdakiler nfs-utils paketinden bulunan önemli NFS servisleridir.

  • rpcbind : RPC program numaralarını universal adreslere dönüştürür.
  • nfs-server : Clientlerin NFS paylaşımlarına erişmesini sağlar.
  • nfs-lock / rpc-statd : NFS file locking. Bir NFS sunucusu çöktüğünde ve yeniden başlatıldığında file lock recovery yapılmasını sağlar.Sadece sunucuda çalıştırılması yeterlidir.
  • nfs-idmap : Kullanıcı ve grup kimliklerini isimlere, kullanıcı ve grup adlarını idlere(kimliklere) çevirir.

NFS sunucusunu ve clientleri ayarlamak için çoğunlukla aşağıdaki yapılandırma dosyaları üzerinde çalışıyor olacaksınız.

  • /etc/exports : Ana yapılandırma dosyasıdır, hangi dosya sistemlerinin uzak ana bilgisayarlara(clientlara) verileceğini kontrol eder ve seçenekleri belirtir.
  • /etc/fstab : Bu dosya, sistem önyüklenirken NFS dizinleri dahil olmak üzere hangi dosya sistemlerinin mount edildiğini kontrol etmek için kullanılır.
  • /etc/sysconfig/nfs : Bu dosya, gerekli RPC hizmetlerinin hangi portlarda çalıştığını kontrol etmek için kullanılır.
  • /etc/hosts.allow ve /etc/hosts.deny : Bu dosyalara TCP wrappers denir, NFS sunucusuna erişimi kontrol eder. NFS tarafından başka bir IP adresinden gelen bir bağlantının kabul edilip edilmeyeceğine karar vermek için kullanılır.
  1. NFS paketlerini NFS sunucusuna kurmamız için aşağıdaki komutu kullanabiliriz.
yum install nfs-utils libnfsidmap
  1. Paketler yüklendikten sonra NFS hizmetlerini etkinleştirin ve başlatın.
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server
systemctl start rpc-statd
systemctl start nfs-idmapd
  1. Şimdi, clientlerle paylaşmak için sunucuda bir dizin oluşturalım. Burada “/” bölümünde “nfsfileshare” isimli yeni bir dizin oluşturacağım.

Not: Mevcut dizinizide NFS ile de paylaşabilirsiniz.

mkdir /nfsfileshare
  1. Oluşturulan dizine herkes için okuma ve yazma izni verin.
chmod 777 /nfsfileshare/
  1. /etc/exports dosyasına paylaşmak istediğimiz dosya ile ilgili bilgileri yazıyoruz.
[root@localhost ~]# cat /etc/exports
/nfsfileshare 192.168.100.11(rw,sync,no_root_squash)
  • /nfsfileshare : paylaşılan dizin
  • 168.100. 11 : Client makinesinin IP adresi. IP adresi yerine hostname adını da kullanabiliriz. Ayrıca 192.168.12.0/24 gibi alt ağa sahip istemciler aralığını tanımlamak da mümkündür. * koyarak herekesede izin verebiliriz.
  • rw : Paylaşılan klasöre yazma izni
  • ro: sadece okuma..
  • sync : Senkron dosya paylaşımı gerçekleştirileceğini belirtir. Senkron kullanımında istemcinin yazma işleminin bitmesi beklendikten sonra veriler sunucunun diskine yazılır (işlenir). Bu sebeple kontrollü ve yavaş olmasına rağmen daha güvenilir ve veri kaybını azaltıcı bir seçenektir. Varsayılan senkronizasyon seçeneğidir.
  • async : Asenkron dosya paylaşımı gerçekleştirileceğini belirtir.
  • root_squash : Bağlantı kuracak istemci üzerinden, paylaşılan dizinlerde (“rw” yetkisi etkinleştirilmişse) “root” izni ile dosya oluşturulamaması/erişilememesi sağlanır. Bu parametrenin etkinleştirilmesi sayesinde, istemci tarafında paylaşıma “root” yetkisi ile bağlanıldığında, NFS kurulu sunucuda bu kullanıcı “nobody” adlı kullanıcıya çevrir yani istemcinin “root” kullanıcısının yetkisini ezerek, hedef NFS paylaşımına en az yetkili kullanıcı ile bağlanılmasını sağlar. Varsayılan istemci kullanıcı yetkisini ezme seçeneğidir.
  • no_root_squash : nfs client’ların export edilen dizinlere, root yetkisi ile erişmesini sağlamaktadır. Bu nedenle, NFS sunucunuzu public bir ortamda kullanmak istiyorsanız güvenlik nedenlerinden ötürü bu parametreyi kullanmanız önerilmez. Yukarıda değinilen sebeplerle, no_root_squash parametresini kullanmak istememeniz durumunda, export ettiğiniz dizine rw (read-write) yetkisi vermiş olsanız bile, clientlar okuma işlemini yapabilecek ama yazamayacaklardır.  Bunun nedeni ise, clientların kullanıcılarının, server tarafından default olarak nfsnobody isimli yetkisiz kullanıcıya set edilmesidir. Bu durumda, nfs üzerinden erişilen dizinlere direk olarak yazma işlemi yapılamaz.
    Eğer no_root_squash parametresini kullanmak istemiyor ama bir yandan da NFS clientların paylaşımdaki dizinlere yazabilmesini istiyorsanız izleyebileceğiniz iki yol var; Birincisi exports edilmiş dizinin permission’ını 777 olarak belirlemek. u şekilde ilgili dizine herkes yazabileceğinden nfsnobody kullanıcısı da yazabilecektir. İkinci yöntem ise ilgili dizinin owner’ını nfsnobody olarak set etmektir.
  • all_squash : Bağlantı kuracak istemci üzerinden, paylaşılan dizinlerde (“rw” yetkisi etkinleştirilmişse) hangi kullanıcı ile bağlanılırsa bağlanılsın, ilgili kullanıcının (“root” dahil) izni ile dosya oluşturulamaması/erişilememesi sağlanır. Yani, istemciden bağlanan tüm kullanıcılar sunucu tarafında anonim kullanıcı olarak değerlendirilir.
  • squash_uids 0,10-30,1000-2000, squash_gids 0,50,200-220 : Bağlantı kuracak istemci üzerinden, paylaşılan dizinlerde (“rw” yetkisi etkinleştirilmişse) belirtilen kullanıcıların kendi izinleri ile dosya oluşturulamaması/erişilememesi sağlanır. Yani, istemciden bağlanan belirli kullanıcı veya grup ID’leri/ID aralıkları sunucu tarafında anonim kullanıcı olarak değerlendirilir.
  1. Aşağıdaki komutu kullanarak paylaşılan dizinleri listeleyebiliriz.
exportfs –r
  • exportfs -v : Sunucudaki paylaşım dosyalarının bir listesini ve opsiyonları görüntüler
  • exportfs -a : Paylaşılan tüm dizinleri gösterir
  • exportfs -u : Tüm paylaşılan dizinleri serbest bırakır. tüm NFS görevlerini tutarken NFS dosya paylaşımını askıya alır. NFS paylaşımını yeniden etkinleştirmek için exportfs -r yazın.
  • exportfs -r : /etc/exports dosyası yeniden okunarak tüm değişiklikleri listeler
  1. Clientlerin NFS paylaşımlarına erişmesine izin vermek için güvenlik duvarını NFS sunucusunda yapılandırmamız gerekir. Bunu yapmak için, NFS sunucusunda aşağıdaki komutları çalıştırın.
firewall-cmd --permanent --zone public --add-service mountd
firewall-cmd --permanent --zone public --add-service rpc-bind
firewall-cmd --permanent --zone public --add-service nfs
firewall-cmd --reload

Firewall’u kapatmak istersek

systemctl stop firewalld
systemctl disable firewalld
  1. Uzak dosya sistemini bağlamak için NFS cliente NFS paketleri kurmalıyız, aşağıdaki komutu kullanarak NFS paketleri kurmalıyız.
yum -y install nfs-utils libnfsidmap

Paketler yüklendikten sonra NFS servisini etkinleştirin ve başlatın.

systemctl enable rpcbind
systemctl start rpcbind
  1. NFS paylaşımını bağlamadan önce, NFS sunucusundaki kullanılabilir paylaşımları kontrol etmemiz gerekir. Bunu yapmak için, cliente aşağıdaki komutu çalıştırın.
showmount -e 192.168.100.11
Export list for 192.168.100.11:
/nfsfileshare 192.168.100.10

NOT : “showmount –e” komutu yerel makinenizdeki mevcut paylaşımları gösterir. “showmount -e <server-ip or hostname>” komutu ise uzak sunucudaki kullanılabilir paylaşımları listeler

  1. Şimdi, daha önce sunucuda yarattığımız ‘/nfsfileshare’ paylaşılan klasörünü bağlamak için bir bağlama dizini oluşturun.
mkdir /mnt/nfsfileshare
  1. Aşağıdaki komutla paylaşılan dizini mount edelim.
mount 192.168.12.5:/nfsfileshare /mnt/nfsfileshare
  1. Mount edilen dizini aşağıdakiler gibi sorgulayabiliriz.
mount | grep nfsfileshare
192.168.100.10:/nfsfileshare on /mnt/nfsfileshare type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.100.11,local_lock=none,addr=192.168.100.10)
df -hT | grep nfsfileshare
192.168.100.10:/nfsfileshare nfs4 50G 858M 50G 2% /mnt/nfsfileshare
  1. Paylaşılan dizinleri makine reboot sonrası otomatik olarak mount etmek için /ets/fstab dosyasına aşağıdaki satırı eklyoruz.
cat /etc/fstab | grep nfsfileshare
192.168.100.10:/nfsfileshare/ /mnt/nfsfileshare nfs rw,sync,hard,intr 0 0
  1. Dosya paylaşımını yaptıktan sonra bu paylaşılan dizini istemci sunucunuzdan çıkarmak istiyorsanız, “umount” komutunu kullanarak söz konusu dizinin bağlantısını kaldırabilirsiniz.
umount /mnt/nfsfileshare

Mustafa Bektaş Tepe
İyi Çalışmalar

Loading