CentOS 6.x Linux系统下安装和配置NFS文件服务器及测试使用教程

NFS概述

网络文件系统(Network File System,NFS),一种使用于分散式文件系统的协议,由Sum公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在Unix系统间实现磁盘文件共享的一种方法。
NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。
NFS基于RPC(Remote Procedure Call Protocol远程过程调用协议)实现。NFS是TCP/IP协议集所提供的一种子协议,该协议可以实现LINUX/UNIX主机之间的文件共享,磁盘空间共享。它只用于Linux和Unix内核的操作系统进行共享。使用NFS网络文件系统,可以将服务器的硬盘挂载到本地,就像操作本地计算机的硬盘一样。
NFS传输数据时使用的端口是一个随机端口。
RPC,远程过程调用。它的功能是指定每个NFS功能对应的端口号,当NFS服务器启动时会随机启用数个端口号,并主动向RPC注册,这样RPC就知道每个端口号对应的功能了,RPC使用111号端口来监听客户机的请求并回应正确的端口号。

启动NFS之前要先启动RPC,否则NFS无法向RPC注册,当RPC重新启动后,原来注册的端口数据会丢失,这时,它管理的所有程序都必须重新向RPC注册。

NFS 提供的服务:

1)在目录(directory)中查找文件
2)列出目录中的文件
3)管理目录
4)取得各文件的属性(file attribute)
5)文件的读/写

可能会用到NFS的情形

1、多台PC共享使用同一台PC的打印机,CD-ROM等资源。
2、多个客户端访问同一个网络资源,保证访问的是同一个没差异的资源。
3、web应用中,如果需要将某些域名的访问独立到另外服务器去,可以将该域名下的文件夹通过NFS配置到目标服务器去。

NFS工作原理

1)客户机发送RPC请求到远程NFS服务器中。
2)NFS服务器利用rpcbind服务查询NFS的工作端口。
3)客户机联系要装载的分区,同时服务器会验证客户机是否有权加载。
4)客户机更新MTAB文件,表示加裁成功。

NFS服务端(NFS-Server)

环境说明

NFS-Server: 192.168.1.189 (Centos 6.5)
NFS-Client: 192.168.1.193 (Centos 6.5)

NFS-Server安装

NFS的安装需要的软件包;
Centos5: 需要nfs-utils和portmap;
Centos6:需要nfs-utils和rpcbind;(在CentOS 6.x当中,portmap服务由rpcbind负责) :

使用如下命令查找系统是否已安装如上的软件包;

rpm -qa|grep nfs
rpm -qa|grep rpcbind

如果已安装,则直接进行“NFS-Server配置”这一步;如果未安装,则运行如下命令安装:

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

注:若是在centos 5上安装,使用yum install nfs-utils portmap

nfs-utils包提供了NFS服务器程序和相应的管理工具。
protmap是一个管理RPC连接的程序,portmap服务对NFS是必须的,因为它是NFS的动态端口分配守护进程,如果portmap不启动,NFS就是启动不了的。

NFS-Server配置

创建共享目录(设置读写权限):

[root@centos189 ~]# mkdir -p /data/nfs_storage
[root@centos189 ~]# chmod 755 /data/nfs_storage/

导出共享目录设置:

[root@centos189 ~]# vi /etc/exports 
[root@centos189 ~]# cat /etc/exports 
/data/nfs_storage 192.168.1.0/24(rw,sync,no_root_squash,no_all_squash)

注:NFS共享目录为:/data/nfs_storage 使用绝对路径。
192.168.1.0/24表示192.168.1.0-192.168.1.254区间的IP都可以访问
注意地址和参数表之间没有空格。如果下面设置的mountd端口大于1024,需要在参数表里加入参数:insecure

NFS服务器的配置文件——————-exports
exports文件在目录“/etc”下,用于配置NFS服务器所提供的目录共享。exports的默认设置为空,没有输出任何的目录共享,这也是出于安全考虑,这样即使启动了NFS服务也不会提供任何的共享。

exports文件的格式
这个文件的格式非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:
[共享的目录] [主机名或IP(参数,参数)]
/www/chinafu *(sync,ro)
在共享设置文件中,共享目录和主机地址间用空格分隔,主机地址之后紧随设置选项,设置选项放在括号中,多个设置选项间用逗号分隔。
其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是 sync,ro,root_squash,no_delay。

