- NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,也就是说客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。
- 优点
* 节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问
* 简单容易上手
* 方便部署非常快速,维护十分简单
- 缺点
* 局限性容易发生单点故障,及server机宕机了所有客户端都不能访问
* 在高并发下NFS效率/性能有限
* 客户端没用用户认证机制,且数据是通过明文传送,安全性一般(一般建议在局域网内使用)
* NFS的数据是明文的,对数据完整性不做验证
* 多台机器挂载NFS服务器时,连接管理维护麻烦
- 优点
(1)、NFS原理
1)、NFS Server服务器上设定/data目录被分享,而客户端可以通过网路将/data目录挂载到本地的挂载点(常用mnt)后,客户端就可以进入挂载点目录进行文件的读写。NFS客户端所开放的端口是随机的,由RPC服务分配端口。
2)、RPC(Remote Procedure Call)即远程过程调用。RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的port上去。
3)、 RPC服务原理
执行顺序:1(注册端口)>>2(达成协议)>>3(直接建立联系)>>4(达成协议)>>5(建立连接)
当服务器在启动NFS时会随机取用数个port,并且主动的向RPC注册,因此RPC可以知道每个NFS的port对应的NFS功能,然后RPC又是固定使用port111来监听客户端的需求并汇报客户端的正确的port,所以rpc能够找到对应的port。
-
4)portmap
* 功能:主要是把RPC程序号转化为Internet的端口号。
* 特点:只在第一次建立连接时候帮助网络应用程序找到正确的port,当当双方正确连接时,端 口就和应用绑定,portmap就无用。
(2)安装NFS
环境为两台CentOS7虚拟主机
- 首先关闭selinux和防火墙
[root@nfs-104 ~]# systemctl stop firewalld
[root@nfs-104 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@nfs-104 ~]# vim /etc/selinux/config
SELINUX=disabled
[root@nfs-104 ~]# systemctl reboot #重启生效
- NFS配置文件:/etc/exports或/etc/exports.d/*
- NFS服务的主配置文件为/etc/exports,用于定义共享的目录以及访问NFS共享目录的客户端的权限,其格式如下:
/PATH/TO/SOME_DIR clients1(export_options, ...) clients2(export_options, ...) - 其中clients客户端格式有:
single host:ipv4, ipv6, FQDN;
network:address/netmask,支持长短格式的掩码;
wildcards:主机名通配,例如:.magedu.com;
netgroups:NIS域内的主机组;@group_name;
anonymous:使用通配所有主机;
export_options选项有:
General Options通用选项
ro:只读
rw:读写;
sync:同步;会影响性能
async:异步;
secure:客户端端口小于1024,否则就要使用insecure选项;
User ID Mapping:用户id号映射选项
root_squash:压缩root用户,一般指将其映射为nfsnobody;
no_root_squash:不压缩root用户;
all_squash:压缩所有用户;
anonuid and anongid:将压缩的用户映射为此处指定的用户;
安装配置nfs-server服务端
[root@nfs-104 ~]# lsmod | grep nfs #查询是否有nfs模块
[root@nfs-104 ~]# yum -y install nfs-utils #安装nfs
[root@nfs-104 ~]# rpm -qa nfs-utils #查询是否安装成功
[root@nfs-104 ~]# mkdir /data/mysql -pv #创建nfs共享文件目录
[root@nfs-104 ~]# vim /etc/exports #定义共享的目录以及访问NFS共享目录的客户端的权限
/data/mysql 172.16.15.*(rw,sync,no_root_squash) #如果设置成root_squash,会导致权限被压缩为nobody权限,无法对该目录进行写入操作。
[root@nfs-104 ~]# vim /etc/sysconfig/nfs #设置nfs固定端口
MOUNTD_PORT=4001
STATD_PORT=4002
[root@nfs-104 ~]#systemctl start rpcbind
[root@nfs-104 ~]# systemctl start nfs #启动nfs
[root@nfs-104 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:4001 *:*
[root@nfs-104 ~]# showmount -e #测试本机是否有可挂载目录
(3)客户端测试
在另外一台客户端测试:
关闭selinux和防火墙
客户端上:
[root@client-90 ~]# yum install nfs-utils #安装nsf-utils
[root@client-90 ~]# showmount -e 172.16.15.104 #查看远程主机可挂载路径
Export list for 172.16.15.104:
/data/mysql 172.16.15.*
[root@client-90 ~]# mount -t nfs 172.16.15.104:/data/mysql /mnt #挂载到本地mnt目录下
[root@client-90 mnt]# touch /mnt/test #创建一个测试文件
[root@client-90 mnt]# ls
test #创建test文件成功
回到服务器端查看:
[root@nfs-104 ~]# ls /data/mysql ##查看服务器端是否有刚才的测试文件
test
指定NFS服务的映射用户
将客户端访问共享文件的登录用户映射为NFS服务器上的指定用户账号。
NFS服务器上:
[root@nfs-104 ~]# useradd -u 1001 centos #添加用户
[root@nfs-104 ~]# mkdir /data/mysql/test #创建测试目录
[root@nfs-104 ~]# chown -R 1001.1001 /data/mysql/test #修改此目录属主为1001用户
[root@nfs-104 ~]# ll -d /data/mysql/test #查看权限
[root@nfs-104 ~]# vim /etc/exports #定义共享的目录以及访问NFS共享目录的客户端的权限
/data/mysql/test 172.16.15.*(rw,sync,all_squash,anonuid=1001,anongid=1001)
[root@nfs-104 ~]# exportfs -rav #重新输出文件系统配置信息
exporting 172.16.15.*:/data/mysql/test
在客户端测试:
在客户端上:
[root@client-90 ~]# umount -f /mnt #强行解挂目录
[root@client-90 ~]# mount -t nfs 172.16.15.104:/data/mysql/test /mnt #挂载新创建的测试目录
[root@client-90 ~]# cd /mnt #切换目录
[root@client-90 mnt]# touch test2 #创建文件
[root@client-90 mnt]# ll
total 0
-rw-r--r-- 1 1001 1001 0 Jun 26 20:05 test2 #生成的文件的uid和gid与NFS服务映射用户的相一致
在NFS服务器上:
[root@nfs-104 ~]# ll /data/mysql/test/* #查询共享目录
-rw-r--r-- 1 centos centos 0 Jun 26 20:05 /data/mysql/test/test2