1.NFS简介
Network File System(网络文件系统,通过网络让不同的机器系统之间可以彼此共享文件和目录,类似Samba服务。
2.NFS挂载原理
在网络中服务器和客户端进行连接都是通过端口进行数据传输,而NFS服务端的端口是随机的,从而导致NFS客户端不知道端口号是多少,不能直接和服务端进行传输,其实NFS服务器是通过远程过程调用(remote procedure call RPC)协议来完成,RPC服务会统一NFS的端口,客户端和服务端连接时通过RPC来沟通NFS使用了那些端口,之后利用这些端口(小于1024)进行数据传输。
RPC不会主动向NFS服务去获取端口号,所以我们要先启动RPC,之后在启动NFS,NFS才把自己开发的端口向RPC去注册端口号
比方:你喜欢的女孩生日了,你想给她送一份礼物,但是你又不知道她喜欢什么,怕自己的爱打水漂,所以找到了她的闺蜜,问到了她喜欢的一下东西。
3.NFS工作过程
(1)NFS server端会随机开放一个端口,去向RPC去注册这些端口,RPC会记录下来,并开放自己的111端口,等待客户端RPC的请求
(2)NFS Client端口使用自己的RPC端口去连接Server端的RPC端口,Server端的RPC收到请求后,会将自己记录的NFS端口信息告知客户端
4.软件包和常用目录
nfs-utils-*
rpcbind-*
/etc/exports #NFS服务的主要配置文件
/usr/sbin/exportfs #NFS服务的管理命令
/usr/sbin/showmount #客户端的查看命令
/var/lib/nfs/etab #记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab #记录曾经登录过的客户端信息
5.NFS服务器的配置
主配置文件:/etc/exports
/etc/exports格式:
共享目录 + 客户端+(配置参数)
/opt/share 192.168.100.0/24(rw等等)
共享目录:指NFS共享给客户端使用的目录
客户端:网络中可以访问这个共享目录的计算机
客户端指定方式:
指定ip地址:192.168.100.100
指定子网中的所有主机:192.168.100.0
指定域名主机:www.chinaskills.cn
指定域中的所有主机:*.chinaskills.cn
所有主机:*
/etc/exports配置参数:
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
6.查看共享状态
客户端:
showmount -e NFS服务端ip地址
服务端:
exportfs
7.挂载方式
命令格式:mount + NFS服务器ip:共享目录 本地挂载目录
mount 192.168.100.100:/home/zhangsan /media/zhangsan
mount -o vers=3 192.168.100.100:/home/zhangsan /media/zhangsan
卸载:
umount 挂载点
umount /media/zhangsan
exports -au #服务端停止共享
exports -ra #重新进行共享
自动挂载:
格式:: nfs 0 0
192.168.100.100:/home/zhangsan /media/zhangsan nfs,vers=3 defaults 0 0
mount - a
8.相关命令
exportfs命令
格式:exportfs [-aruv]
-a #全部挂载或卸载主配置文件中的内容(一般都和-u -r 一起使用)
-r #重新读取主配置文件中的信息,并同步更新/etc/exports,/var/lib/nfs/xtab
-u #卸载单一目录(和-a使用为卸载所有主配置文件中的目录)
-v #将详细信息输出到屏幕上
例子:
exportfs -au #卸载所有共享目录
exportfs -rav #重新共享所有目录并输出详细信息
rpcinfo命令
rpcinfo -p #查看nfs和rpc开放了那些端口
PS:在做了iptables的环境下不能重新启动rpc和nfs服务,最好就是重新获取信息,因为你重启的时候NFS的端口会改变,那样iptables开放的端口就失效了。
9.实验
• 共享/data/share目录;
• 用于存储server01主机的web数据;
• 仅允许192.168.100.0网段访问该共享。
[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# mkdir /data/share -p
[root@localhost ~]# touch /data/share/a.txt
[root@localhost ~]# echo aaaa > /data/share/a.txt
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# exportfs -arv
exporting 192.168.100.0/24:/data/share
[root@localhost ~]# systemctl restart nfs
使用rpcinfo -p 命令查看开放的端口
[root@localhost ~]# iptables -I INPUT -p tcp --dport 111 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 2049 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p udp --dport 111 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p udp --dport 2049 -j ACCEPT
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
客户端测试:
10.固定端口实验
因为NFS的端口一直改变,而防火墙又不能关闭,所有我们为了方便将NFS的端口给它固定住,又由于nfs服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad这5个服务,NFS重启是除了portmapper不会改变之外,其他四个都是会改变,所有我们要一起给进行端口绑定
1)首先我们要找到有那4个连续而有没有服务运行的端口
grep 50000 /etc/services | more
2)在/etc/sysconfig/nfs文件最后面添加
RQUOTAD_PORT=50001
LOCKD_TCPPORT=50002
LOCKD_UDPPORT=50002
MOUNTD_PORT=50003
STATD_PORT=50004
3)修改/etc/modprobe.d/lockd.conf,末尾添加
options lockd nlm_tcpport=30002
options lockd nlm_udpport=30002
3)重启服务
systemctl restart nfs-config
systemctl restart nfs-idmap
systemctl restart nfs-lock
systemctl restart nfs-server
4)查看端口
ss -tnlp | grep -E "50000|111|2049"
5)iptables设置
iptables -I INPUT -p tcp --dport 50001:50004 -j ACCEPT
iptabels -I INPUT -p udp --dport 50001:50004 -j ACCEPT
iptables -l INPUT -p tcp --dport 111 -j ACCEPT
iptables -I INPUT -p tcp --dport 2049 -j ACCEPT
iptables -I INPUT -p udp --dport 111 -j ACCEPT
iptables -I INPUT -p udp --dport 2049 -j ACCEPT
nfs - 启动相应RPC服务进程来服务对于NFS文件系统的请求.
* nfslock - 一个可选的服务,用于启动相应的RPC进程,允许NFS客户端在服务器上对文件加锁.
* portmap - Linux的RPC服务,它响应RPC服务的请求和与请求的RPC服务建立连接.
下面的RPC进程在后台一起工作服务于NFS服务:
* rpc.mountd - 这个进程接受来自NFS客户端的加载请求和验证请求的文件系统正在被输出.这个进程由NFS服务自动启动,不需要用户的配置.
* rpc.nfsd - 这个进程是NFS服务器.它和Linux核心一起工作来满足NFS客户端的动态需求,例如提供为每个NFS客户端的每次请求服务器线程.这个进程对应于nfs服务.
* rpc.lockd - 一个可选的进程,它允许NFS客户端在服务器上对文件加锁.这个进程对应于nfslock服务.
* rpc.statd - 这个进程实现了网络状态监控(NSM)RPC协议,通知NFS客户端什么时候一个NFS服务器非正常重启动.这个进程被nfslock服务自动启动,不需要用户的配置.
* rpc.rquotad - 这个进程对于远程用户提供用户配额信息. 这个进程被nfs服务自动启动,不需要用户的配置.