NFS

آموزش نصب و راه اندازی NFS Server

NFS چیست:

NFS مخفف کلمات Network File System  و معرفی پروتکلی برای به اشتراک گزاری دایرکتوری بین سرور های لینوکسی است. از طریق این پروتکل میتوان یک دایرکتوری را در بستر شبکه با سرور یا کلاینتی دیگر به اشتراک گذاشت به شکلی که گویی از دیسک لوکال خود در حال استفاده است. از این پروتکل تاکنون چهار نسخته ارائه شده است که آخرین آن NFSv4 می باشد. خصوصیات و معرفی ورژن های مختلف این پروتکل رو میتوانید از اینجا مطالعه کنید.

این سرویس به صورت سرور / کلانت فعالیت می کند و از طریق آن میتواند Storage مرکزی ای ایجاد کرد. همچنین میتوان آن را از طریق acl در ورژن جدید آن نیز ایمن تر کرد.

 

راه اندازی NFS server:

در این مستند راه اندازی سرویس NFS روی centos 7  و با هدف اشتراک گزاری یک دایرکتوری بین دو سرور با قابلیت read/write  همزمان بر روی آنها توضیح داده خواهد شد

در این آموزش از دو سیستم در محیطی تستی و با مشخصات زیر استفاده شده است.

Server1:

CentOS Linux release 7.4.1708 (Core)

IP: 192.168.200.200

Server2:

CentOS Linux release 7.4.1708 (Core)

IP: 192.168.200.201

ماشین Server1 در این مستند به عنوان NFS Server  و server  دوم به عنوان NFS Client  فعالیت خواهند کرد.

برای نصب NFS در هر دو ماشین از دستور زیر استفاده میکنیم تا پکیج مربوطه به همراه Dependency  های آن نصب گردد.

Server1~]#  yum –y install nfs-utils

بعد از نصب،  در سرور اول،  دایرکتوری ای که قصد Share کردن آن را داریم را ایجاد میکنیم  و owner  دایرکتوری را به همراه پرمیژن ها آن مشخص میکنیم .

Server1~]#  mkdir -p /share/nfs

Server1~]#  chmod –R 755 /share/nfs

Server1~]#  chown nfsnobody:nfsnobody /share/nfs

file creation and permissions

سپس سرویس های مربوطه  را از طریق دستور زیر فعال می کنیم تا در هر بار  بوت شدن سیستم عامل، سرویس به صورت اتوماتیک شروع به کار نماید.

Server1~]#  systemctl enable rpcbind

Server1~]#  systemctl enable nfs-server

Server1~]# systemctl enable nfs-lock

Server1~]# systemctl enable nfs-idmap

یا به صورت کلی در یک دستور به صورت زیر

Server1~]# systemctl enable rpcbind nfs-server nfs-lock nfs-idmap

حال سرویس های مربوطه را به صورت زیر start  میکنیم.

Server1~]#  systemctl enable rpcbind

Server1~]#  systemctl enable nfs-server

Server1~]# systemctl enable nfs-lock

Server1~]# systemctl enable nfs-idmap

یا مانند بالا به صورت کلی و با یک دستور:

Server1~]# systemctl start  rpcbind  nfs-server nfs-lock nfs-idmap

معرفی سرویس ها:

 

  • rpcbind:وظیفه mapping سرویس  را به پورت آن بر عهده دارد. سرویس RPC به هر برنامه یک آیدی اختصاص میدهد  که به آن program ID گفته می شود این اطلاعات در فایل /etc/rpc نگه داری میشود. این سرویس مشخص می کند که هر program id از چه پورتی برای برقراری ارتباط میتواند استفاده کند. هنگامی که کلاینتی درخواستی مبنی بر اتصال ایجاد می نماید، این سرویس پورت مربوطه را مشخص کرده، سپس کاربر را به سمت آن هدایت میکند در نتیجه امکان ارتباط و communicate بین سرویس و کلاینت مستلزم فعال بودن این سرویس می باشد که می بایست قبل از باقی سرویس ها شروع به کار نماید.

همانطور که در شکل زیر مشاهده می کنیم، به سرویس NFS آیدی ای برابر با 100003 اختصاص داده شده است.

rpcbind

حال با دستور rpcinfo –p میتوانیم ببینیم که این program id به چه پورتی map شده است.

