نصب و راه اندازی NFS Server در CentOS
قدم به قدم با نصب NFS Server در CentOS
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
سپس سرویس های مربوطه را از طریق دستور زیر فعال می کنیم تا در هر بار بوت شدن سیستم عامل، سرویس به صورت اتوماتیک شروع به کار نماید.
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 اختصاص داده شده است.
حال با دستور rpcinfo –p میتوانیم ببینیم که این program id به چه پورتی map شده است.
همانطور که در شکل بالا مشخص است، 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)
پارامتر های پیکربندی:
برخی از پارامتر های مورد استفاده در فایل /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
و با دستور mount –a سیستم را force میکنیم تا بر اساس فایل fstab عملیات mount کردن را مجددا انجام دهد.
حال با دستور df یا mount میتوان مطمئن شد که عملیات طبق انتظار انجام شده باشد.
در نهایت با mount شدن دایرکتوری nfs به دایرکتوری share در سرور دوم، جهت تست نیز فایلی در مسیر /share ایجاد مینماییم.
همانطور که مشاهده میشود، به علت استفاده از no_root_squash فایل ایجاد شده با ownership کاربر root ایجاد شده است.
تست عملکرد:
حال جهت تستی دیگر این گزینه را به root_squash تغییر می دهیم و مجددا فایلی را ایجاد می نمائیم.
طبق توضیحات بالا همانطور که انتظار میرفت فایل جدید با ownership کاربر nobody ایجاد گردید.
به عنوان آخرین تست نیز میخواهیم تمامی فایل های ایجاد شده در مسیر /share با ownership کاربر hamed و گروه nfsnobody ایجاد گردند. برای این کار فایل exports را به شکل زیر تغییر میدهیم.
در server1 کاربر hamed دارای uid برابر با 1002 می باشد.
از آنجا که کاربری به نام hamed در سرور دوم وجود ندارد، در نتیجه امکان map کردن این uid به نام کاربری برای سرور دوم مقدور نمی باشد و صرفا uid را نمایش میدهد. در صورتی که در server1 این نام کاربری وجود دارد لذا وضعیت فایل در سرور اول به صورت زیر می باشد.
نتیجه گیری:
در این مستند نحوه پیکربندی و پیاده سازی سرویس NFS مورد بررسی قرار گرفت. این سرویس از آن نظر که محدودیتی در توزیع سیستم عامل های لینوکسی در آن وجود ندارد میتواند در شبکه به عنوان Central Storage مورد استفاده و بهره برداری قرار گیرد.