http://blog.51cto.com/mrxiong2017/2087001
NFS是Network File System的缩写,即网络文件系统。客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下。
一、NFS的工作流程
1 2 3 4 |
1、由程序在NFS客户端发起存取文件的请求,客户端本地的RPC(rpcbind)服务会通过网络向NFS服务端的RPC的111端口发出文件存取功能的请求。 2、NFS服务端的RPC找到对应已注册的NFS端口,通知客户端RPC服务。 3、客户端获取正确的端口,并与NFS daemon联机存取数据。 4、存取数据成功后,返回前端访问程序,完成一次存取操作。 |
所以无论客户端 和服务端都需要用NFS,必须安装RPC服务。
NFS的RPC服务,在Centos5下名为portmap,Centos6下名称为rpcbind.
二、Centos7搭建NFS服务器实例
服务器系统 |
角色 |
IP |
CentOS7-150--server |
NFS服务器端 |
192.168.10.150 |
CentOS7-151-localhost |
NFS客户端 |
192.168.10.151 |
共享CentOS7-150--server中/data/bbs目录,使192.168.10.1 IP段所有主机都可以访问
1、因是测试环境,先关闭selinux和firewalld
1)关闭selinux
1 |
[root@service ~] # sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/selinux/config |
2)关闭firewalld防火墙
查看firewalld防火墙开机自动状态
1 2 |
[root@service ~] # systemctl list-unit-files|grep enable|grep firewalld firewalld.service enabled |
关闭firewalld防火墙开机自动启
1 2 3 |
[root@service ~] # systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user .target.wants /firewalld .service. Removed symlink /etc/systemd/system/dbus-org .fedoraproject.FirewallD1.service. |
停止防火墙
1 |
[root@service ~] # systemctl stop firewalld.service |
查看防火墙状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@service ~] # systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded ( /usr/lib/systemd/system/firewalld .service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man :firewalld(1)Mar 14 18:52:24 localhost.localdomain systemd[1]: Starting firewalld - dynamic .... Mar 14 18:52:24 localhost.localdomain systemd[1]: Started firewalld - dynamic f.... Mar 14 18:52:25 localhost.localdomain firewalld[573]: WARNING: ICMP type 'beyond... Mar 14 18:52:25 localhost.localdomain firewalld[573]: WARNING: beyond-scope: INV... Mar 14 18:52:25 localhost.localdomain firewalld[573]: WARNING: ICMP type 'failed... Mar 14 18:52:25 localhost.localdomain firewalld[573]: WARNING: failed-policy: IN... Mar 14 18:52:25 localhost.localdomain firewalld[573]: WARNING: ICMP type 'reject.. Mar 14 18:52:25 localhost.localdomain firewalld[573]: WARNING: reject-route: INV... Mar 14 11:21:43 service systemd[1]: Stopping firewalld - dynamic firewall daemon... Mar 14 11:21:43 service systemd[1]: Stopped firewalld - dynamic firewall daemon.Hint: Some lines were ellipsized, use -l to show in full. |
2、服务端部署
1)检查系统版本及NFS服务nfs-utils 和rpcbind有没有安装
1 2 3 |
[root@service ~] # cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@service ~] # rpm -qa nfs-utils rpcbind |
2)安装NFS服务nfs-untils和rpcbind
1 |
[root@service ~] # yum install nfs-utils rpcbind -y |
3)启动rpcbind服务(一定要先启动rpcbind服务再启动nfs服务)
查看rpcbind服务状态
1 |
[root@service ~] # systemctl status rpcbind.service |
启动rpcbind服务
1 |
[root@service ~] # systemctl start rpcbind.service |
查看rpc
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@service ~] # lsof -i :111 COMMAND PID USER FD TYPE DEVICE SIZE /OFF NODE NAME systemd 1 root 33u IPv6 25136 0t0 TCP *:sunrpc (LISTEN) systemd 1 root 38u IPv4 25137 0t0 TCP *:sunrpc (LISTEN) rpcbind 9227 rpc 4u IPv6 25136 0t0 TCP *:sunrpc (LISTEN) rpcbind 9227 rpc 5u IPv4 25137 0t0 TCP *:sunrpc (LISTEN) rpcbind 9227 rpc 8u IPv4 33497 0t0 UDP *:sunrpc rpcbind 9227 rpc 10u IPv6 33499 0t0 UDP *:sunrpc [root@service ~] # netstat -lntup|grep rpcbindudp 0 0 0.0.0.0:922 0.0.0.0:* 9227 /rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 9227 /rpcbind udp6 0 0 :::922 :::* 9227 /rpcbind udp6 0 0 :::111 :::* 9227 /rpcbind |
查看nfs服务向rpc注册的端 口信息
1 2 3 4 5 6 7 8 |
[root@service ~] # 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 |
把rpcbind另入开机自启动
1 2 3 |
[root@service ~] # systemctl enable rpcbind.service [root@service ~] # systemctl list-unit-files|grep enabled|grep rpcbind rpcbind.socket enabled |
4)启动NFS服务并查看其状态
1 2 |
[root@service ~] # systemctl start nfs.service [root@service ~] # systemctl status nfs.service |
把NFS服务加入开机自启动并查看其状态
1 2 |
[root@service ~] # systemctl enable nfs.service [root@service ~] # systemctl list-unit-files|grep nfs |
5)授权nfsnobody于/data/bbs让客户端挂载后可写可读
1 |
[root@service /] # chown nfsnobody:nfsnobody /data/bbs |
6)创建测试目录及文件
1 2 |
[root@service ~] # mkdir /data/bbs -p [root@service ~] # mkdir /data/bbs/test.txt |
7)配置NFS服务的export文件
1 |
[root@service ~] # echo "/data/bbs/ 192.168.10.1/24(rw,sync,root_squash)">>/etc/exports |
重新加载nfs配置文件
1 2 |
[root@service ~] # exportfs -rv exporting 192.168.10.1 /24 : /data/bbs |
exportfs:NFS服务端发布共享控制命令。
-r:表示重新刷新共享。
-a:表示将配置文件/etc/exports中的所有定义共享发布出去。
-v:显示确认共享设置。
-u:表示不发布共享。
查看nfs服务器挂载情况
1 2 3 |
[root@service ~] # showmount -e localhost Export list for localhost: /data/bbs 192.168.10.1 /24 |
ro:目录只读
rw:目录读写
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
async:将数据先保存在内存缓冲区中,必要时才写入磁盘
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody)
no_all_squash:与all_squash取反(默认设置)
root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置)
no_root_squash:与rootsquash取反
anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx)
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户
3、客户端配置
1 |
[root@localhost ~] # yum install nfs-utils rpcbind |
把rpcbind加入开机自启动
1 |
[root@localhost bbs] # systemctl enable rpcbind.service |
创建测试目录文件
1 |
[root@localhost ~] # mkdir /data/bbs/ -p |
扫描NFS服务器的文件共享列表
1 2 3 |
[root@localhost bbs] # showmount -e 192.168.10.150 Export list for 192.168.10.150: /data/bbs 192.168.10.1 /24 |
把服务器的目录挂载到客户端 的目录下
1 2 3 4 5 6 7 8 9 10 11 |
[root@localhost ~] # mount -t nfs -o noexec,nosuid,nodev,rw,rsize=65536,wsize=65536 192.168.10.150:/data/bbs /data/bbs [root@localhost ~] # df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 1004M 17G 6% / devtmpfs 479M 0 479M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 497M 112M 385M 23% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.10.150: /data/bbs 18G 1006M 17G 6% /data/bbs |
三、数据测试
服务端
1 2 |
[root@service /] # cd /data/bbs [root@service bbs] # touch a.txt |
客户端
1 |
[root@localhost ~] # ls /data/bbsa.txt |
提示: 1.配置NFS服务端后,不用重启NFS服务,只要使用exportfs -rv
2.rpc主程序Centos5.8下为portmap 、Centos6.4和Centos7下为rpcbind
3.NFS共享目录不要授权于777权限,可以改所属主和组为nfsnobody,因为nfsnobody权限不是很大,也不能登陆
四、配置客户端 开机自动挂载NFS共享目录
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@localhost ~] # chmod +x /etc/rc.d/rc.local #centos7需要给rc.local赋予执行权限后,rc.local文件才能生效 [root@localhost ~] # echo "mount -t nfs -o noexec,nosuid,nodev,rw,rsize=65536,wsize=65536 192.168.10.150:/data/bbs /data/bbs">>/etc/rc.local [root@localhost ~] # cat /etc/rc.local #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES# # It is highly advisable to create own systemd services or udev rules # to run scripts during boot instead of using this file.# # In contrast to previous versions due to parallel execution during boot # this script will NOT be run after all other services.# # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure # that this script will be executed during boot. mount -t nfs -o noexec,nosuid,nodev,rw,rsize=65536,wsize=65536 192.168.10.150: /data/bbs /data/bbs |
五、客户端mount挂载优化
在企业生产环境中,NFS客户端挂载的参数有noexec、nosuid、nodev、noatime、rsize、wsize、nodiratime等,
一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid、exec等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性,例如:很多***修改站点文件都是由上传入口上传的程序存储目录,然后执行,因此在挂载时,用下面的命令是有必要的,
普遍安全挂载参数:
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.10.150:/data/bbs /data/bbs
挂载的读写缓存
wsize和rsize写和读缓存
wsize和rsize的最大值
NFSV2 rsize=8192 wsize=8192
NFSV3 rsize=32768 wsize=32768
NFSV4 rsize=65536 wsize=65536
现在一般centos5.8以上的系统都己经增加了读写缓存,如需修改可以加以上参数
例如:
mount -t nfs -o noexec,nosuid,nodev,rw,rsize=65536,wsize=65536 192.168.10.150:/data/bbs /data/bbs
★mount的一些常用挂载优化参数:
wsize和rsize写和读缓存
async 数据不同步写到磁盘,提高性参,但降低数据安全,不推荐使用
noatime和nodiratime 这两个选是说在读写磁盘时,不更新文件和目录的时间戳,而更新文件时间戳对于工作数据必要性不大,增加了磁盘IO的次数,拖慢系统性参,
defaults 这个缺省值包括rw,suid,dev,exec,auto,nouser,and async cat /etc/fstab的结果默认大部人都是缺省值
noauto 不会自动挂载文件系统
noexec 不允许安装的直接执行任何二进制文件
ro 挂载一个只读文件系统
rw 挂载一个可写的文件系统
sync 把数据同步写入硬盘
nosuid 不允许设置用户标识或设置组标识符位
nodev 不解释字符或文件块特殊设备
intr 表示可以中断
★企业生产环境中nfs性参优化挂载例子:
1 2 |
mount -t nfs -o noatime,nodiratime 192.168.10.150: /data/bbs /data/bbs mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=65536,wsize=65536 192.168.10.150: /data/bbs /data/bbs |
如果是本地系统:
mount -o defaults,async,noatime,data=writeback,barrier=0 /dev/sdb1 /mnt
data=writeback,barrier=0 是日志文件系统的优化
提示:本地文件系统挂载如果加nodiratime会报错,
六、加优化参数和不加的数据写入测试
★使用普通挂载
1 |
[root@localhost ~] # mount -t nfs 192.168.10.150:/data/bbs /data/bbs |
测试单个文件写入速度
1 2 3 4 5 6 7 8 |
[root@localhost ~] # cd /data/bbs [root@localhost bbs] # time dd if=/dev/zero of=/data/bbs/dingjianfile bs=9k count=2000 2000+0 records in 2000+0 records out 18432000 bytes (18 MB) copied, 0.114592 s, 161 MB /s real 0m0.125s user 0m0.000s sys 0m0.021s |
测试批量创建文件的写入速度
1 2 3 4 |
[root@localhost bbs] # time for ((i=1;i<10000;i++));do /bin/cp /bin/touch /data/bbs/test$i;done real 2m2.877s user 0m10.242s sys 0m33.882s |
★加优化参数挂载:
1 |
[root@localhost bbs] #mount -t nfs -o noexec,nosuid,nodev,rw,rsize=65536,wsize=65536 192.168.10.150:/data/bbs /data/bbs |
测试单个文件写入速度
1 2 3 4 5 6 7 |
[root@localhost bbs] # time dd if=/dev/zero of=/data/bbs/dingjianfile bs=9k count=2000 2000+0 records in 2000+0 records out 18432000 bytes (18 MB) copied, 0.10043 s, 184 MB /s real 0m0.107s user 0m0.001s sys 0m0.017s |
测试批量创建文件的写入速度
1 2 3 4 |
[root@localhost bbs] # time for ((i=1;i<10000;i++));do /bin/cp /bin/touch /data/bbs/test$i;done real 1m38.526s user 0m9.989s sys 0m32.788s |
七、配置fstab文件令开机自动加载网络文件系统和本地的文件系统(和rc.local效果一样)
1 2 3 4 5 6 7 8 9 10 |
[root@localhost bbs] # vi /etc/fstab ## /etc/fstab# Created by anaconda on Fri Mar 9 05:05:49 2018 ## Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=07347aff-3d84-4cd6-a0e7-ac145593622e / xfs defaults 0 0 UUID=f6cdb812-e3ba-4154-8116-a39c68f74d98 /boot xfs defaults 0 0 UUID=8b003ed3-3e5b-4f45-9530-41a412748c6a swap swap defaults 0 0 192.168.10.150: /data/bbs /data/bbs nfs defaults,nosuid,noatime,nodiratime,noexec,nodev,intr,rsize=65536,wsize=65536 0 0 ~ |