CentOS系统中,当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
exports文件中每行提供一个共享的目录,设置行的格式如下所示:

共享目录
共享目录设置系统中需要作为共享的目录路径。
客户端主机地址在exports文件客户端,客户端主机的指定非常灵活,如下所示

客户端主机地址 说明
192.168.0.28 指定ip地址的主机
www.chinafu.net 指定域名的主机
192.168.0.10/31 指定网段中的所有主机
*.chinafu.com 指定域中的所有主机
* 指定所有主机

设置选项
exports文件中的设置选择较多,但经常用的并不多
设置选项 说明
ro read-only,只读访问
rw read-write,读写访问
sync 同步写入(文件同时写入硬盘和内存),适用在通信比较频繁且实时性比较高的场合
async 异步写入(文件先写入内存,稍候再写入硬盘),性能较好(速度快),适合超大或者超多文件的写入,但有数据丢失的风险,比如突然断电等情况;
注意:除非特別有需要,否则不建议使用 async。如果沒有指定 sync 或 async,NFS 服务器在启动的时候会印出警告信息。
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash NFS客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录也使用 root 权限。不安全!
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID

iptables防火墙设置

设置nfs相关端口

[root@centos189 ~]# vi /etc/sysconfig/nfs 
RQUOTAD_PORT=875  #取消前面的注释
LOCKD_TCPPORT=32803 #取消前面的注释
LOCKD_UDPPORT=32769 #取消前面的注释
MOUNTD_PORT=892 #取消前面的注释
STATD_PORT=1001 #取消前面的注释,端口修改为1001
STATD_OUTGOING_PORT=1004 #取消前面的注释,端口修改为1004

重启NFS:

要使配置生效需要重启NFS

[root@centos189 ~]# /etc/init.d/nfs restart

或运行命令

[root@centos189 ~]# exportfs  -arv

当exports文件修改后,使用exportfs -arv命令,不需要重启NFS服务,就可以重新挂载/etc/exports里面的设定:

添加iptables规则:

服务器端防火墙设置(NFS 开启防墙配置):
配置rpc,nfsd,rquotad,mountd使用的端口。因为NFS会为以上三个服务分配临时端口,所以很难在防火墙上控制要开放哪些端口。所以要将未配置的端口固定住。
如果mountd占用端口大于 1024,在文件 /etc/exports里需要加入参数insecure。如: 192.168.0.100(insecure,rw,async,root_squash,no_all_squash)

在NFS-Server的防火墙里开放相关端口

[root@centos189 data]# vi /etc/sysconfig/iptables
在filter表的COMMIT上面添加如下内容: 

:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 875 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 875 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 892 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 892 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 32803 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 32769 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1001 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 1001 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1002 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 1002 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1003 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 1003 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1004 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 1004 -j ACCEPT

重启iptables:

[root@centos189 data]# service iptables restart

NFS启动

[root@centos189 ~]# chkconfig rpcbind on
[root@centos189 ~]# chkconfig nfs on
[root@centos189 ~]# service rpcbind start
[root@centos189 ~]# service nfs start

CentOS5.x中如果之前没有先启动portmap服务,那么当启动NFS服务时会停在
Starting NFS daemon:
很长时间。

检查配置是否成功:

[root@centos189 ~]# exportfs
/data/nfs_storage
		192.168.1.0/24

查看当前主机RPC状态:

rpcinfo -p localhost

如果你只需要配置一个简单的nfs服务器的话,那只需要开放3个守护进程端口就行了:
111,portmap启动的端口,用来提供nfs端口
2049,NFS启动的端口,用来管理Client登入主机的权限
1011,刚才配置的mountd端口,这个端口主要用来管理NFS文件系统权限的

/etc/exports
这个是NFS的主要配置文件,但没有默认值,空的。
/usr/sbin/exportfs
维护NFS共享资源的命令。
/usr/sbin/showmount
exportfs用在server端,而showmount则用在客户端,这个命令可以查看NFS服务器共享出来的目录资源。
/var/lib/nfs/
这个目录下有两个重要的日志文件,etab:主要记录NFS共享出来的完整权限设定值,xtab:记录曾连接到此主机的客户机相关数据。

NFS客户端

NFS-Client安装

