一、NFS简介
网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
NFS(Network File System,网络文件系统)是当前主流异构平台共享文件系统之一。主要应用在UNIX环境下。最早是由Sun Microsystems开发,现在能够支持在不同类型的系统之间通过网络进行文件共享,广泛应用在FreeBSD、SCO、Solaris等异构操作系统平台,允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,使得每个计算机的节点能够像使用本地资源一样方便地使用网上资源。换言之,NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。
NFS的工作原理是使用客户端/服务器架构,由一个客户端程序和服务器程序组成。服务器程序向其他计算机提供对文件系统的访问,其过程称为输出。NFS客户端程序对共享文件系统进行访问时,把它们从NFS服务器中“输送”出来。文件通常以块为单位进行传输。其大小是8KB(虽然它可能会将操作分成更小尺寸的分片)。NFS传输协议用于服务器和客户机之间文件访问和共享的通信,从而使客户机远程地访问保存在存储设备上的数据。
主要特点如下:
(1)提供透明文件访问以及文件传输;
(2)容易扩充新的资源或软件,不需要改变现有的工作环境;
(3) 高性能,可灵活配置。
NFS工作原理图如下:
二、服务端安装步骤
1、安装nfs服务
#yum install -y rpcbind
2、安装rpc服务
#yum install -y nfs-utils
3、启动rpc(先)服务和nfs(后)服务
#systemctl start rpcbind
#systemctl start nfs-server
4、将rpc和nfs服务添加到开机启动
#systemctl enable rpcbind
#systemctl enable nfs-server
5、在防火墙上放行nfs服务
[root@test1 ~]# firewall-cmd --permanent --add-service=nfs
success
[root@test1 ~]# firewall-cmd --reload
success
[root@test1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client nfs
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
6、创建共享目录
#mkdir /publicdata
#chown -R nfsnobody.nfsnobody publicdata
7、编辑配置文件
[root@test1 ~]# vim /etc/exports
将如下配置添加到配置文件后保存
[root@test1 test]# cat /etc/exports
/publicdata 192.168.0.134/32(rw,sync,no_root_squash)
/publicdata 192.168.0.0/24(ro)
如上配置根据自己需要设置和修改
8、重新加载nfs配置文件
#systemctl reload nfs
或者
#exportfs -a
三、配置文件说明
格式: 共享目录的路径 允许访问的NFS客户端(共享权限参数)
如上,共享目录为/public , 允许访问的客户端为192.168.245.0/24网络用户,权限为只读。
请注意,NFS客户端地址与权限之间没有空格。
NFS输出保护需要用到kerberos加密(none,sys,krb5,krb5i,krb5p),格式sec=XXX
- none:以匿名身份访问,如果要允许写操作,要映射到nfsnobody用户,同时布尔值开关要打开,setsebool nfsd_anon_write 1
- sys:文件的访问是基于标准的文件访问,如果没有指定,默认就是sys, 信任任何发送过来用户名
- krb5:客户端必须提供标识,客户端的表示也必须是krb5,基于域环境的认证
- krb5i:在krb5的基础上做了加密的操作,对用户的密码做了加密,但是传输的数据没有加密
- krb5p:所有的数据都加密
用于配置NFS服务程序配置文件的参数:
参数 作用 - ro 只读
- rw 读写
- root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
- no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
- all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户
- sync 同时将数据写入到内存与硬盘中,保证不丢失数据
- async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
修改/etc/exports文件后需要重启服务生效,或者使用exportfs -a使配置生效。
四、客户端挂载配置
1、linux环境客户端挂载配置
1)、安装showmount命令
[root@test1 ~]# yum install -y showmount
showmount命令的用法;
参数 作用
-e 显示NFS服务器的共享列表
-a 显示本机挂载的文件资源的情况NFS资源的情况
-v 显示版本号
2)、创建挂载目录
[root@lvxfstest ~]# mkdir /backup
3)、挂载NFS共享目录
[root@lvxfstest ~]# mount -t nfs 192.168.0.124:/publicdata /backup
4)、检查挂载情况
[root@lvxfstest ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 10G 1.2G 8.9G 12% /
devtmpfs devtmpfs 908M 0 908M 0% /dev
tmpfs tmpfs 920M 0 920M 0% /dev/shm
tmpfs tmpfs 920M 8.9M 911M 1% /run
tmpfs tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/mapper/centos-home xfs 30G 14G 17G 45% /home
/dev/sda1 xfs 1014M 146M 869M 15% /boot
tmpfs tmpfs 184M 0 184M 0% /run/user/0
192.168.0.124:/publicdata nfs4 38G 4.2G 34G 11% /backup
2、window环境客户端挂载配置
1、控制面板–>添加程序和功能–>添加NFS组件
2、计算机–>映射驱动器–>添加nfs地址和要共享的文件夹
五、QA
1、执行exportfs -a时报错
报错信息如下:
[root@test1 ~]# exportfs -a
exportfs: No options for /publicdata 192.168.0.134/32: suggest 192.168.0.134/32(sync) to avoid warning
exportfs: No host name given with /publicdata (rw), suggest *(rw) to avoid warning
exportfs: No options for /publicdata 192.168.0.0/24: suggest 192.168.0.0/24(sync) to avoid warning
exportfs: No host name given with /publicdata (ro), suggest *(ro) to avoid warning
exportfs: incompatible duplicated export entries:
exportfs: *:/publicdata (0x425) [IGNORED]
exportfs: *:/publicdata (0x424)
原因:
IP地址和权限参数之间有空格
解决方案:
去掉IP地址和后面权限参数之间的空格。
2、客户端往nsf共享目录写入文件时报错
报错信息如下:
[root@lvxfstest backup]# touch hi.txt
touch: cannot touch ‘hi.txt’: Permission denied
原因:共享目录权限设置错误
解决方案1:将共享目录设置777权限
解决方案2:设置no_root_squash参数,当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
3、window添加遇到权限有问题
打开注册表:regedit, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default 下新建两个OWORD(64)位值,添加值AnonymousGid,值默认为0,AnonymousUid,值默认为0。