How to set up an NFS on RHEL 9

RHEL 9 ပေါ်မှာ Network File System တစ်ခုဘယ်လိုတည်ဆောက်မလဲ

Prerequisites

  • 2 RHEL vms

  • Linux System Administration

  • RHEL subscription / DVD iso to install nfs-utils

Introduction

ဒီ post မှာ NFS server တစ်ခုဘယ်လို set-up လုပ်မလဲ၊ NFS client နဲဘယ်လို ချိတ်ဆက်ပြီးအလုပ်လုပ်မလဲဆိုတာတွေကိုလေ့လာသွားမှာဖြစ်ပါတယ်။

The Network File System(NFS) ဆိုတာ same network ထဲမှာရှိတဲ့ server(s) ရဲ့ shared files ၊ shared directories တွေကို access ရစေမယ့် လုပ်ဆောင်ချက်တစ်မျိူးပဲဖြစ်ပါတယ်။

NFS မှာလည်း client and server ဆိုတဲ့ nature ရှိပါတယ်။

NFS ကိုသုံးဖို့အတွက်ဆိုရင် NFS client/server နှစ်ဘက်စလုံးမှာ NFS utility ကို install လုပ်ပေးထားဖို့လိုပါတယ်။ ကျွန်တော်တို့က RHEL ပေါ်မှာ set-up လုပ်တာဖြစ်တဲ့ အတွက်

dnf install nfs-utils -y

ကိုသုံးပြီး install လုပ်ပေးဖို့လိုပါတယ်။

How to setup NFS server

ဒီအပိုင်းက NFS server ပေါ်မှာ set-up လုပ်တဲ့အပိုင်းပါ။ အရင်ဆုံး /etc/exports ထဲမှာ ကိုယ် share မယ့် directory ကိုထည့်ပေးထားရမယ်။

[sysadmin@servera ~]$ cat /etc/exports
/shares   (CLient IP address)/24(rw)

Client IP address မှာ NFS server နဲ့ချိတ်ဆက်ပြီးအလုပ်လုပ်မယ့် NFS client ရဲ့ IP address ကိုထည့်ပေးရပါမယ်။ IP address ရဲ့အနောက်မှာ NFS options ကိုကပ်ပြီးရေးပေးဖို့လိုပါမယ်။

IP address နဲ့ NFS options ကိုခွာပြီးရေမလား ကပ်ပြီး‌‌ရေးမလားဆိုတဲ့ ရေးပုံရေးနည်းကိုလိုက်ပြီး သူ့ရဲ့အလုပ်လုပ်ပုံကလည်းကွဲပြားနိုင်တဲ့အတွက်သတိထားဖို့လိုပါမယ်။

/etc/exportsfile ထဲမှာ တစ်ခုခု update လုပ်ပြီးတိုင်း sudo exportfs -rဆိုတဲ့ command run ပေးခြင်းဖြင့် update ကိုအသက်ဝင်စေမှာဖြစ်ပါတယ်။

အောက်မှာပေးထားတဲ့ဥပမာထဲမှာဆိုရင် IP address နဲ့ NFS options ကို ခွာရေးပေးထားတာပါ။

[sysadmin@servera ~]$ cat /etc/exports
/shares (Client IP address) (rw)

exportfs -v command ကို run လို့ရလာတဲ့ result ကိုကြည့်ပါ။

[sysadmin@servera ~]$ sudo exportfs -v
/shares       (Client IP address)/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/shares       <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

သူဆိုချင်တဲ့သဘောက /shares ဆိုတဲ့ directory ကို (Client IP address) လာတဲ့ user တွေက read-only(default) အနေနဲ့ပဲ mount လို့ရမှာဖြစ်ပြီးတော့၊ <world> ကလာတဲ့ user တွေကတော့ read/write အနေနဲ့ mount လိုရမယ်လို့‌ ပြောချင်တာဖြစ်ပါတယ်။

