1 NFS介绍

Network File System,网络文件系统。它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中。

NFS Network File System,通过网络,让不同主机系统之间可以共享目录和文件

NFS一般被用来存储共享视频,图片,附件等静态资源文件

网站BBS程序不要放文件在NFS共享里

 

mount /dev/sdb1 /mnt

mount 网络设备系统资源   /mnt

2 RPC

因为NFS支持的功能很多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,会使用随机端口;因此会造成NFS客户端和NFS服务端通信障碍。

RPC服务就是用来解决这个困扰的,它会记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将端口和功能对应的信息传递给请求的NFS客户端。


 

3 NFS工作流程原理

当访问程序通过NFS客户端向NFS服务器端存取文件时,数据流程大致如下:

1、用户访问网站程序,由程序在NFS客户端发出存取请求,它的RPC服务向服务器端的RPC服务发出请求

2、服务器端的RPC服务找到对应的已注册的NFS端口,通知NFS客户端的RPC服务

3、此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据

4、NFS客户端把数据存取成功后,返回给前端访问程序,告知用户存取结果,作为网站用户,就完成了一次存取操作

因此,FNS的各项功能都需要向RPC服务注册,所以要先启动RPC服务,后启动NFS服务


 

4 NFS服务器端的设置和安装

4.1 NFS软件的3种安装方法

检查是否有安装:rpm -aq nfs-utils rpcbind

1)yum install nfs-utils rpcbind -y  

2)通过系统光盘里的rpm包安装:命令:rpm -ivh nfs-utils-1.2.3-36.e16.x86_64.rpm

3)LANG=en

yum grouplist|grep -i nfs

yum groupinstall "NFS file server" -y

