NFS
NFS是什么?
网络文件系统
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样
NFS使用什么端口
基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!!
RPC与NFS如何通讯
RPC端口 111
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的端口,并且通知客户端,记客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
提示:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。portmap服务(5.5)rpcbind(6之后)
NFS Server端操作
安装NFS
yum -y install nfs-utils rpcbind
启动(记得一定要先启动rpcbind)
/etc/init.d/rpcbind start
/etc/init.d/nfs start
启动rpc后检查
[[email protected] ~]# 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 35420 status
100024 1 tcp 54131 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 56084 mountd
100005 1 tcp 55590 mountd
100005 2 udp 50500 mountd
100005 2 tcp 35736 mountd
100005 3 udp 40909 mountd
100005 3 tcp 42062 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 44003 nlockmgr
100021 3 udp 44003 nlockmgr
100021 4 udp 44003 nlockmgr
100021 1 tcp 52685 nlockmgr
100021 3 tcp 52685 nlockmgr
100021 4 tcp 52685 nlockmgr
配置NFS
检查启动成功后编辑NFS配置文件,配置允许访问的客户端和共享目录
NFS默认配置文件(默认为空文件)
/etc/exports
vim /etc/exports
/nfs 192.168.56.6(rw,async,all_squash)
/etc/init.d/nfs reload
格式:NFS共享目录 NFS客户端地址1(参数1,参数2,参数3…) 客户端地址2(参数1,参数2,参数3…)
NFS客户端地址1写法: * 所有网络 192.168.56.0/24 指定网段 192.168.56.6 指定单一地址
通过命令配置共享目录
[[email protected] nfs]# exportfs -o rw,all_squash 10.125.192.11:/nfs
注:通过命令添加的共享目录 在/etc/exports文件中查看不到,可以通过命令查看所有共享信息,重启nfs服务失效
[[email protected] nfs]# showmount -e localhost
Export list for localhost:
/nfsfile 10.125.192.0/24
/nfs 10.125.192.11
权限说明
rw 读写
ro 只读
sync 同步写入
async 异步写入
no_root_squash 如果是root用户访问,它对该目录具有root权限,应避免使用
root_squash 如果是root用户访问,则它的权限被降为匿名用户,他的uid gid通常被降为nobody
all_squash 不管用户已什么身份访问,它的权限都会被降为匿名用户,在多用户访问下这个参数很有用
anonuid 自定义uid权限
查看NFS配置参数
cat /var/lib/nfs/etab
/nfs *(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,all_squash)
编辑好配置文件之后,创建一个共享目录
mkdir /nfs
注意:nfs客户端在服务器端导出的目录,也有一定权限要求,不然挂载后会报没有权限,即使已经给了rw,安装nfs后会自动创建nfsnobody
chown -R nfsnobody.nfsnobody /nfs/
设置开机自启动
chkconfig nfs on
chkconfig rpcbind on
NFS SERVER端的防火墙控制
iptables -A INPUT -p tcp -s 10.125.192.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -p udp -s 10.125.192.0/24 --dport 111 -j ACCEPT
NFS客户端操作
yum install -y nfs-utils rpcbind
启动rpcbind
/etc/init.d/rpcbind start
查看NFS Server共享信息
showmount -e 192.168.56.5
Export list for 192.168.56.5:
/nfs 192.168.56.6
创建挂载点并挂载
mkdir /testnfs
mount 192.168.56.5:/nfs /testnfs/
默认挂载使用的nfsv4版本
nfsstat -m
/testnfs from 192.168.56.5:/nfs/
Flags: rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.56.6,minorversion=0,local_lock=none,addr=192.168.56.5
检查挂载
df -TH
192.168.56.5:/nfs nfs 19G 8.4G 9.2G 48% /testnfs
测试读写
touch /testnfs/test
在服务端对应目录下查看是否创建成功
设置开机启动
chkconfig rpcbind on
测试读写速度
在客户端操作哦 多测几次取平均值
写 :
time dd if=/dev/zero of=/testnfs/tets bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 22.4746 s, 47.8 MB/s
real 0m22.555s
user 0m0.005s
sys 0m0.174s
我的环境是 两台VM虚拟机 所以网络传输速度这里没有办法考虑在内
读:
time dd if=/testnfs/tets of=/dev/null bs=1M iflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 12.6105 s, 85.1 MB/s
real 0m12.616s
user 0m0.007s
sys 0m0.074s
性能优化
挂载参数优化
bg 后台挂载
nosuid 禁止 suid 操作和设定 sgid 位
noexec 不允许执行此文件系统上的二进制文件
noatime 不更新文件系统上 inode 访问记录
nodiratime 不更新文件系统上的目录 inode 访问记录
hard 如果server端没有响应,那么客户端一直尝试挂载
intr 可以中断不成功的挂载
mount -t nfs -o bg,nosuid,noexec,noatime,nodiratime,hard 192.168.56.5:/nfs/ /testnfs
经过测试,默认参数已经很优秀了,其他参数自己根据需求制定
系统优化
修改内核优化磁盘读写速度
cat >>/etc/sysctl.conf <<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
sysctl -p
NFS客户端启动自动挂载
对于NFS共享目录,一般不要写到/etc/fstab里。因为在客户端主机重启时如果由于网络等原因连不上nfs server时就会导致客户端主机无法启动,一般通过把mount 10.125.192.5:/nfs /mnt 命令放到/etc/rc.local中,也可以在fstab文件中格式选项中,defaults,_netdev (_netdev参数表示延迟挂载,等网络启动后在挂载)