အခုဒီဥပမာကတော့ကျွန်တော်တို့လက်ရှိ demo မှာသုံးမယ့် ပုံစံပါ၊ (Client IP address)နဲ့ NFS options ကိုကပ်ရေးပေးထားပါတယ်။

[sysadmin@servera ~]$ cat /etc/exports
/shares (Client IP address)(rw)

exportfs -v command ကို run လို့ရလာတဲ့ result ကိုကြည့်ပါ။ သူကတော့ (Client IP address) ကလာတဲ့ user တွေအနေနဲ့ /shares directory ကို read/write access ရမယ်ဆိုတဲ့သဘောပဲဖြစ်ပါတယ်။

[sysadmin@servera ~]$ sudo exportfs -v
/shares       (Client IP address)/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

ပြီးရင် shares directory ဆောက်ပေးဖို့လိုမယ်။အဲ့အတွက်

[sysadmin@servera ~]$ mkdir /shares

ပြီးရင် NFS server service ကို run ပြီး enable လုပ်ပေးဖို့လိုပါမယ်။

[sysadmin@servera ~]$ systemctl enable nfs-server.service --now

ဆိုတဲ့ command တစ်ကြောင်းထဲ run ပေးရုံနဲ့အဆင်ပြေပါတယ်။

Client ဘက်ကနေ လှမ်းပြီး access လုပ်တဲ့အချိန်မှာ firewall က block ထားတာမျိူးမဖြစ်ရအောင် firewall မှာ NFS service ကို add ပေးဖို့လည်းလိုပါသေးတယ်

[sysadmin@servera ~]$ firewall-cmd --add-service=nfs --permanent
[sysadmin@servera ~]$ firewall-cmd --reload

ဆိုတဲ့ command တွေ run ပေးရမယ်။

နောက်တစ်ဆင့်အနေနဲ့ /shares directory ကို permission ပေးဖို့လိုပါတယ်။

[sysadmin@servera ~]$ sudo chmod 777 /shares/

ဒီနေရာမှာ NFS Client နဲ့ NFS server ရဲ့အလုပ်လုပ်ပုံကို မြင်သာအောင်စမ်းကြည့်တာမျိူးဖြစ်တဲ့အတွက် full permission နဲ့စမ်းတာဖြစ်ပါတယ်။

တကယ့်လက်တွေ့မှာ လုံခြုံရေးအရ ပိုပြီးကောင်းတဲ့ နည်းလမ်းတွေကိုအသုံးပြုသင့်တယ်လို့အကြံပြုပါရစေ။

Server ဘက်မှာ setup လုပ်တဲ့အပိုင်းပြီးပါပြီ။

How to set up NFS client

ဒီအပိုင်းမှာ client ဘက်အခြမ်းကိုဘယ်လို setup လုပ်မလဲဆိုတာလေ့လာသွားကြမယ်။

Server ဘက်က /shares directory နဲ့ချိတ်ဆက်ပြီးအလုပ်လုပ်ဖို့အတွက် client ဘက်မှာလည်း directory တစ်ခုရှိထားဖို့လိုပါမယ်။

[student@workstation ~]$ sudo mkdir /mnt/shares

ပြီးရင် mount command ကိုသုံးပြီး server ရဲ့ /shares directory နဲ့ client ရဲ့ /mnt/shares directory ကို mount ပေးရမယ်။

[student@workstation ~]$ mount -t nfs (Server IP address):/shares /mnt/shares

အရှေ့က command ကို run ယုံနဲ့ Server/Client mount သွားပြီဖြစ်ပါတယ်။ တစ်ခုသတိထားဖို့လိုတာက persistently mount လုပ်ထားတာမျိူးမဟုတ်တဲ့အတွက် runtime မှာပဲအလုပ်လုပ်နေမှာဖြစ်ပါတယ်။

ကိုယ့်ရဲ့ server/client ကို reboot လုပ်ပြီးကိုယ့်စက်ပြန်တက်လာတဲ့အချိန်မှာပါ mount ကို အလုပ်လုပ်စေချင်တယ်ဆိုရင် persistently mount ပေးဖို့လိုပါတယ်။ အဲ့အတွက် /etc/fstab ထဲမှာသွားထည့်ပေးဖို့လိုပါမယ်။

