Linux 環境下NFS 服務搭建
下面說點正經的,如果大家是在生產環境上建議使用成熟封裝後產品,國產和國外的很多固定存儲產品都能滿足並且價格也不算太貴。如果實在是囊中羞澀可以使用free nas或openfiler等軟件。這樣是提供服務更加純粹,從而減少不必要的麻煩。以前在建行工作的時候提供nfs服務的主機經常要重啟服務甚至主機才行,因急於恢復生產所以也沒詳細測試過(估計是軟件或協議版本問題)。現在工作的地方從去年開始使用NetApp的Nas(跑oracle和ap),目前來看使用的生產系統運行還是比較穩定的。
好了廢話說多了,下面開始
##################################################################################
實驗環境:Red Hat Enterprise Linux Server release 6.8 (Santiago)
Vmware Workstation 12.5
NTP Client Name:ocbsap01 IP:192.168.10.128
NTP Server Name: ocbsdb01 IP:192.168.10.131
實驗目的:ap01 為NFS client ,db01 為NFS server
###################################################################################
簡介:
NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。
(另外多在說一句:使用NFS的clent都為Linux或Uinx,如果client是Windows 要搭建Samba服務才行)
#####################Server 端操作#####################################
1、安裝NFS服務器軟件包,檢查如下安裝包,如果沒有安裝就rpm或者yum安裝一下
[root@ocbsdb01 ~]# rpm -qa | grep nfs
nfs-utils-lib-1.1.5-11.el6.x86_64
nfs-utils-1.2.3-70.el6.x86_64
[root@ocbsdb01 /]# rpm -qa | grep rpcbind
rpcbind-0.2.0-12.el6.x86_64
2、創建nfs共享文件系統/nfs和測試文件hello.py ,記得加入到/etc/fstab中實現開機自啟動
[root@ocbsdb01 ~]# lvcreate -L 1G -n lv_nfs system
[root@ocbsdb01 ~]# mkfs.ext4 /dev/system/lv_nfs
[root@ocbsdb01 /]# mkdir /nfs
[root@ocbsdb01 /]# mount /dev/system/lv_nfs /nfs
[root@ocbsdb01 nfs]# touch hellp.py
[root@ocbsdb01 nfs]# cat hello.py
print('hello world!')
3、NFS服務配置實例
修改/etc/exports文件(文件默認為空)
/nfs 192.168.10.128(rw,sync,no_root_squash) #只允許192.168.10.128主機以讀寫權限在來掛載/nfs目錄 或/nfs 192.168.10.*(rw) #指定192.168.10.0網段的客戶進行訪問 *號表示所有用戶
exports文件(NFS權限設置最終的權限是NFS和文件的權限結合起來的,這一點一定要記得!)
用戶映射選項:
ro: 只讀訪問
rw : 讀寫訪問
all_squash: 將遠程訪問的所有普通用戶及所屬組都映射為匿名用戶或用戶組(nfsnobody);
no_all_squash: 與all_squash取反(默認設置);
root_squash: 將root用戶及所屬組都映射為匿名用戶或用戶組(默認設置);
no_root_squash: 客戶端把共享目錄掛載後,操作共享目錄,就像是用自己的目錄一樣的權限;
客戶端使用 NFS 文件系統的賬號若為 root 時,系統該如何判斷這個賬號的身份?
預設的情況下,客戶端 root 的身份會由 root_squash 的設定壓縮成 nfsnobody,
如此對服務器的系統會較有保障。但如果你想要開放客戶端使用 root 身份來操作服務器的文件系統,
那麽這裏就得要開 no_root_squash 才行!
anonuid=xxx: 將遠程訪問的所有用戶都映射為匿名用戶,並指定該用戶為本地用戶(UID=xxx);
anongid=xxx: 將遠程訪問的所有用戶組都映射為匿名用戶組賬戶,並指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx);
其它選項:
secure : 限制客戶端只能從小於1024的TCP/IP端口連接nfs服務器(默認設置);
insecure: 允許客戶端從大於1024的TCP/IP端口連接服務器;
sync(同步): 將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性;
async(異步): 將數據先保存在內存緩沖區中,必要時才寫入磁盤;
wdelay : 檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置)
no_wdelay : 若有寫操作則立即執行,應與sync配合使用;
subtree: 若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置);
no_subtree: 即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;
subtree_check: 如果共享/usr/bin之類的子目錄時,強制NFS檢查父目錄的權限
no_subtree_check: 和上面相對,不檢查父目錄權限(默認)
hide:: 在NFS共享目錄中不共享其子目錄
no_hide : 共享NFS目錄的子目錄
4、NFS服務管理
4.1、啟動NFS服務
[root@ocbsdb01 /]# service nfs start
啟動 NFS 服務: [確定]
關掉 NFS 配額: [確定]
啟動 NFS mountd: [確定]
啟動 NFS 守護進程: [確定]
正在啟動 RPC idmapd: [確定]
4.2、在服務器端查看NFS共享目錄信息
[root@ocbsdb01 /]# exportfs -v
/nfs 192.168.10.128(rw,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,no_root_squash,no_all_squash)
exportfs -a 輸出在/etc/exports文件中所定義的所有目錄; -r 重新讀取/etc/exports文件,不需要重起服務; -u 停止輸出某一目錄; -v 在屏幕上顯示過程; exportfs -auv 停止共享 exportfs -rv 重新共享
[root@ocbsdb01 /]# showmount -e 192.168.10.131 Export list for 192.168.10.131: /nfs 192.168.10.128
5、使用rpcinfo –p 檢查rpc註冊信息,查看服務端口,除111/875/2049外其余為隨機端口
通過如下操作能驗證上面信息
[root@ocbsdb01 /]# service nfs stop
關閉 NFS 守護進程: [確定]
關閉 NFS mountd: [確定]
關閉 NFS quotas: [確定]
關閉 NFS 服務: [確定]
Shutting down RPC idmapd: [確定]
rpcinfo 選項與參數: -p :針對某 IP (未寫則預設為本機) 顯示出所有的 port 與 porgram 的信息; -t :針對某主機的某支程序檢查其 TCP 封包所在的軟件版本; -u :針對某主機的某支程序檢查其 UDP 封包所在的軟件版本;
[root@ocbsdb01 /]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 52029 status
100024 1 tcp 60903 status
[root@ocbsdb01 /]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 52029 status
100024 1 tcp 60903 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 44037 mountd
100005 1 tcp 60499 mountd
100005 2 udp 49190 mountd
100005 2 tcp 54931 mountd
100005 3 udp 43762 mountd
100005 3 tcp 51304 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 54852 nlockmgr
100021 3 udp 54852 nlockmgr
100021 4 udp 54852 nlockmgr
100021 1 tcp 35706 nlockmgr
100021 3 tcp 35706 nlockmgr
100021 4 tcp 35706 nlockmgr
6、自定義nfs固定端口
vim /etc/sysconfig/nfs
自定義以下端口,但不能和其它端口沖突
默認如下:
#RQUOTAD_PORT=875
#LOCKD_TCPPORT=32803
#LOCKD_UDPPORT=32769
#MOUNTD_PORT=892
#STATD_PORT=662
可以修改為
RQUOTAD_PORT=60001
LOCKD_TCPPORT=60002
LOCKD_UDPPORT=60002
MOUNTD_PORT=60003
STATD_PORT=60004
[root@ocbsdb01 sysconfig]# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 60001 rquotad
100011 2 udp 60001 rquotad
100011 1 tcp 60001 rquotad
100011 2 tcp 60001 rquotad
100005 1 udp 60004 mountd
100005 1 tcp 60004 mountd
100005 2 udp 60004 mountd
100005 2 tcp 60004 mountd
100005 3 udp 60004 mountd
100005 3 tcp 60004 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 60003 nlockmgr
100021 3 udp 60003 nlockmgr
100021 4 udp 60003 nlockmgr
100021 1 tcp 60002 nlockmgr
100021 3 tcp 60002 nlockmgr
100021 4 tcp 60002 nlockmgr
7、使用iptables策略
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 111,2049 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 111,2049 -j ACCEPT
iptables -A INPUT -p tcp --dport 60001:60004 -j ACCEPT
iptables -A INPUT -p udp --dport 60001:60004 -j ACCEPT
service iptables save
8、實際應用舉例
需求:
1、/media目錄
共享/media目錄,允許所有客戶端訪問該目錄並只有只讀權限。
2、/nfs/public目錄
共享/nfs/public目錄,允許192.168.146.0/24網段的客戶端訪問,並且對此目錄只有只讀權限。
3、/nfs/team1、/nfs/team2、/nfs/team3目錄
共享/nfs/team1、/nfs/team2、/nfs/team3目錄,並/nfs/team1只有team1.michael.com域成員可以訪問並有讀寫權限,/nfs/team2、/nfs/team3目錄同理哈~
4、/nfs/works目錄
共享/nfs/works目錄,192.168.8.0/24網段的客戶端具有只讀權限,並且將root用戶映射成匿名用戶。
5、/nfs/test目錄
共享/nfs/test目錄,所有人都具有讀寫權限,但當用戶使用該共享目錄時都將帳號映射成匿名用戶,並且指定匿名用戶的UID和GID都為65534。
6、/nfs/security目錄
共享/nfs/security目錄,僅允許192.168.146.129客戶端訪問並具有讀寫權限
操作:
1、創建需要的目錄
[root@www /]# mkdir /nfs
[root@www /]# mkdir /nfs/public
[root@www /]# mkdir /nfs/team1 /nfs/team2
[root@www /]# mkdir /nfs/team3
[root@www /]# mkdir /nfs/works
[root@www /]# mkdir /nfs/test
[root@www /]# mkdir /nfs/security
2、編輯/etc/exports配置文件
/etc/exports:nfs服務的主配置文件
vim /etc/exports 輸入如下內容
/media *(ro)
/nfs/public 192.168.10.0/24(ro)
/nfs/team1 *.team1.michael.com(rw)
/nfs/team2 *.team2.michael.com(rw)
/nfs/team3 *.team3.michael.com(rw)
/nfs/works 192.168.10.0/24(ro,root_squash)
/nfs/test *(rw,all_squash,anonuid=65534,anongid=65534)
/nfs/security 192.168.10.128/24(rw,no_root_squash)
備註:
在發布共享目錄的格式中除了共享目錄是必跟參數外,其他參數都是可選的。
並且共享目錄與客戶端之間、客戶端與客戶端之間需要使用空格符號,但是客戶端與參數之間是不能有空格的~
#########################Client端驗證操作#############################
1、在client檢查軟件是否安裝,這裏已經安裝好了,如果沒有rpm或者yum安裝
[root@ocbsap01 ~]# rpm -qa | grep nfs-utils
nfs-utils-lib-1.1.5-11.el6.x86_64
nfs-utils-1.2.3-70.el6.x86_64
2、在client端查看NFS共享目錄信息
[root@ocbsap01 ~]# showmount -e 192.168.10.131
Export list for 192.168.10.131:
/nfs 192.168.10.128
showmount [選項] nfs服務器ip -a 顯示指定的nfs服務器的所有客戶端主機及其所連接的目錄; -d 顯示指定的nfs服務器中已被客戶端連接的目錄; -e 顯示指定nfs服務器上所有輸出的目錄;
3、掛載和卸載NFS服務器上的共享目錄
[root@ocbsap01 /]# mount -t nfs 192.168.10.131:/nfs /nfs [root@ocbsap01 /]# df -h /nfs Filesystem Size Used Avail Use% Mounted on 192.168.10.131:/nfs 976M 1.3M 924M 1% /nfs
[root@ocbsap01 /]# umount /nfs
[root@ocbsap01 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/system-lv_root 12G 5.2G 6.0G 47% /
tmpfs 238M 0 238M 0% /dev/shm
/dev/sda1 190M 34M 147M 19% /boot
/dev/mapper/system-lv_home 2.0G 3.1M 1.9G 1% /home
/dev/mapper/system-lv_ocbs 976M 11M 915M 2% /home/ocbs
/dev/mapper/system-lv_anaconda 5.8G 2.8G 2.8G 50% /anaconda3
/dev/sr0 3.7G 3.7G 0 100% /mnt
查看權限為rw狀態
[root@ocbsap01 nfs]# mount
/dev/mapper/system-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/system-lv_home on /home type ext4 (rw)
/dev/mapper/system-lv_ocbs on /home/ocbs type ext4 (rw)
/dev/mapper/system-lv_anaconda on /anaconda3 type ext4 (rw)
/dev/sr0 on /mnt type iso9660 (ro)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.10.131:/nfs on /nfs type nfs (rw,vers=4,addr=192.168.10.131,clientaddr=192.168.10.128)
4、設置client 開機自啟動掛載NFS文件系統。當然nfs掛載也有很多參數這裏就使用default了
在/etc/fstab文件中添加一行內容
192.168.10.131:/nfs /nfs nfs defaults 0 0
備註:
但是一般生產系統不建議自動掛載,因為一旦NFS有問題會導致client端服務器可能啟動不起來
5、測試文件寫入和讀取
[root@ocbsap01 nfs]# cat hello.py
print('hello world!')
[root@ocbsap01 nfs]# touch 111
[root@ocbsap01 nfs]# ls -l
總用量 20
-rw-r--r--. 1 root root 0 3月 10 2018 111
-rw-r--r--. 1 root root 28 3月 10 2018 hello.py
drwx------. 2 root root 16384 3月 10 2018 lost+found
####################################常見問題################################################
a、在RHEL 6 操作系統中掛載 NAS文件系統,並將其設置為開機自啟動,則需提前配置以下內容:
1.開啟必須的系統服務:rpcbind,nfslock,netfs
2.將NAS掛載信息寫入 /etc/fstab中,需要將文件系統類型設置為“nfs”,增加“_netdev”參數,同時將dump和fsck字段設置為“0”。
示例如下:
192.168.0.1:/vol/nas_fs /home/ap/nas_mount nfs defaults,_netdev 0 0
Redhat 6 在自動掛載的時候要在/etc/fstab 裏面加入_netdev
b、關於客戶端目錄屬組更改問題,需要在server端更改後客戶端才能改變 ,切記!!
c、showmount 命令報錯
[root@ocbsdb01 /]# showmount -e
clnt_create: RPC: Unknown host
解決方法:
在/etc/hosts下面寫上主機名和IP對應關系如:
192.168.10.131 ocbsdb01
或者檢查iptables是否關閉
d、NFS服務啟動失敗,
[root@ocbsdb01 sysconfig]# service nfs start
啟動 NFS 服務: [確定]
關掉 NFS 配額:無法註冊服務: RPC:無法接收; errno = 拒絕連接
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
[失敗]
啟動 NFS mountd: [失敗]
啟動 NFS 守護進程:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
解決方法:
檢查rpcbind服務是否啟動,rpcbind一定要先啟動
[root@ocbsdb01 sysconfig]# service rpcbind start
正在啟動 rpcbind: [確定]
[root@ocbsdb01 sysconfig]# service nfs start
啟動 NFS 服務: [確定]
關掉 NFS 配額: [確定]
啟動 NFS mountd: [確定]
啟動 NFS 守護進程: [確定]
正在啟動 RPC idmapd: [確定]
e、關掉 NFS 配額:rpc.rquotad: Cannot bind to given address: 權限不夠
解決方法:
重啟rpcbind
修改/etc/sysconfig/nfs 配置文件端口是否自定義了,如果自定義修改端口
f、showmount -a 不顯示信息
查閱資料後說是版本4的nfs,運行showmount是不返回客戶端信息的,
/var/lib/nfs/rmtab | xtab裏面也沒有記錄,
於是我在客戶端掛載nfs時運行命令:mount -t nfs -o vers=3 192.168.10.131:/nfs /nfs,
它會成功掛載nfs。再在服務端運行showmount -a|-d就會有返回了。也就是說這是版本問題。
命令例子:
mount -t nfs -o nfsvers=3 host:/exportdir /client_dir
Linux 環境下NFS 服務搭建