rpcinfo

همانطور که در شکل بالا مشخص است، nfs در ورژه های 3 و 4  بر روی پورت 2049 udp و tcp فعالیت میکند.

  • nfs-idmap: وظیفه mapping بین username و Group  به  UID و GID را بر عهده دارد.
  • nfs-lock: عملیات locking بر روی فایل های NFS را بر عهده دارد. در صورتی که کلانتی درخواست locking  برای فایلی را به سرور ارسال نماید، این سرویس وظیفه مدیریت این در خواست را بر عهده دارد. به عنوان مثال در صورت درخواست کلاینت به صورت پیشفرض به مدت 15 ثانیه بر روی فایل عملیات locking  را انجام میدهد.

بعد از شروع به کار سرویس ها،  دایکتوری ای را که ایجاد کرده ایم را به صورت زیر در فایل /etc/export معرفی میکنیم.

/share/nfs      192.168.200.201(rw,sync,no_root_squash,no_all_squash)

exports

پارامتر های پیکربندی:

برخی از پارامتر های مورد استفاده در فایل /etc/export به شرح زیر است:

  • rw: مجوز هر دو عملیات خواندن و نوشتن بر روی فایل سیستم را فراهم میکند.به صورت پیشفرض هر عملیاتی که منجر به تغییر بر روی فایل سیستم شود، نادیده گرفته میشود، همانند رفتاری که در تنظیم ro در پیش گرفته میشود.
  • async: این گزینه این امکان را فراهم میکند تا به درخواست های تغییر بر روی دیسک قبل از این که واقعا تغییری اعمال شود، پاسخ داده شود. در واقع به کلاینت گفته می شود تغییرات مورد نظر بر روی دیسک اعمال شده است ولی در عمل اینطور نیست. این گزینه میتواند کارایی سیستم را بهبود ببخشد اما در کنار این بهبود ریسک از دست رفتن اطلاعات در صورت ری استارت شدن ناگهانی سرور یا به اصطلاح unclean restart ( مانند شرایط کرش کردن کرنل و قطع برق سرور و …) نیز وجود دارد.
  • sync: درخواست تغییر روی دیسک تنها و تنها زمانی به کلاینت ارسال می شود که تغییرات بر روی دیسک اعمال یا commit  شده باشد. از ورژن ۱ به بعد این گزینه به عنوان تنظیمات پیش فرض مورد استفاده قرار میگیرد.
  • wdelay:  در صورتی که سرور تشخیص دهد ممکن است عملیات نوشتن دیگری مرتبط با عملیات فعلی بر روی دیسک انجام شود، عملیات نوشتن بر روی دیسک را با تاخیر انجام خواهد داد. این کار باعث میشود تا در یک عملیات نوشتن چندین درخواست را در دیسک نوشت. در نتیجه تعداد دفعات رجوع به دیسک جهت نوشتن داده بر روی آن کمتر میشود که در نتیجه آن کارایی سرور نیز بهبود می یابد. اما در مواقعی که درخواست های زیاد و نامرتبطی به سرور ارسال شود فعال بودن این گزینه عملا میتواند باعث کاهش کارایی و عملکرد سرور شود. این گزینه از تنظیمات پیش فرض است که جهت غیر فعال سازی آن میتوان از no_wdelay استفاده کرد.
  • root_squash: در صورتی که کاربر root قصد دسترسی به فایلی را در nfs ‌ سرور داشته باشد. رفتار سرور با این کاربر هماهنند کاربر root در سرور اصلی خواهد بود. با فعال بودن این گزینه. uid کاربر root در سرور به  uid دیگری که متعلق به کاربر nobody است map میشود. در نتیجه سطح دسترسی کاربر در سرور به حداقل دسترسی ممکن کاهش می باید. برای غیر فعال سازی این گزینه از گزینه no_root_squash استفاده میشود.
  • all_squash : عملکردی همانند عملکرد  root_squash‌دارد با این تفاوت که این عملکرد برروی تمامی کاربرای تاثیر گزار خواهد بود. غیر فعال سازی عملکرد این گزینه با no_all_squash امکان پذیر است. فعال کردن این گزینه برای فایل سیستم هایی که در دسترس عموم قرار میگیرند مناسب است.
  • anonuid and anongid: با استفاده از این دو گزینه میتوان درخواست های یک فایل سیستم یا دایرکتوری را که از سمت کاربر anonymous  وارد می شود را به یک uid و  gid به خصوص map کرد. به عنوان مثال تصور کنید نام کاریری ای به نام javad با uid ‌ برابر با ۵۰۵  داریم. با انتخاب گزینه anouid=505 تمامی درخواست ها بر روی فایل ها با uid  کاربر javad ثبت و انجام می شوند.

