مقدمه
NFS (Network File System) یک پروتکل سیستم فایل توزیعشده است که به شما اجازه میدهد دایرکتوریهای ریموت را روی سرور خود Mount کنید. این قابلیت به شما امکان میدهد فضای ذخیرهسازی را در مکانی متفاوت مدیریت کرده و از چندین کلاینت به آن فضای بنویسید. NFS روشی نسبتاً استاندارد و با عملکرد بالا برای دسترسی به سیستمهای ریموت از طریق شبکه فراهم میکند و در موقعیتهایی که منابع مشترک باید به طور منظم مورد دسترسی قرار گیرند، به خوبی کار میکند.
در این راهنما، نحوه نصب نرمافزار سرور و کلاینت NFS در اوبونتو، پیکربندی اشتراکگذاری (Exports) NFS، تنظیم نقاط اتصال (Mount Points) و ایجاد اتصالات دائمی NFS با استفاده از تنظیمات fstab را بررسی خواهیم کرد.
(نکته: این آموزش بر روی اوبونتو 24.04 بهروزرسانی شده است. نام پکیجها، دستورات و فایلهای پیکربندی در این نسخه به طور یکپارچه کار میکنند.)
نکات کلیدی:
- NFS با اجازه دادن به چندین سرور کلاینت برای دسترسی به دایرکتوریهای به اشتراکگذاشتهشده از یک سرور میزبان، ذخیرهسازی متمرکز را امکانپذیر میسازد.
- برای راهاندازی NFS به دو پکیج نیاز دارید:
nfs-kernel-serverروی هاست وnfs-commonروی ماشینهای کلاینت. - امنیت از طریق فایل
/etc/exportsپیکربندی میشود که در آن دایرکتوریهای مورد نظر برای اشتراک و آدرسهای IP کلاینتهای مجاز را مشخص میکنید. - قوانین فایروال برای محدود کردن دسترسی NFS به کلاینتهای مجاز ضروری هستند (معمولاً با استفاده از UFW برای باز کردن پورت 2049 برای IPهای خاص).
- برای اتصالات دائمی، نیاز به تنظیمات
/etc/fstabدارید تا اشتراکهای NFS پس از ریبوت سیستم به طور خودکار مجدداً متصل شوند. - برای دستیابی به بهترین عملکرد، توصیه میشود از سرورهای اختصاصی پارمین کلود (Parmin Cloud) با شبکه ۱۰ گیگابیتی برای سرور و کلاینتهای NFS استفاده کنید.
پیشنیازها
در این آموزش از دو سرور استفاده خواهیم کرد، که یکی بخشی از سیستم فایل خود را با دیگری به اشتراک میگذارد. برای دنبال کردن این آموزش به موارد زیر نیاز دارید:
- دو سرور اوبونتو 24.04. هر کدام باید دارای یک کاربر غیر روت (non-root) با دسترسی sudo، فایروال پیکربندیشده با UFW و در صورت امکان شبکه خصوصی (Private Networking) باشند.
- اگر از سرورهای پارمین کلود (Parmin Cloud) برای سرور و کلاینت خود استفاده میکنید، میتوانید برای راهاندازی شبکه خصوصی به مستندات VPC ما مراجعه کنید.
- در طول این آموزش، به سروری که دایرکتوریهای خود را به اشتراک میگذارد هاست (Host) و به سروری که این دایرکتوریها را Mount میکند کلاینت (Client) اشاره میکنیم. شما باید آدرس IP هر دو را بدانید. اگر شبکه خصوصی در دسترس است، حتماً از آدرس IP خصوصی استفاده کنید.
- در این آموزش از عبارتهای جایگزین
host_ipوclient_ipاستفاده شده است. لطفاً آنها را با IPهای واقعی خود جایگزین کنید.
مرحله ۱ — دانلود و نصب کامپوننتها
ابتدا کامپوننتهای لازم NFS را روی هر سرور نصب میکنیم.
روی هاست (Host)
روی سرور میزبان، پکیج nfs-kernel-server را نصب کنید که به شما اجازه میدهد دایرکتوریهای خود را به اشتراک بگذارید. از آنجایی که این اولین عملیاتی است که در این نشست با apt انجام میدهید، ابتدا ایندکس پکیج محلی را بهروزرسانی کنید:
sudo apt update
sudo apt install nfs-kernel-server
پس از نصب این پکیجها، به سرور کلاینت بروید.
روی کلاینت (Client)
روی سرور کلاینت، باید پکیج nfs-common را نصب کنیم که عملکرد کلاینت NFS را بدون هیچگونه کامپوننت سرور فراهم میکند. مجدداً پیش از نصب، ایندکس پکیج را بهروزرسانی کنید:
sudo apt update
sudo apt install nfs-common
اکنون که هر دو سرور پکیجهای لازم را دارند، میتوانیم پیکربندی آنها را آغاز کنیم.
مرحله ۲ — ایجاد دایرکتوریهای اشتراکی روی هاست
ما قصد داریم دو دایرکتوری مجزا با تنظیمات متفاوت را به اشتراک بگذاریم تا دو روش کلیدی در پیکربندی NFS را نسبت به دسترسی کاربر روت (Superuser) نشان دهیم.
کاربران روت (Superusers) میتوانند هر کاری را در سیستم خود انجام دهند. با این حال، دایرکتوریهای Mount شده via NFS بخشی از سیستمی که روی آن Mount شدهاند نیستند، بنابراین به طور پیشفرض، سرور NFS از انجام عملیاتی که نیازمند دسترسی روت هستند امتناع میکند. این محدودیت پیشفرض به این معناست که کاربران روت روی کلاینت نمیتوانند فایلها را به عنوان root بنویسند، مالکیت را تغییر دهند یا سایر وظایف روت را روی Mount NFS انجام دهند.
گاهی اوقات، کاربران مورد اعتمادی روی سیستم کلاینت وجود دارند که نیاز به انجام این اقدامات روی سیستم فایل Mount شده دارند اما نیازی به دسترسی روت روی هاست ندارند. میتوانید سرور NFS را طوری پیکربندی کنید که این کار را مجاز کند، هرچند این کار خطر را افزایش میدهد.
مثال ۱: اشتراکگذاری یک Mount عمومی
ابتدا یک دایرکتوری عمومی NFS ایجاد میکنیم که از رفتار پیشفرض NFS استفاده میکند. دایرکتوری اشتراکی را بسازید:
sudo mkdir /var/nfs/general -p
از آنجایی که آن را با sudo ایجاد کردهایم، مالکیت دایرکتوری با کاربر روت هاست است. NFS هر عملیات روت روی کلاینت را به اعتبارنامه nobody:nogroup تبدیل میکند. بنابراین، باید مالکیت دایرکتوری را تغییر دهید:
sudo chown nobody:nogroup /var/nfs/general
مثال ۲: اشتراکگذاری دایرکتوری Home
در مثال دوم، هدف این است که دایرکتوریهای Home کاربران که روی هاست ذخیره شدهاند را روی سرورهای کلاینت در دسترس قرار دهیم. برای این کار، دایرکتوری /home را Export میکنیم. از آنجایی که از قبل وجود دارد، نیازی به ایجاد آن نیست و اجازه دسترسیها را نیز تغییر نمیدهیم.
مرحله ۳ — پیکربندی اشتراکهای NFS روی سرور هاست
فایل پیکربندی NFS را باز کنید:
sudo nano /etc/exports
سینتکس هر خط به این شکل است: directory_to_share client(share_option1,...,share_optionN)
برای هر کدام از دایرکتوریهایی که قصد اشتراک آنها را داریم یک خط ایجاد کنید (مطمئن شوید client_ip را با IP واقعی خود جایگزین کنید):
/etc/exports
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
در اینجا معنای هر یک از این گزینهها آمده است:
rw: این گزینه به کلاینت دسترسی خواندن و نوشتن را میدهد.sync: NFS را مجبور میکند قبل از پاسخ دادن، تغییرات را روی دیسک بنویسد که محیطی پایدارتر ایجاد میکند.no_subtree_check: بررسی زیردرخت (Subtree) را غیرفعال میکند که میتواند هنگام تغییر نام فایلها مشکل ایجاد کند.no_root_squash: به طور پیشفرض، NFS درخواستهای کاربر روت از ریموت را به یک کاربر بدون امتیاز روی سرور تبدیل میکند. این گزینه این رفتار را برای اشتراکهای خاص غیرفعال میکند.
پس از اتمام، فایل را ذخیره کرده و ببندید. سپس سرور NFS را ریاستارت کنید:
sudo systemctl restart nfs-kernel-server
مرحله ۴ — تنظیم فایروال روی هاست
برای اطمینان از اینکه ترافیک اشتراکها توسط قوانین فایروال مجاز است، باید پورت NFS را باز کنیم. بهترین روش این است که فقط به IP کلاینت اجازه دسترسی دهیم:
sudo ufw allow from client_ip to any port nfs
میتوانید تغییر را با دستور زیر تایید کنید:
sudo ufw status
خروجی باید نشان دهد که ترافیک از پورت 2049 از کلاینت شما مجاز است.
مرحله ۵ — ایجاد نقاط اتصال (Mount Points) و Mount کردن دایرکتوریها روی کلاینت
اکنون که سرور هاست پیکربندی شد، کلاینت را آماده میکنیم. برای در دسترس قرار دادن اشتراکهای ریموت روی کلاینت، باید دایرکتوریهای هاست را به دایرکتوریهای خالی روی کلاینت متصل (Mount) کنیم.
دو دایرکتوری برای مکانهای Mount خود ایجاد کنید:
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
اکنون میتوانید اشتراکها را با استفاده از آدرس IP سرور هاست متصل کنید:
sudo mount host_ip:/var/nfs/general /nfs/general
sudo mount host_ip:/home /nfs/home
(نکته: برای افزایش IOPS در برخی workloadها میتوانید از فلگ nconnect=n هنگام Mount کردن استفاده کنید. به عنوان مثال sudo mount -o nconnect=8 host_ip:/var/nfs/general /nfs/general)
میتوانید با دستور df -h بررسی کنید که آیا با موفقیت Mount شدهاند یا خیر:
df -h
مرحله ۶ — تست دسترسی NFS
با نوشتن یک فایل تست روی هر دو اشتراک، دسترسی را بررسی میکنیم.
مثال ۱: اشتراک عمومی
یک فایل تست در اشتراک عمومی ایجاد کنید:
sudo touch /nfs/general/general.test
سپس مالکیت آن را بررسی کنید:
ls -l /nfs/general/general.test
خروجی:
-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
از آنجایی که رفتار پیشفرض NFS را تغییر ندادیم، مالکیت فایل به nobody:nogroup تنظیم شده است.
مثال ۲: اشتراک دایرکتوری Home
به همین ترتیب یک فایل در اشتراک Home ایجاد کنید:
sudo touch /nfs/home/home.test
ls -l /nfs/home/home.test
خروجی:
-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test
در اینجا، فایل متعلق به root است زیرا ما گزینه no_root_squash را برای این Mount مشخص کردهایم. این امر به کاربران روت روی کلاینت اجازه میدهد به عنوان روت عمل کنند.
مرحله ۷ — اتصال دایرکتوریهای NFS در زمان بوت (Boot)
برای ایجاد اتصالات دائمی NFS، آنها را به فایل /etc/fstab روی کلاینت اضافه میکنیم:
sudo nano /etc/fstab
در انتهای فایل، برای هر اشتراک یک خط اضافه کنید:
/etc/fstab
. . .
host_ip:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
این کار باعث میشود کلاینت در زمان بوت، پارتیشنهای ریموت را به طور خودکار Mount کند.
مرحله ۸ — جدا کردن (Unmount) اشتراک ریموت NFS
اگر دیگر نمیخواهید دایرکتوری ریموت روی سیستم شما Mount باشد، میتوانید آن را Unmount کنید:
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
(دقت کنید که دستور umount نوشته میشود، نه unmount).
اگر میخواهید از Mount شدن مجدد آنها در ریبوت بعدی جلوگیری کنید، فایل /etc/fstab را ویرایش کرده و خطوط مربوطه را حذف یا با قرار دادن کاراکتر # در ابتدای خط، آنها را کامنت کنید.
ملاحظات اضافی برای استفاده در محیط پروداکشن
هنگام استقرار NFS در محیطهای پروداکشن، رعایت بهترین روشها برای اطمینان از پایداری، عملکرد و امنیت ضروری است:
- سازگاری نسخه NFS: مطمئن شوید کلاینت و سرور نسخههای سازگار اجرا میکنند. NFSv4 به دلیل سادهسازی قوانین فایروال و ویژگیهای امنیتی بهبودیافته توصیه میشود.
- بهینهسازی عملکرد: علاوه بر
nconnect، گزینههایی مانندrsize=8192,wsize=8192برای افزایش بافر خواندن/نوشتن وactimeo=1800برای کاهش فرکانس کش ویژگیها (Attribute caching) را در نظر بگیرید. - امنیت: NFS به طور پیشفرض دادهها را رمزنگاری نمیکند. برای ایمنسازی:
- از NFS فقط در شبکههای خصوصی مورد اعتماد یا VPN استفاده کنید.
- از
root_squashاستفاده کنید مگر اینکه دسترسی بالا ضروری باشد. - دسترسی در
/etc/exportsرا به IPهای خاص محدود کنید.
- لاگگیری و مانیتورینگ: برای دیباگ میتوانید از دستورات
tail -f /var/log/syslog | grep nfsیاjournalctl -u nfs-serverاستفاده کنید.
سوالات متداول (FAQ)
۱. NFS Mount در لینوکس چیست؟
NFS Mount به یک سیستم اجازه میدهد تا به دایرکتوریهایی که توسط سیستم دیگری در شبکه به اشتراک گذاشته شده است دسترسی پیدا کند. این کار اشتراکگذاری فایل بین سیستمهای لینوکس/یونیکس را یکپارچه میکند.
۲. چگونه NFS Mount را پس از ریبوت دائمی کنم؟
فایل /etc/fstab را در کلاینت ویرایش کرده و تنظیمات Mount خود را با گزینههایی مانند auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 اضافه کنید.
۳. برای کار کردن NFS به چه پورتهایی نیاز است؟
پورت 2049 (TCP/UDP) برای ارتباط اصلی NFS. برای NFSv4 تنها همین پورت نیاز است که پیکربندی فایروال را آسان میکند.
۴. جایگزینهای NFS چه هستند؟
- SSHFS: رمزنگاری شده و سریع برای راهاندازی، مناسب برای دسترسیهای مقطعی.
- Samba (SMB): بهترین گزینه برای اشتراکگذاری بین پلتفرمها (ویندوز-لینوکس).
- rsync: مناسب برای همگامسازی یکطرفه یا زمانبندی شده و بکاپگیری.
۵. چگونه مشکلات NFS Mount را رفع کنم؟
وضعیت سرویس را بررسی کنید: sudo systemctl status nfs-kernel-server. همچنین از دستورات sudo exportfs -v و df -h برای بررسی وضعیت استفاده کنید.
نتیجهگیری
در این آموزش، ما یک سرور هاست NFS ایجاد کردیم و با ساختن دو نوع NFS Mount متفاوت، برخی از رفتارهای کلیدی NFS را برای یک کلاینت به اشتراک گذاشتیم.
اگر قصد دارید NFS را در محیط پروداکشن پیادهسازی کنید، توجه داشته باشید که این پروتکل به طور پیشفرض رمزنگاری نمیشود. در مواردی که از شبکه خصوصی استفاده میکنید این ممکن است مشکلی نباشد، اما در غیر این صورت برای محافظت از دادههای خود به VPN یا تونلهای رمزنگاریشده نیاز خواهید داشت.
از همراهی شما با پارمین کلود سپاسگزاریم.