[student@workstation ~]$ sudo vim /etc/fstab
(Server IP address):/shares   /mnt/shares             nfs     rw,soft         0 0

ဒီနေရာမှာ client ဘက်အခြမ်း setup လုပ်တဲ့အပိုင်းပြီးပါပြီ။

How does root_squash work?

အရှေ့မှာ exports -v ကို run လို့ထွက်လာတဲ့ result ထဲကမှ ro နဲ့ rw ဆိုတဲ့ NFS option တွေကိုပဲ highlight လုပ်ပြီး‌ ပြောသွားတာသတိထားမိမယ်ထင်ပါတယ်။

ဒီအပိုင်းမှာ ကျွန်တော်တို့ setup လုပ်ထားတဲ့ NFS server နဲ့ NFS client တို့ တကယ်အလုပ်မလုပ် စမ်းရင်းနဲ့ root_squash ဆိုတဲ့ NFS optionကိုပါတစ်ပါတည်းလေ့လာသွားကြပါမယ်။

အရင်ဆုံး /mnt/shares directory အောက်မှာ student.txt ဆိုတဲ့ file တစ်ခုဆောက်ကြည့်မယ်။

client-side

[student@workstation ~]$ touch /mnt/shares/student.txt

[student@workstation ~]$ ls -ll /mnt/shares/

total 0

-rw-r--r--. 1 student student 0 Jul 10 18:44 student.txt

Server ဘက်မှာ student.txt ဆိုတဲ့ file ရောက်မရောက် စစ်ကြည့်ကြမယ်။

server-side

[sysadmin@servera ~]$ ls -ll /shares/

total 0

-rw-r--r--. 1 sysadmin sysadmin 0 Jul 10 18:44 student.txt

ကျွန်တော်တို့ server ဘက်မှာ student.txt ရောက်မရောက် စစ်ကြည့်တဲ့အခါမှာ file ကတော့ရှိတယ်၊ ဒါပေမယ့် user က client ဘက်အခြမ်းက create လုပ်လိုက်တဲ့ student ဆိုတဲ့ user မဟုတ်ပဲ server ဘက်က sysadmin ဆိုတဲ့ user အနေနဲ့သာမြင်ရပါတယ်။

ကျွန်တော်တို့ client side က student user နဲ့ server side က sysadmin user ရဲ့ id ကိုတစ်ချက်ကြည့်ကြမယ်။

client-side

Check id for student user

[student@workstation ~]$ id student

uid=1000(student) gid=1000(student) groups=1000(student),10(wheel)

server-side

Check id for sysadim user

[sysadmin@servera ~]$ id sysadmin 

uid=1000(sysadmin) gid=1000(sysadmin) groups=1000(sysadmin),10(wheel)

Client ဘက်က student user ရဲ့ id ကလည်း 1000 ၊ server ဘက်က sysadmin user ရဲ့ id ကလည်း 1000 ဆိုတာကိုသတိထားမိမယ်ထင်ပါတယ်။

client ဘက်က student user က file ကို create လုပ်ပေမယ့် server ဘက်မှာ sysadmin အနေနဲ့ယူသွားတာကိုတွေ့ရပါတယ်။ client ဘက်မှာ user id 1000 ရှိတဲ့ user က create လုပ်ရင် server ဘက်မှာ user id 1000 ရှိတဲ့ user ကပိုင်ပါတယ်ဆိုတဲ့သဘောပါ။

 ဒီနေရာမှာ အဓိက highlight လုပ်ပြီးပြောချင်တာက user တွေ group တွေကို name တွေ သတ်မှတ်ပြီး create လုပ်ပေမယ့်  နောက်ကွယ်မှာ  ID တွေနဲ့အလုပ်လုပ်တယ်ဆိုတာကိုသိစေချင်တာပါ။ (Linux မှာ ID တွေနဲ့အလုပ်လုပ်တဲ့ပုံစံကိုပိုပြီးမြင်သာအောင် post တစ်ခုရေးပြီး share ချင်ပါသေးတယ်။)

