目录
一、NFS概述
NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。NFS共享文件为明文传输,因此只能在内网中使用。
NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了.RPC服务(portmap 或rpcbind服务)
RPC(Remote Procedure Call)即远程过程调用(端口为111)。RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的port上去。
二、NFS工作原理
在启动NFS SERVER之前,首先要启动RPC服务,否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。
特别注意:一般修改NFS主配置文件后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。具体往下看,后面有操作演示。
1)首先服务器端启动RPC服务,并开启111端口
2)服务器端启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
三、部署NFS服务
1.安装nfs-utils和rpcbind软件
rpm -q rpcbind nfs-utils #查询是否安装
yum install -y nfs-utils rpcbind #安装nfs和rpc的软件包
systemctl start rpcbind #先开启rpc服务
systemctl start nfs-utils #后开启nfs服务
2.设置共享目录
NFS服务的配置文件:/etc/exports
记录格式:共享的目录位置 客户机地址(权限选项)
客户机地址:可以为主机,网段,IP地址;可以通配符 * 和 ?。
常见的权限选项:
rw | 允许读写 |
ro | 只读 |
sync | 同步写入到内存与硬盘中 |
async | 将数据先保存在内存缓冲区中,必要时才写入磁盘 |
no_root_squash | 当客户机以root身份访问时赋予本地root权限 |
root_squash | 客户机用root用户访问该共享目录时,将root用户映射成匿名用户(默认选项) |
all_squash | 所有访问用户都映射为匿名用户或用户组 |
subtree_check | 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认) |
no_subtree_check | 输出目录是一个子目录,nfs服务器不检查,这样可以提高效率 |
anonuid=xxx | 指定nfs服务器/etc/passwd文件中匿名用户的UID |
anongid=xxx | 指定nfs服务器/etc/group文件中匿名用户的GID |
2.1配置服务端的共享目录
[root@7-2 opt]# vim /etc/exports #配置共享目录
[root@7-2 opt]# systemctl restart nfs
[root@7-2 opt]# showmount -e #查看共享目录详情
2.2客户端挂载共享目录
临时挂载
[root@7-3 ~]# mkdir /data #创建目录
[root@7-3 ~]# mount 192.168.88.30:/opt /data
#将共享目录挂载到本地/data目录
永久挂载
umount -lf #强制解挂
vim /etc/fstab
共享目录 挂载目录 nfs defaults,_netdev 0 0
3.客户端写入文件
服务端共享目录允许客户端写入,但客户端root用户无法写入。
因为共享目录默认使用root_squash,客户端root被降权。
客户端想写入共享目录
##1.在服务端给共享目录提权
chmod 777 /opt
##2.直接设置共享目录no_root_squash
vim /etc/exports
/opt 192.168.88.20/24(rw,no_root_squash)
4.指定写入共享目录文件属主属组
vim /etc/exports
/opt 192.168.88.20/24(rw,all_squash,anonuid=1001,anongid=1001)
all_squash:指定文件映射为匿名用户和组anonuid:指定uid
anongid:指定gid
##修改共享目录后,如果重新开启nfs,客户端仍挂载共享目录,客户端容易卡死。
exportfs -arv #重新发布共享目录,不会影响客户端使用
##客户端卡死,强行解挂
umount -lf 挂载目录