一、NFS是个啥,工作机制
它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
NFS一般用来存储共享视频,图片等静态数据。
NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据就要有想对应的网络端口来进行传输。NFS服务器到底使用什么网络端口来传输数据的,NFS服务器端其实是随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS服务器时通过远程过程调用(remote procedure call 简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输。
RPC管理服务端的NFS端口分配,客户端要传数据,那客户端的RPC会先跟服务端的RPC去要服务器的端口,要到端口后再建立连接,然后传输数据。
提示:在启动NFS SERVER之前,首先要启动RPC服务,否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
《客户端NFS和服务端NFS通讯过程》
1)首先服务器端启动RPC服务,并开启111端口
2)启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC,向服务端的RPC服务请求服务端的NFS端口
4)服务端的RPC服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
二、NFS部署
1、查看系统版本等参数,服务器版本
[root@promote ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@promote ~]# uname -r 3.10.0-327.el7.x86_64 [root@promote ~]#
2、两个安装NFS服务软件包的方法
1)[root@aliyun ~]# yum groupinstall "NFS file server" -y 2)yum install -y nfs-utils rpcbind
3、启动NFS服务(server端)
1)先启用rpc服务 [root@aliyun ~]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] 2)查看服务端的开启的中间服务 [root@aliyun ~]# rpcinfo -p 127.0.0.1 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 3)启动NFS服务,如果直接启动NFS服务会失败。 [root@aliyun ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS mountd: rpc.mountd: svc_tli_create: could not open connection for udp6 rpc.mountd: svc_tli_create: could not open connection for tcp6 rpc.mountd: svc_tli_create: could not open connection for udp6 rpc.mountd: svc_tli_create: could not open connection for tcp6 rpc.mountd: svc_tli_create: could not open connection for udp6 rpc.mountd: svc_tli_create: could not open connection for tcp6 [ OK ] Starting NFS daemon: rpc.nfsd: address family inet6 not supported by protocol TCP [ OK ] Starting RPC idmapd: [ OK ] 4)当开启NFS服务的时候再查看服务端的开启的中间服务,会发现多了很多服务和端口 [root@aliyun ~]# rpcinfo -p 127.0.0.1 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 46787 mountd 100005 1 tcp 48141 mountd 100005 2 udp 51029 mountd 100005 2 tcp 34046 mountd 100005 3 udp 54267 mountd 100005 3 tcp 33692 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 49372 nlockmgr 100021 3 udp 49372 nlockmgr 100021 4 udp 49372 nlockmgr 100021 1 tcp 33433 nlockmgr 100021 3 tcp 33433 nlockmgr 100021 4 tcp 33433 nlockmgr [root@aliyun ~]# 5)设置开机启动 [root@aliyun ~]# chkconfig rpcbind on [root@aliyun ~]# chkconfig nfs on
4、client端只需要启动RPC服务
[root@weiwei ~]# /etc/init.d/rpcbind start [root@weiwei ~]# /etc/init.d/rpcbind status rpcbind (pid 18859) is running... [root@weiwei ~]# chkconfig rpcbind on
5、NFS的配置文件,在server上
1)[root@aliyun ~]# cat /etc/exports ##test for rpc and nfs /data 192.168.222.0/24(rw,sync) 如果这边是ro,就是read only 依次是,共享/data目录,仅仅192.168.222.0/24此网段的主机可以访问,,具有读写权限,将buffer中数据库同步到硬盘上也就是不在内存之中 2)平滑重启 /etc/init.d/nfs reload 如果此时正在使用,那就继续使用,如果没有使用的就不可以使用了 3)查看是否可以共享(服务端检查) showmount -e localhost (NFS服务器) [root@aliyun ~]# showmount -e 127.0.0.1 Export list for 127.0.0.1: /data 10.0.0.0/24 (客户端) showmount -e 服务端的ip地址(服务端检查) [root@weiwei ~]# showmount -e 192.168.222.140 Export list for 192.168.222.140: /data 192.168.222.0/24
6、在客户端挂在共享的目录,/data是共享目录,/mnt是挂在在本地的目录,这个是临时挂在,重启之后就没了,然后要在/etc/fstab下面挂载或者在rc.local里面开机启动执行
[root@weiwei ~]# mount -t nfs 192.168.222.140:/data /mnt [root@weiwei ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_weiwei-lv_root 18G 5.1G 12G 31% / tmpfs 932M 80K 932M 1% /dev/shm /dev/sda1 477M 43M 410M 10% /boot /dev/sr0 1.9G 1.9G 0 100% /media/CentOS-6.7-x86_64-LiveDVD 192.168.222.140:/data 17G 2.4G 14G 16% /mnt [root@weiwei ~]# [root@weiwei ~]# cd /mnt [root@weiwei mnt]# ls a.txt [root@weiwei mnt]# cat a.txt niamadafjoiewfwe [root@weiwei mnt]# ###挂载,两种方式 /etc/fstab 192.168.222.140:/data /mnt ext4 defaults 0 0 /etc/rc.local mount -t nfs 192.168.222.140:/data /mnt
a、/etc/rc.local里面
缺点:偶尔开机挂载不上,工作中除了开机自启动配置,对挂载点监控。
b、/etc/fstab里面
缺点:NFS网络文件系统不要放到fstab。
1、fstab优先于网络启动。此时还连不上NFS服务器端。
2、即使是本地文件系统,也要注意,fstab最后两列,要设置 0 0 ,否则导致无法启动服务器的问题。
7、此时读是同步了,但是如果我想写却出现了问题
[root@weiwei mnt]# touch b.txt touch: cannot touch `b.txt': Permission denied [root@weiwei mnt]# 此时就要去服务器上去看看共享目录的其他用户的权限,此时的用户是nfsnobody [root@promote /]# ls -l data total 4 -rw-r--r--. 1 root root 17 Aug 14 07:00 a.txt [root@promote /]# chmod -R 777 data 此时就可以了 查看其他用户 [root@promote ~]# cat /var/lib/nfs/etab /data 192.168.222.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash) nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
可以参考:http://atong.blog.51cto.com/2393905/1343950
例题:
实现当多台客户端同时挂载一台NFS SERVER时,无论从哪个客户端写入数据,其他客户端同样也可以读写,即让所有NFS客户端写入到NFS SERVER的文件或目录在NFS SERVER上的用户和组都是同一个名称oldgirl。
下面只有简述过程,相当于优化
1、服务端和客户端都创建oldgirl用户,客户端和服务器的uid和gid都要同步,,共享用户
[root@server ~]# id oldgirl uid=555(oldgirl) gid=555(oldgirl) groups=555(oldgirl) [root@server ~]# [root@client ~]# id oldgirl uid=555(oldgirl) gid=555(oldgirl) groups=555(oldgirl) [root@client ~]#
2、配置文件
[root@server ~]# vim /etc/exports ##test for rpc and nfs ##/data 192.168.222.0/24(rw,sync) /data 192.168.222.0/24(rw,sync,all_squash,anonuid=555,anongid=555) 将所有的用户都压缩成oldgirl
配NFS生产重要技巧
1、确保所有服务器对NFS共享目录具备相同的权限
a.all_squash把所有客户端都压缩成匿名用户。
b.就是anonuid,anongid指定的UID和GID的用户。
2、所有的客户端和服务端都需要有一个相同的UID和GID的用户,及nfsnobody(UID必须相同)
3、生效
[root@server ~]# systemctl reload nfs [root@server ~]# cat /var/lib/nfs/etab /data 192.168.222.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=555,anongid=555,sec=sys,rw,secure,root_squash,all_squash)
4、设置/data文件的用户和组
[root@server /]# chown -R oldgirl.oldgirl data
unmount -lf /mnt,,,此时就在挂载的目录,然后卸载挂载目录
===============================================mount参数的优化,高并发,读写数据块。
客户端安全优化的参数用的较多的:nosuid,noexec,nodev,rw
mount -t nfs -o nosuid,noexec,nodev,rw ********:/data /mnt
服务器端性能优化的参数用的较多的:sync
客户端的性能优化:noatime.nodiratime(高并发的环境)
[root@client ~]# cat /proc/mounts
……
192.168.222.140:/data/ /mnt nfs4 (协议越新,性能越高)rw,relatime,vers=4,rsize=262144,wsize=262144(这个目前完善的很不错),namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.222.138,minorversion=0,local_lock=none,addr=192.168.222.140 0 0
noatime:
当文件被创建,修改和访问时,Linux系统会记录这些时间信息。当系统的读文件操作频繁时,记录文件最近一次被读取的时间信息,将是一笔不少的开销。所以,为了提高系统的性能,我们可以在读取文件时不修改文件的atime属性。可以通过在加载文件系统时使用notime选项来做到这一点。当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。由于写操作相对读来说要更消耗系统资源,所以这样设置可以明显提高服务器的性能。
nodiratime:
Do not update directory inode access times on this filesystem.
NFS官方优化可以修改,官方建议 内核优化 [root@server ~]# cat /proc/sys/net/core/rmem_default //该文件指定了接收套接字缓冲区大小的缺省值(单位字节) 212992 [root@server ~]# cat /proc/sys/net/core/rmem_max //该文件指定了接收套接字缓冲区大小的最大值(单位字节) 212992 可以将数值改大 echo 262144 >/proc/sys/net/core/rmem_default [root@server ~]# cat /proc/sys/net/core/wmem_default //发送 212992 [root@server ~]# cat /proc/sys/net/core/wmem_max 212992
通过命令行来修改共享目录
exportfs -o rw,sync,all_squash,anonuid=555,anongid=555 192.168.222.0/24:/data
[root@server ~]# cd /var/lib/nfs/ [root@server nfs]# ls etab export-lock nfsdcltrack rmtab rpc_pipefs statd state v4recovery xtab [root@server nfs]# cat etab //查看默认参数 /data 192.168.222.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=555,anongid=555,sec=sys,rw,secure,root_squash,all_squash) [root@server ~]# cat /etc/exports //这个是配置的参数 ##test for rpc and nfs ##/data 192.168.222.0/24(rw,sync) /data 192.168.222.0/24(rw,sync,all_squash,anonuid=555,anongid=555)
mount -a 用来检测挂载是否正确
[root@server ~]# cat /proc/mounts
//查看详细的挂载参数(文件系统),包括未显示的重要的挂载项.如:/dev/pts