لازم به ذکر است در صورتی که بخواهیم اشتراک گزاری را به آدرس خاصی محدود نکنیم میتوانیم جای آدرس IP از “*” استفاده کنیم.

در نهایت تنظیمات مربوط به فایروال را برای باز کردن NFS و سرویس ها مورد استفاده آن را به صورت زیر انجام میدهیم.

firewall-cmd --permanent --zone=public --add-service=nfs

firewall-cmd --permanent --zone=public --add-service=mountd

firewall-cmd --permanent --zone=public --add-service=rpc-bind

firewall-cmd –reload

تنظیمات سمت کلایت ( Server2)

پس از نصب پکیج nfs-utils  بر روی سرور دوم، می بایست دایرکتوری را که قصد داریم جهت sharing  از آن استفاده کنیم را ایجاد کرده، سپس مسیر share  شده در سرور اول را با تایپ NFS   به آن  mount کنیم.

Server2~]#  mkdir /share

mount -t nfs 192.168.200.200:share/nfs /share

برای این که عملیات mount  کردن به صورت اتوماتیک در هر بار بوت شدن سیستم عامل انجام شود، خط زیر را در فایل /etc/fstab اضافه میکنیم.

192.168.200.200:share/nfs           /share   nfs defaults 0 0

fstab

و با دستور mount –a  سیستم را force میکنیم تا بر اساس فایل fstab  عملیات mount  کردن را مجددا انجام دهد.

حال با دستور df  یا mount  میتوان مطمئن شد که عملیات طبق انتظار انجام شده باشد.

df output

mount output

در نهایت با mount شدن دایرکتوری nfs به دایرکتوری  share در سرور دوم،  جهت تست نیز فایلی در مسیر /share  ایجاد مینماییم.

create shared directory

همانطور که مشاهده میشود، به علت استفاده از no_root_squash فایل ایجاد شده با ownership کاربر root ایجاد شده است.

تست عملکرد:

حال جهت تستی دیگر این گزینه را به root_squash تغییر می دهیم و مجددا فایلی را ایجاد می نمائیم.

create shared directory root squash

طبق توضیحات بالا همانطور که انتظار میرفت فایل جدید با ownership  کاربر nobody  ایجاد گردید.

به عنوان آخرین تست نیز میخواهیم تمامی فایل های ایجاد شده در مسیر /share با ownership کاربر hamed و گروه  nfsnobody ایجاد گردند. برای این کار فایل exports را به شکل زیر تغییر میدهیم.

nfs usr_id

در server1 کاربر hamed دارای uid  برابر با 1002  می باشد.

anouid

از آنجا که کاربری به نام hamed در سرور دوم وجود ندارد، در نتیجه امکان map کردن این uid  به نام کاربری برای سرور دوم مقدور نمی باشد و صرفا uid را نمایش میدهد. در صورتی که در server1  این نام کاربری وجود دارد لذا وضعیت فایل در سرور اول به صورت زیر می باشد.

ls output

نتیجه گیری:

در این مستند نحوه پیکربندی و پیاده سازی سرویس NFS مورد بررسی قرار گرفت. این سرویس از آن نظر که محدودیتی در توزیع سیستم عامل های لینوکسی در آن وجود ندارد میتواند  در شبکه به عنوان Central Storage  مورد استفاده و بهره برداری قرار گیرد.

حامد
اشتراک دانش رو دوست دارم برای همین سعی میکنم مطالب آموزشی ای تهیه شده دارای جزئیات خوب و به صورت کامل تهیه بشوند.استفاده از مطالب این سایت در هر جایی بلا مانع می باشد. اما ذکر منبع رفتاری حرفه ای و اخلاقی خواهد بود. من را از نظرات خود مطلع سازید. و اگر میخواهید در مورد من بیشتر بدانید سری به صفحه "در باره من" بزنید.