1. 程式人生 > >Linux 環境下NFS 服務搭建

Linux 環境下NFS 服務搭建

Linux NFS 服務

之前接到一個電話面試其中一個問題是如何搭建一個NFS服務器,他說他看過我的博客了,忽然我的第一反應是聯想到博客裏面可能是缺少了一篇關於NFS的文章了^_^~ 開玩笑啦!~

下面說點正經的,如果大家是在生產環境上建議使用成熟封裝後產品,國產和國外的很多固定存儲產品都能滿足並且價格也不算太貴。如果實在是囊中羞澀可以使用free nasopenfiler等軟件。這樣是提供服務更加純粹,從而減少不必要的麻煩。以前在建行工作的時候提供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 服務搭建