How to set up an NFS on RHEL 9
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/exports
file ထဲမှာ တစ်ခုခု 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 တွေကိုလေ့လာခဲ့ကြတာဖြစ်ပါတယ်။
Subscribe to my newsletter
Read articles from Wai Yan Pyae Sone directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by