ဒီအပိုင်းမှာ NFS server/client ချိတ်ဆက် ပြီးအလုပ်လုပ်မလုပ်ကို client ဘက်ကနေ file တစ်ခု create လုပ်ပြီးစမ်းကြည့်ခဲ့တာဖြစ်ပါတယ်။

root_squash

ဆက်ပြီးတော့ root_squash ကိုလေ့လာသွားပါမယ်။

Client ဘက်ကနေ root user အနေနဲ့ root.txt ဆိုတဲ့ file ကို create လုပ်ပြီး၊ server ဘက်အခြမ်းမှာ ဘယ်လို ပေါ်လဲဆိုတာကို စစ်ကြည့်ကြပါမယ်။

client-side

[root@workstation ~]# ls -ll /mnt/shares/root.txt 

-rw-r--r--. 1 nobody nobody 0 Jul 10 19:05 /mnt/shares/root.txt

server-side

[sysadmin@servera ~]$ ls -ll /shares/root.txt 

-rw-r--r--. 1 nobody nobody 0 Jul 10 19:05 /shares/root.txt

client ဘက်အခြမ်းမှာ root user အနေနဲ့ file ကို create လုပ်လိုက်ပေမယ့် user owner နဲ့ group owner မှာ nobody လို့ပဲပြနေတာကိုသတိပြုမိမယ်ထင်ပါတယ်။

အရှေ့မှာ run ခဲ့တဲ့ exportfs -v command ကို တစ်ချက်ပြန် run ကြည့်ပါမယ်။ result ကိုကြည့်ပါ nfs options တွေထဲမှာ root_squash ဆိုတာကိုတွေ့ရပါမယ်။

[sysadmin@servera ~]$ sudo exportfs -v
/shares           192.168.56.17/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

အရှေ့မှာလုပ်ဖြစ်ခဲ့တဲ့နမူနာမှာ nobody လို့‌ ပေါ်နေရခြင်းက NFS option တစ်ခုဖြစ်တဲ့ root_squash ရဲ့လုပ်ဆောင်ချက်ဖြစ်ပါတယ်။ သူရဲ့သဘောက root user အနေနဲ့ file တစ်ခုတည်ဆောက်ပေမယ့် NFS server ကို access လုပ်တဲ့အချိန်မှာတော့ root သည် nobody ပါလို့ပြောချင်တာဖြစ်ပါတယ်။

Best practices for nfs server

အရှေ့မှာ /shares directory ကို full permission ပေးပြီးစမ်းခဲ့ကြတာဖြစ်ပါတယ်။ အခုဒီအပိုင်းမှာတော့ best practice တစ်ခုအနေနဲ့ group တစ်ခုဆောက်ပြီး အဲ့ group ထဲက user တွေ ပဲ /shares directory ကို access ရအောင်ဘယ်လိုလုပ်မလဲ ဆိုတာလေ့လာကြည့်ကြမယ်။

အရင်ဆုံး nfsusers ဆိုတဲ့ group တစ်ခုဆောက်ပြီး group id 5000 လိုသတ်မှတ်ပေးပါမယ်။

နောက်တစ်ဆင့်အနေနဲ့ /shares directory ကို access ရစေချင်တဲ့ user01 ကို nfsusers group ထဲထည့်ပေးရပါမယ်။ ဒီအပိုင်းက client ဘက်အခြမ်းမှာ set-up လုပ်မှာဖြစ်ပါတယ်။

client-side

[student@workstation ~]$ sudo groupadd -g 5000 nfsusers
[student@workstation ~]$ sudo usermod -aG nfsusers user01
[student@workstation ~]$ id user01
uid=1001(user01) gid=1001(user01) groups=1001(user01),5000(nfsusers)

ပြီးရင် /mnt/shares directory ကို nfsusers group ကပိုင်မယ်လို့သတ်မှတ်ပေးပါမယ်။

[student@workstation ~]$ chown :nfsusers /mnt/shares