4.2 安装nfs-utils rpcbind(知名端口111

yum install nfs-utils rpcbind –y

 

启动RPC服务 

111端口为rpcbind服务对外提供服务的主端口

[root@nfs-server ~]# /etc/init.d/rpcbind status
rpcbind 已停
[root@nfs-server ~]# /etc/init.d/rpcbind start
正在启动 rpcbind:                                         [确定]
[root@nfs-server ~]# /etc/init.d/rpcbind status
rpcbind (pid  2035) 正在运行...

 

[root@nfs-server ~]# lsof -i :111
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 2035  rpc    6u  IPv4  12735      0t0  UDP *:sunrpc
rpcbind 2035  rpc    8u  IPv4  12738      0t0  TCP *:sunrpc (LISTEN)
rpcbind 2035  rpc    9u  IPv6  12740      0t0  UDP *:sunrpc
rpcbind 2035  rpc   11u  IPv6  12743      0t0  TCP *:sunrpc (LISTEN)
[root@nfs-server ~]# netstat -lntup|grep rpcbind
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2035/rpcbind       
tcp        0      0 :::111                      :::*                        LISTEN      2035/rpcbind       
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               2035/rpcbind       
udp        0      0 0.0.0.0:938                 0.0.0.0:*                               2035/rpcbind       
udp        0      0 :::111                      :::*                                    2035/rpcbind       
udp        0      0 :::938                      :::*                                    2035/rpcbind       
[root@nfs-server ~]# netstat -lntup|grep 111
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2035/rpcbind       
tcp        0      0 :::111                      :::*                        LISTEN      2035/rpcbind       
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               2035/rpcbind       
udp        0      0 :::111                      :::*                                    2035/rpcbind       
[root@nfs-server ~]# chkconfig --list rpcbind
rpcbind         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭


启动NFS服务

[root@nfs-server ~]# /etc/init.d/nfs status
rpc.svcgssd 已停
rpc.mountd 已停
nfsd 已停
rpc.rquotad 已停
[root@nfs-server ~]# /etc/init.d/nfs start
启动 NFS 服务:                                            [确定]
关掉 NFS 配额:                                            [确定]
启动 NFS mountd:                                          [确定]
启动 NFS 守护进程:                                        [确定]
正在启动 RPC idmapd:                                      [确定]
[root@nfs-server ~]# /etc/init.d/nfs status
rpc.svcgssd 已停
rpc.mountd (pid 2141) 正在运行...
nfsd (pid 2156 2155 2154 2153 2152 2151 2150 2149) 正在运行...
rpc.rquotad (pid 2137) 正在运行...
 
nfs的主端口2049
[root@nfs-server ~]# netstat -lntup|grep 2049
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -                  
tcp        0      0 :::2049                     :::*                        LISTEN      -                  
udp        0      0 0.0.0.0:2049                0.0.0.0:*                               -                  
udp        0      0 :::2049                     :::*

         

/etc/init.d/rpcbind start

/etc/init.d/nfs start

将此写入rc.local

4.3 NFS的配置文件exports

NFS的默认配置文件:/etc/exports,默认是空的

[root@nfs-server ~]# ls -l /etc/exports
-rw-r--r--. 1 root root 0 1月  12 2010 /etc/exports
[root@nfs-server ~]# cat /etc/exports

/exports文件的配置格式为:

NFS共享的目录  NFS客户端地址1(参1,参2 NFS客户端地址212

NFS共享的目录  NFS客户端地址(参1,参2

[root@nfs-server ~]# man exports
EXAMPLE
       # sample /etc/exports file
       /               master(rw) trusty(rw,no_root_squash)
       /projects       proj*.local.domain(rw)
       /usr            *.local.domain(ro) @trusted(rw)
       /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
       /pub            *(ro,insecure,all_squash)
       /srv/www        -sync,rw server @trusted @external(ro)
       /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
       /build          buildhost[0-9].local.domain(rw)

配置实例

/data 192.168.4.0/24(rw,sync,all_squash)

NFS配置权限设置的常用参数   /data     192.168.4.*(rw,sync)

rw Read-write   表示可读写权限

ro  Read-only   只读权限

sync      请求或写入数据时,数据同步写入到NFS Server         同步写入

async     请求或写入数据时,先返回请求,再将数据写入到内存   异步写入

all_squash   不论登入NFS的使用者身份是什么,他的身份都会被压缩成为匿名使用者,通常就是nobody

 

平滑加载此服务  下面两个命令等价

[root@nfs-server ~]# exportfs -r

[root@nfs-server ~]# /etc/init.d/nfs reload

4.4 查看本机共享的记录

[root@nfs-server ~]# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/data 192.168.4.*

4.5 在本机测试挂载

[root@nfs-server ~]# mount -t nfs 192.168.4.120:/data  /mnt
[root@nfs-server ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda3            9.2G  1.8G  7.0G  20% /
tmpfs                491M     0  491M   0% /dev/shm
/dev/sda1            194M   29M  155M  16% /boot
192.168.4.120:/data  9.2G  1.8G  7.0G  20% /mnt

 

5 NFS客户端配置

[root@lamp01 ~]# /etc/init.d/rpcbind start
正在启动 rpcbind:                                         [确定]
[root@lamp01 ~]# chkconfig rpcbind on
[root@lamp01 ~]# vi /etc/rc.local  最好也放进/etc/rc.local
[root@lamp01 ~]# /etc/init.d/rpcbind status
rpcbind (pid  1729) 正在运行...
[root@lamp01 ~]#
[root@lamp01 ~]# showmount -e 192.168.4.120
Export list for 192.168.4.120:
/data 192.168.4.*
[root@lamp01 ~]# mount -t nfs 192.168.4.120:/data /mnt
[root@lamp01 ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda3            9.2G  1.8G  7.0G  20% /
tmpfs                491M     0  491M   0% /dev/shm
/dev/sda1            194M   29M  155M  16% /boot
192.168.4.120:/data  9.2G  1.8G  7.0G  20% /mnt
[root@lamp01 ~]# mount
/dev/sda3 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)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.4.120:/data on /mnt type nfs (rw,vers=4,addr=192.168.4.120,clientaddr=192.168.4.121)

 

默认没有写的权限,需要更改权限

[root@nfs-server /]# cat /var/lib/nfs/etab
/data   192.168.4.*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
[root@nfs-server /]# ls -ld /data/
drwxr-xr-x 2 root root 4096 6月   9 00:01 /data/
[root@nfs-server /]# grep 65534 /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs-server /]# chown -R nfsnobody /data
[root@nfs-server /]# ls -ld /data/          
drwxr-xr-x 2 nfsnobody root 4096 6月   9 00:01 /data/

 

把挂载放进rc.local

[root@lamp01 mnt]# vim /etc/rc.local
mount -t nfs 192.168.4.120:/data /mnt

 

6 NFS客户端挂载排错思路

1、首先确认NFS服务端配置和服务是否OK

[root@nfs-server ~]# showmount -e 127.0.0.1(localhost)

最好服务端自己挂载自己看看可不可以

mount -t nfs 192.168.4.120:/data /mnt

df -h

2、确认NFS客户端showmount是否OK

showmount -e 192.168.4.120

如果不行

1ping NFS服务端IP检查链路

2telnet服务端IP端口检查

telnet 192.168.4.120 111

 

7 NFS服务端配置步骤

1、安装软件:yum install nfs-utils rpcbind -y

2、启动服务(注意先后顺序)

/etc/init.d/rpcbind start

rpcinfo -p localhost   <=======检查

/etc/init.d/nfs start

rpcinfo -p localhost   <=======检查

3、设置开机自启动,扔到/etc/rc.local

chkconfig nfs on

chkconfig rpcbind on

4、配置NFS服务

echo "/data 192.168.4.0/24(rw,sync,all_squash)" >>/etc/exports

mkdir -p /data

chown -R nfsnobody.nfsnobody /data  (查看nfs默认使用的用户及共享参数cat /var/lib/nfs/etab

5、重新加载服务(平滑加载)

/etc/init.d/nfs reload  <=====exportfs -r

6、检查或测试挂载

showmount -e localhost

monut -t nfs 192.168.4.120:/data /mnt

 

 

8 客户端配置步骤

1、安装软件:yum install nfs-utils rpcbind -y

2、启动rpcbind

/etc/init.d/rpcbind start

3、配置开机启动,扔到rc.local

chkconfig rpcbind on

4、测试服务端共享情况

showmount -e server_ip

5、挂载

mkdir -p /data

mount -t nfs server_ip:/data /data

6、测试读、写

7、把挂载的命令扔到rc.local使它开机挂载

9 企业生产环境nfs性能优化挂载的例子

1)禁止更新目录及文件时间戳挂载

mount -t nfs -o noatime,nodiratime 192.168.4.120:/data /mnt

2)安全的挂载方式

mount -t nfs -o nosuid,noexec,nodev,rw 192.168.4.120:/data /mnt

3)安全加优化的挂载方式

mount   -t   nfs  -o

nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.4.120:/data /mnt

4)默认的挂载方式

mount -t nfs 192.168.4.120:/data /mnt

注意:非性能的参数越多,速度可能会越慢

 

10 重要问题

1、有关NFS客户端普通用户写NFS的问题

exports all_squash

2NFS开机放到fstab也可行  前提是某些开机启动服务进程开启,会检测

 

 cat /var/lib/nfs/etab 服务端查看NFS配置的参数细节

 cat /proc/mounts      客户端查看挂载参数细节