客户端上的操作系统与服务端的操作系统相同;也需要安装nfs-utls和rpcbind

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

注:若是在centos 5上安装,使用yum install nfs-utils portmap

NFS-Client启动

客户端不需要启动rpcbind和nfs服务即可挂载,所以以下的启动操作可以不用执行。

[root@centos193 ~]# chkconfig rpcbind on
[root@centos193 ~]# chkconfig nfs on
[root@centos193 ~]# service rpcbind start
[root@centos193 ~]# service nfs start

NFS-Client挂载共享目录
创建挂载点:

[root@centos193 ~]# mkdir -p /data/nfs_shared

查看nfs能否访问:

NFS服务端启动成功后,客户端可以利用showmount命令测试是否能连上服务端:
命令格式:showmount -e [hostname|IP],showmount命令需要安装了nfs-utils软件包才有。

[root@centos193 ~]# showmount -e 192.168.1.189
Export list for 192.168.1.189:
/data/nsf_storage 192.168.1.0/24

挂载NFS-Server的共享目录:

[root@centos193 ~]# mount -t nfs 192.168.1.189:/data/nfs_storage /data/nfs_shared
也可以写成  
mount -t nfs 192.168.1.189:/data/nfs_storage /data/nfs_shared -o nolock -o proto=tcp

为了提高NFS的稳定性,使用TCP协议挂载,NFS默认用UDP协议,可以加上-o proto=tcp换成TCP协议。
命令格式:mount – t nfs nfs服务器地址:目录共享 本地挂载目录点
查看是否挂载成功:
客户端可使用df命令,mount命令查看挂载情况:

[root@centos193 data]# 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/mapper/vg_centos6-lv_home on /home 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)
nfsd on /proc/fs/nfsd type nfsd (rw)
192.168.1.189:/data/nfs_storage on /data/nfs_shared type nfs (rw,vers=4,addr=192.168.1.189,clientaddr=192.168.1.193)

或者

df -h

查看挂载目录的信息:

fuser -m -v /data/nfs_shared

客户端卸载NFS文件命令:

umount /data/nfs_shared

如果遇到:umount.nfs: /data/nfs_shared: device is busy
可以用命令:

[root@localhost /]# fuser -m -v /data/nfs_shared
                     用户     进程号 权限   命令
/data/nfs_shared:    root       2798 ..c.. bash
                     root       2996 ..c.. su
[root@localhost /]# kill -9 2798
[root@localhost /]# kill -9 2996
[root@localhost /]# umount /data/nfs_shared

配置开机自动挂载
客户端可以设置系统启动时自动挂载NFS文件:
需要将NFS的共享目录挂载信息写入/etc/fstab/文件,以实现对NFS共享目录的自动挂载。
编辑/etc/fstab文件,在最后加入如:

[root@centos193 ~]# vi /etc/fstab 
192.168.1.189:/data/nfs_storage /data/nfs_shared nfs rw,sync,hard,intr 0 0

当使用NFS共享文件时,需要首先挂载,挂载后用户又不是一直在线,只要任一方离线,都会造成另一方等待超时,那么,有没有一个方法能让用户使用时自动挂载,不使用时自动缷载?当然有。使用autofs这个服务。在客户端配置:
通过autofs,客户端使用的时候,会自动挂载
1)安装yum install -y autofs
2)修改配置文件
vim /etc/auto.master
/data/nfs_shared /etc/autonfs.conf

vim /etc/autonfs.conf
nfs 192.168.1.189:/data/nfs_storage/nfs

3)重启autofs:service autofs start
ls /data/nfs_shared/nfs //第一次使用时是没有这个目录的,当访问这个目录时就会自动挂载了。当5分钟没有使用就会自动缷载。

测试NFS

客户端:

[root@centos193 nfs_shared]# mkdir testdir
[root@centos193 nfs_shared]# touch testfile1 testfile2

服务端:

[root@centos189 ~]# cd /data/nfs_storage/
[root@centos189 nfs_storage]# ls
testdir testfile1 testfile2

调优

在默认情况下,NFS 的配置不适合大容量磁盘。
每个客户机应该用 rsize=32768,wsize=32768,intr,noatime 挂装远程文件系统,如。
mount -o rsize=32768,wsize=32768,intr,noatime server1:/
/mount/point/