Server side

Server ဘက်မှာလည်းအလားတူ ပုံစံမျိူး setup လုပ်ကြပါမယ်။ ဒီနေရာမှာ တပြေးညီတည်းဖြစ်အောင် client ဘက်မှာရော server ဘက်မှာပါ group name ကို nfsusers လို့ပေးလိုက်တာပါ။ Linux မှာ ID တွေနဲ့ အလုပ်လုပ်တယ်ဆိုတဲ့သဘောတရားက ဒီနေရာမှာ (group) မှာ လည်းအကျိူးသက်‌ ရောက်မှု ရှိကြောင်းကိုသတိပြုရမှာဖြစ်ပါတယ်။

ဆိုလိုချင်တဲ့သဘောက Client ဘက်မှာ Group id 5000 နဲ့ nfsclient ဆိုတဲ့ group တစ်ခုလုပ်ထားမယ်၊ server ဘက်မှာ Group id 5000 နဲ့ nfsserver ဆိုတဲ့ group တစ်ခုဆိုရင်လည်းအလုပ်လုပ်မှာဖြစ်တယ်လို့‌ ပြောချင်တာပါ။ တူညီတဲ့ group id ဖြစ်တဲ့အတွက် ကြောင့်ပါ။

[sysadmin@servera ~]$ sudo groupadd -g 5000 nfsusers
[sysadmin@servera ~]$ sudo usermod -aG nfsusers newuser
[sysadmin@servera ~]$ id newuser
uid=1001(newuser) gid=1001(newuser) groups=1001(newuser),5000(nfsusers)
[sysadmin@servera ~]$ chown :nfsusers /shares

ကျွန်တော်တို့ ဖြစ်စေချင်တဲ့ /shares directory ကို nfsusers group တစ်ခုထဲကပဲ access ရဖို့အတွက် permission ‌သတ်မှတ်ပေးဖို့လိုပါမယ်။

SGID + 770 လို့ပေးလိုက်ပါမယ်။ ဒီနေရာမှာ post အရမ်းရှည်သွားမှာစိုးတဲ့အတွက် SGID ရဲ့အလုပ်လုပ်ပုံကိုထည့်ပြီးမပြောတော့ပါဘူး။

Server side


[sysadmin@servera ~]$ sudo chmod 2770 /shares/
[sysadmin@servera ~]$ ls -ld /shares/
drwxrws---. 2 root nfsusers 59 Jul 11 20:36 /shares/

ကျွန်တော်တို့ လုပ်‌ခဲ့တဲ့ အဆင့်တွေတကယ်အလုပ်မလုပ်စစ်ကြည့်ပါမယ်။ ပထမဆုံး student user အနေနဲ့ file ကို create လုပ်ကြည့်မယ်ဆိုရင် permission denied error ပြနေတာကိုတွေ့ရပါမယ်။ student ဆိုတဲ့ user က /shares directory ကို access ရတဲ့ nfsusers group ထဲက user မဟုတ်လို့ပါ။

[student@workstation ~]$ touch /mnt/shares/newstudent.txt
touch: cannot touch '/mnt/shares/newstudent.txt': Permission denied

user01 ဆိုတဲ့ user ကိုပြောင်းပြီး file create လုပ်ကြည့်ရင် အဆင်ပြေတာတွေရပါမယ်။ user01 က nfsusers group ထဲမှာရှိနေတဲ့အတွက်ကြောင့်ဖြစ်ပါတယ်။


[user01@workstation ~]$ touch /mnt/shares/user01.txt
[user01@workstation ~]$ ls -ll /mnt/shares/
total 0
-rw-r--r--. 1 student student  0 Jul 10 18:44 student.txt
-rw-r--r--. 1 user01  nfsusers 0 Jul 11 20:36 user01.txt

