Linux下搭建NFS服務


一,簡介

NFS是Network File System的縮寫,中文稱為網絡文件系統,由sun 公司所發展出來,主要功能是通過網絡(一個局域網)讓不同的主機系統之間可以共享文件或目錄,NFS的客戶端(一般為應用服務器,例如web)可以通過掛載(mount)的方式將NFS服務器共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個關在點下),從客戶端本地看,NFS服務器端共享目錄就好像是客戶端自己的磁盤分區或者目錄一樣,而實際上卻是遠端的NFS服務器的目錄。
NFS網絡文件系統很像Windows系統的網絡共享、安全功能、網絡驅動器映射,這也和linux的samba服務類似,只不過一般情況下,Windows網絡共享服務或samba服務用戶辦公局域網共享,而互聯網中小型網站集群架構后端常用NFS進行數據共享,若是大型網站,那么有可能還會用到更復雜的分布式文件系統Moosefs(mfs)、GlusterFS。 

因為 NFS 支持的功能相當的多,而不同的功能都會使用不同的程序來啟動, 每啟動一個功能就會啟用一些端口來傳輸數據,因此, NFS 的功能所對應的端口才沒有固定住, 而是隨機取用一些未被使用的小於 1024 的埠口來作為傳輸之用。但如此一來又造成客戶端想要連上服務器時的困擾, 因為客戶端得要知道服務器端的相關埠口才能夠聯機吧!

此時我們就得需要遠程過程調用 (RPC) 的服務啦!RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給客戶端,讓客戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當服務器在啟動 NFS 時會隨機取用數個埠口,並主動的向 RPC 注冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然后 RPC 又是固定使用 port 111 來監聽客戶端的需求並回報客戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕松愉快了!

所以要注意,要啟動 NFS 之前,RPC 就要先啟動了,否則 NFS 會無法向 RPC 注冊。 另外,RPC 若重新啟動時,原本注冊的數據會不見,因此 RPC 重新啟動后,它管理的所有服務都需要重新啟動來重新向 RPC 注冊。

 

當客戶端有 NFS 檔案存取需求時,他會如何向服務器端要求數據呢?

  1. 客戶端會向服務器端的 RPC (port 111) 發出 NFS 檔案存取功能的詢問要求;
  2. 服務器端找到對應的已注冊的 NFS daemon 埠口后,會回報給客戶端;
  3. 客戶端了解正確的埠口后,就可以直接與 NFS daemon 來聯機。

由於 NFS 的各項功能都必須要向 RPC 來注冊,如此一來 RPC 才能了解 NFS 這個服務的各項功能之 port number, PID, NFS 在服務器所監聽的 IP 等等,而客戶端才能夠透過 RPC 的詢問找到正確對應的埠口。 也就是說,NFS 必須要有 RPC 存在時才能成功的提供服務,因此我們稱 NFS 為 RPC server 的一種。事實上,有很多這樣的服務器都是向 RPC 注冊的,舉例來說,NIS (Network Information Service) 也是 RPC server 的一種

 

二,環境前的准備:兩台服務器測試

server IP  192.168.0.97 

系統版本:

[root@centos6 ~]# uname -r
2.6.32-431.el6.x86_64

[root@centos602 ~]# hostname
nfs01

client IP  192.168.0.121

系統版本:

[root@centos6 ~]# uname -r
2.6.32-431.el6.x86_64

[root@centos602 ~]# hostname
nfs02

 

三,安裝nfs服務 server端

1.查看是否安裝

[root@centos602 ~]#  rpm -qa | grep nfs

[root@centos602 ~]#  rpm -qa | grep rpcbind

2.安裝rpcbind和nfs軟件及檢查

[root@centos602 ~]# yum -y install nfs-utils rpcbind

[root@centos602 ~]#  rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-16.el6.x86_64
nfs-utils-1.2.3-78.el6.x86_64

[root@centos602 ~]#  id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

3.啟動nfs相關服務及啟動rpcbinf服務並檢查

啟動 

[root@centos602 ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]

 檢查 

[root@centos602 ~]# /etc/init.d/rpcbind status
rpcbind (pid  7674) is running...
查看rpc端口
[root@centos602 ~]# netstat -tnulp|grep rpc
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      7674/rpcbind       
tcp        0      0 :::111                      :::*                        LISTEN      7674/rpcbind       
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               7674/rpcbind       
udp        0      0 0.0.0.0:641                 0.0.0.0:*                               7674/rpcbind       
udp        0      0 :::111                      :::*                                    7674/rpcbind       
udp        0      0 :::641                      :::*                                    7674/rpcbind       
查看端口映射情況:
[root@centos602 ~]#  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
注意:在未啟動nfs服務時,不能看到nfs端口的映射情況
 