从而确保:
使用大的读/写块(数字指定最大块大小,在这个示例中是 32KB)。
在挂起时 NFS 操作可以被中断。
不持续更新 atime。

可以将这些设置放在 /etc/fstab 中。如果使用自动挂装器,那么应该将这些设置放在适当的 /etc/auto.* 文件中。
在 服务器端,一定要确保有足够的 NFS 内核线程来处理所有客户机。在默认情况下,只启动一个线程,但是 Red Hat 和 Fedora 系统会启动 8 个线程。对于繁忙的 NFS 服务器,应该提高这个数字,比如 32 或 64。可以用 nfsstat -rc 命令评估客户机,了解是否有阻塞的现象,这个命令显示客户机远程过程调用(RPC)统计数据。下表显示一个 Web 服务器的客户机统计数据。

# nfsstat -rc
Client rpc stats:
calls retrans authrefrsh
1465903813 0 0

第二列 retrans 是零,这表示从上一次重新引导以来没有出现需要重新传输的情况。如果这个数字比较大,就应该考虑增加 NFS 内核线程。设置方法是将所需的线程数量传递给 rpc.nfsd,比如 rpc.nfsd 128 会启动 128 个线程。任何时候都可以进行这种设置,线程会根据需要启动或销毁。同样,这个设置应该放在启动脚本中,尤其是在系统上启用 NFS 的脚本。

关于 NFS,最后要注意一点:如果可能的话,应该避免使用 NFSv2,因为 NFSv2 的性能比 v3 和 v4 差得多。在现代的 Linux 发行版中这应该不是问题,但是可以在服务器上检查 nfsstat 的输出,了解是否有任何 NFSv2 调用。

NFS端口

rpc服务器启动,被rpc客户调用的过程:
a. 系统引导时,端口映射器首先启动,创建tcp和udp端点,被动打开tcp111端口,在udp111端口等待数据;
b. rpc服务器程序启动时,为所支持的程序的每一个版本绑定一个临时端口号,在端口映射器 注册;
c. rpc客户程序启动时,根据参数在端口映射器中查找指定过程绑定的端口号;
d. 如果是udp,rpc客户根据返回的端口号发送rpc调用报文;如果是tcp,rpc客户先在返回的端口号上执行主动打开,再发送rpc调用报文,大多数实现将NFS指定udp端口号2049。
[root@localhost~]# netstat -tunl |grep “111”
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0:::111 :::* LISTEN
udp 0 00.0.0.0:111 0.0.0.0:*
udp 0 0 :::111 :::*
[root@localhost~]# netstat -tunl |grep “2049”
tcp 0 00.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

NFS常见故障

如果发现挂载不了,出现如下提示:
[root@rhel3 ~]# mount.nfs 192.168.100.20:/home /mnt
mount: mount to NFS server ‘192.168.100.20’ failed: System Error: No route to host.
这很可能是防火墙的问题。

如果还有人在使用NFS,这时服务器需要关机的话,是不能关机的,系统会等到没有用户使用时再关机,如果关机时间很长,看看是不是还有用户在线。

如果使用的是服务器名挂载,要确保服务器名是能解析的。如果没有DNS服务器,可以在/etc/hosts中添加。

NFS管理命令

showmount -e 在NFS Server上执行此命令显示NFS Server上所有的共享卷;
showmount -e 192.168.1.100 在NFS Client上执行此命令显示NFS Server上所有共享卷;

exportfs -av 根据/etc/exports导出所有卷;
exportfs -rv 重新导出所有卷,增加/etc/exports中的新项目、删除不存在的项目、更新改变的项目。

exportfs //查看已共享的目录(服务器端使用)

exportfs选项:
-a //全部mount或umount /etc/exports中的内容
-u //umount内容
-r //重新mount /etc/exports中的内容
-o //共享选项
-v //在exports的时候,将共享的目录显示到屏幕上

参考资料:
在CentOS下安装配置NFS服务器:http://www.qixing318.com/article/under-the-centos-installation-configuration-nfs-server.html
CentOS6.x下文件服务器(nfs)的搭建:http://blog.itechol.com/space-33-do-blog-id-6471.html
LINUX-NFS服务配置:http://chenbin.blog.51cto.com/945033/324318
CentOS下NFS服务器配置教程:http://www.osyunwei.com/archives/3757.html

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据