ကျွန်တော်တို့ လေ့လာခဲ့တဲ့ demo မှာ မေးစရာတွေရှိတာက server ဘက်အခြမ်းမှာ id 1001 နဲ့ newuser ရှိမှရမှာလား၊ အဲ့ user ကိုရော nfsusers group ထည့်ပေးမှရမှာလား၊ မထည့်ရင် client ဘက်အခြမ်းက nfsusers group ထဲက user တွေက access လုပ်လို့ မရနိင်ဘူးလား၊ file တွေ create လို့မရတော့ဘူးလားဆိုတာပါ။

"client ဘက်ကနေ access လုပ်လို့ရပါတယ်၊ file တွေ create, remove တွေလည်းလုပ်လို့ရပါတယ်”

Server ဘက်က nfsusers group မှာ newuser ကိုထည့်ပေးရတဲ့အကြောင်းအရင်းတစ်ခုကို မြင်သာအောင်လေ့လာကြည့်ပါမယ်။

Server side

nfsusers group ထဲကနေ newuser ကို remove လုပ်လိုက်ပါမယ်။

[sysadmin@servera ~]$ sudo gpasswd -d newuser nfsusers
Removing user newuser from group nfsusers

Group ထဲမှာရှိသေးလားဆိုတာကြည့်ကြည့်ပါမယ်။

[sysadmin@servera ~]$ id newuser
uid=1001(newuser) gid=1001(newuser) groups=1001(newuser)

အရင်ဆုံး sysadmin ဆိုတဲ့ user အနေနဲ့ /shares directory အောက်မှာ ဘာတွေရှိလည်းကြည့်ကြည့်ပါမယ်။

[sysadmin@servera ~]$ ls -ll /shares/
ls: cannot open directory '/shares/': Permission denied

newuser နဲ့ရော အလုပ်လုပ်သေးလားဆိုတာကို စမ်းကြည့်ရင် Permission denied error ပြနေတာကိုတွေ့ရမှာဖြစ်တယ်။

[sysadmin@servera ~]$ su - newuser
Password: 
[newuser@servera ~]$ ls -ll /shares/
ls: cannot open directory '/shares/': Permission denied

nfsusers group ထဲမှာလည်းသေချာအောင်ထပ်စစ်ကြည့်ပါမယ်။ ဘယ် user မှ မရှိတာကိုတွေ့ရမှာဖြစ်ပါတယ်။

[newuser@servera ~]$ getent group nfsusers
nfsusers:x:5000:

ဒီလောက်ဆို ကျွန်တော်တို့ server ဘက်အခြမ်းက nfsusers group ထဲမှာလည်း user တစ်ယောက်ထည့်ပေးဖို့လိုတဲ့ အကြောင်းကို သဘောပေါက်ပြီလို့ထင်ပါတယ်။

Client side

ဒီအဆင့်တွေကတော့ client side မှာအလုပ်လုပ်ကြောင်း စမ်းကြည့်ထားတာပဲဖြစ်ပါတယ်။

[user01@workstation ~]$ touch /mnt/shares/test.doc
[user01@workstation ~]$ ls -ll /mnt/shares/
total 0
-rw-r--r--. 1 nobody  nobody   0 Jul 10 19:05 root.txt
-rw-r--r--. 1 student student  0 Jul 10 18:44 student.txt
-rw-r--r--. 1 user01  nfsusers 0 Jul 11 22:01 test.doc
-rw-r--r--. 1 user01  nfsusers 0 Jul 11 20:36 user01.txt

Post လည်းအရမ်းရှည်နေပြီဖြစ်တဲ့အတွက် ကျွန်တော်တို့ဒီလောက်နဲ့ပဲနားပါမယ်။

Conclusion

ဒီ post မှာ client နဲ့ server ပေါ်မှာ network file system တည်ဆောက်ပုံ၊ NFS client ဘက်ကနေ NFS server ကိုချိတ်ဆက်အလုပ်လုပ်ပုံ၊ root_squash အလုပ်လုပ်ပုံနဲ့ ၊ NFS တစ်ခုတည်ဆောက်တဲ့ အခါ အသုံးဝင်မယ့် best practice တွေကိုလေ့လာခဲ့ကြတာဖြစ်ပါတယ်။