啟動nfs服務並進行檢查
[root@centos602 ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
查看端口映射情況:

[root@centos602 ~]#  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
    100005    1   udp  53090  mountd
    100005    1   tcp  47431  mountd
    100005    2   udp  38644  mountd
    100005    2   tcp  36040  mountd
    100005    3   udp  60435  mountd
    100005    3   tcp  54783  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  36742  nlockmgr
    100021    3   udp  36742  nlockmgr
    100021    4   udp  36742  nlockmgr
    100021    1   tcp  59477  nlockmgr
    100021    3   tcp  59477  nlockmgr
    100021    4   tcp  59477  nlockmgr
添加到開機啟動中並檢查
[root@centos602 ~]#  echo "/etc/init.d/rpcbind start" >>/etc/rc.local
[root@centos602 ~]#  echo "/etc/init.d/nfs start" >>/etc/rc.local
[root@centos602 ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/etc/init.d/rpcbind start
/etc/init.d/nfs start
 
四,創建共享目錄測試並配置nfs服務的配置文件/etc/exports
創建共享目錄
[root@centos602 ~]# mkdir /data
[root@centos602 ~]# ll -d /data/
drwxr-xr-x 2 root root 4096 Dec  8 07:09 /data/
更改目錄權限
[root@centos602 ~]# chown -R nfsnobody.nfsnobody /data/
[root@centos602 ~]# ll -d /data/
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec  8 07:09 /data/
默認情況下該配置文件是空的:
[root@centos602 ~]# cat /etc/exports
[root@centos602 ~]# ll -h /etc/exports
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
編輯該配置文件:
 [root@centos602 ~]# vim /etc/exports
/data    192.168.0.0/24(rw,sync)
重新加載nfs服務
[root@centos602 ~]# /etc/init.d/nfs reload
檢查有權限掛載的服務器是否能夠掛載
[root@centos602 ~]# showmount -e 192.168.0.97或者showmount   -e   locahost
Export list for 192.168.0.97:
/data 192.168.0.0/24
也可以進行本機服務器測試
[root@centos602 ~]# mount -t nfs 192.168.0.97:/data /mnt
[root@centos602 ~]# df -h
Filesystem          Size  Used Avail Use% Mounted on
/dev/sda3            18G 1003M   16G   6% /
tmpfs               491M     0  491M   0% /dev/shm
/dev/sda1           194M   27M  158M  15% /boot
/dev/sr0            4.2G  4.2G     0 100% /yum
192.168.0.97:/data   18G 1003M   16G   6% /mnt
 

 NFS配置參數權限,具體如下表

參數名稱 參數用途
rw(熟記) 表示可讀寫權限
sync(熟記) 請求或寫入數據時,數據同步寫入到NFS Server的硬盤后才返回,優點:數據安全不會丟,缺點:性能比不啟用該參數要差
async(熟記) 寫入數據時會先寫到內存緩沖區,直到硬盤有空檔才會在寫入磁盤,這樣可以提升寫入效率。風險是若服務器宕機或不正常關機,會損失緩沖區中未寫入硬盤的數據(解決辦法:服務器主板電池或UPS不間斷電源)
all_squash(熟記) 不管訪問NFS Server共享目錄的用戶身份如何,它的權限都將被壓縮為匿名用戶,同時它的UID和GID都會變成nfsnobody賬號身份,在早期多個NFS客戶端同時讀寫NFS Server數據時,這個參數很有用,在生產環境中配置NFS的重要技巧:1)確保所有客戶端服務器對NFS共享目錄具備相同的用戶訪問權限,all_squash把所有客戶端都壓縮成匿名用戶(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客戶端和服務器端都需要有一個相同的UID和GID的用戶,nfsnodoby(UID必須相同)
anonuid(熟記) 參數以anon*開頭即值anonymous匿名用戶,這個用戶的UID設置值通常為nfsnobody的UID值,當然我們也可以自行設置這個UID值。但是,UID必須存在於/etc/passwd中。在多個NFS Clients時,如多台web server共享一個NFS目錄時,通過這個參數可以使得不同的NFS Clients寫入的數據對所有NFS Clients保持同樣的用戶權限,即為配置的匿名UID對應用戶權限,這個參數很有用。一般默認就好
anongid(熟記) 同anonuid,區別是把uid(用戶id)換成gid(組id)
ro 表示只讀權限
 
五,nfs客戶端的配置
安裝並檢查
[root@centos6 ~]# yum install nfs-utils
[root@centos6 ~]# rpm -qa  nfs-utils
nfs-utils-1.2.3-39.el6.x86_64
檢查能否訪問服務端
[root@centos6 mnt]# showmount -e 192.168.0.97
Export list for 192.168.0.97:
/data 192.168.0.0/24
掛載nfs共享目錄
[root@centos6 ~]# mount -t nfs 192.168.0.97:/data /mnt/
[root@centos6 ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos6-lv_root   18G  2.8G   14G  17% /
tmpfs                           491M     0  491M   0% /dev/shm
/dev/sda1                       485M   34M  426M   8% /boot
/dev/sr0                        3.6G  3.6G     0 100% /yum
192.168.0.97:/data               18G 1003M   16G   6% /mnt
查看
[root@centos6 ~]# mount
/dev/mapper/vg_centos6-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)
/dev/sda1 on /boot type ext4 (rw)
/dev/sr0 on /yum 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)
nfsd on /proc/fs/nfsd type nfsd (rw)
192.168.0.97:/data on /mnt type nfs (rw,vers=4,addr=192.168.0.97,clientaddr=192.168.0.121)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM