第1章 NFS介绍
1.什么是共享存储
一句话说就是多台服务器的数据保存在同一个存储服务器上。这样无论用户请求在哪一台服务器上看到的数据都是一样的
2.什么是NFS
NFS Network File System 网络文件系统。
NFS 主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录
NFS 系统和 Windows 网络共享、网络驱动器类似, 只不过 windows用于局域网, NF 用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统 glusterfs,Ceph等
3.NFS应用场景
3.1.多台web服务器的图片和视频数据都保存在NFS服务器上
3.2.多台服务器的备份数据都保存在NFS服务器上
4.NFS通讯原理
4.1.服务端启动后将自己的端口信息注册到rpcbind
4.2.NFS客户端通过TCP/IP的方式连接NFS服务端的rpcbind并获得真实的端口信息
4.3.NFS客户端获得真实的端口后,将自己需要的操作函数通过⽹络发送给NFS服务端对应的端口
4.4.NFS服务端接收到请求后,由rpc.nfsd进程判断NFS客户端是否拥有连接权限
4.5.NFS服务端的rpc.mount进程判断客户端是否有对应的操作权限
4.6.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件
注意: rpc 是⼀个远程过程调用,那么使用 nfs 必须有 rpc 服务
5. 什么是RPC(remote procedure call)
PRC的主要功能是指定每个NFS功能所对应的port number,并且通知给客户端,让客户端可以连接到正确的端口上去。
注释:当服务器在启动nfs时会随机选取数个端口,并主动向RPC注册,因此RPC可以知道每个端口对应的NFS功能。
问:当客户端有NFS文件访问需求时,如何向服务器端请求数据呢?
5.1、客户端会向服务器端的RPC(port 111)发出NFS文件访问功能的查询需求
rpcbind不需要设置,只要直接启动它即可,启动之后,会在一个port 111 的sunrpc的服务,那就是rpcbind
5.2、服务器端找到对应的已注册的NFS daemon端口后,会通知客户端
5.3、客户端了解正确的端口后,就可以直接与NFS daemon连接
二、环境配置
ip | 备注 |
192.168.0.120 | NFS服务端 |
192.168.0.188 | NFS客户端 |
三、NFS Server 端配置
3.1 安装rpc、nfs服务
yum install rpcbind nfs-utils -y
nfs软件结构
- 主要配置文件:/etc/exports
- nfs主要配置文件,不过系统并没有默认值,需要使用vim手动创建文件
- nfs文件系统维护命令:/usr/sbin/exportfs
这个是维护NFS共享资源的命令,我们可以利用这个命令重新共享/etc/exports更新的目录资源、将NFS Server共享的目录卸载或重新共享等。
- 共享资源的日志文件:/var/lib/nfs/*tab
在NFS文件服务器中,日志文件都放置在/var/lib/nfs目录中,有两个重要的日志文件:
- etab:主要记录nfs所共享出来的目录的完整权限设置值
- xtab:记录曾经链接到此NFS服务器的相关客户端的数据
- 客户端查询服务器共享资源的命令:/usr/sbin/showmount
exportfs用在NFS Server端,而showmount则主要用在Client端,这个showmount可以用来查看NFS共享 出来的共享目录。
3.2 创建共享目录
mkdir /data
chmod 666 /data
3.3 修改nfs配置文件
vim /etc/exports
#在文件中添加如下内容,表示允许所有客户端挂载
/data *(rw,sync,insecure,no_subtree_check,no_root_squash)
/etc/exports配置文件权限参数
参数值 | 内容说明 |
rw / ro | 该目录共享的权限是可读写(read-write)或只读(read-only),但最终能不能读写 ,还是与文件系统的rwx及身份有关 |
sync / async | sync代表数据会同步写入到内存与硬盘中,async则代表数据会暂存于内存当中,而非直接写入硬盘 |
no_root_squash / root_squash | 客户端使用NFS文件系统的帐号若为root时,系统该如何判断这个帐号的身份?默认情况下,客户端root的身份会由root_squash的设置压缩成nfsnobody,如此对服务器的系统会较有保障,但如果想要开放客户端使用root身份来操作服务器的文件系统,那么这里就需要开放no_root_squash才行 |
all_squash | 不论登录NFS的用户身份为何,他的身份都会被压缩成为匿名用户,通常也就是nobody(nfsnobody) |
anonuid / anongid | anon意指anonymouns(匿名用户)前面关于*_squash提到的匿名用户的UID的设置值,通常为nobody(nfsnobody),但是你可以自行设置这个UID的值,当然,这个UID必须要存在与/etc/passwd当中,anonuid指的是UID而anongid则是组的GID |
问题1:仅给某个单一主机使用的目录设置
假如要将一个私人目录/home/test 开放给192.168.100.10这个client端的机器来使用,/etc/exports配置可如下:
$ vim /etc/exports
/home/nfs/sharefile *(rw,sync,insecure,no_subtree_check,no_root_squash)
/home/test 192.168.100.10(rw)
问题2:同一目录针对不同范围开放不同权限
假如要将一个公共目录/home/public开放,但是需要限定在局域网192.168.100.0/24这个网络加入vbirdgroup组的用户才能够读写,其他来源的用户只能读
$ mkdir /nfs
$ setfacl -m g:vbirdgroup:rwx /nfs
$ vim /etc/exports
/home/public 192.168.100.0/24(rw) *(ro)
#将主机与网络分为两段,用空格隔开
注意:通配符仅能用在主机名的分辨上面,IP或网段只能用192.168.100.0/24的形式,不可以使用192.168.100.*
3.4 启动rpc、nfs服务
#先启动rpc服务,再启动nfs服务
systemctl start rpcbind.service
systemctl status rpcbind.service
#启动nfs服务
systemctl start nfs-server.service
systemctl status nfs-server.service
查看服务端是否正常加载/etc/exports配置文件
$ showmount -e localhost
Export list for localhost:
/home/nfs/sharefile *
【注释】当重新设置完/etc/exports文件后不需要重新启动NFS,可以通过exportfs这个命令。如果重新启动NFS的话,得再向RPC注册,比较麻烦。
$ exportfs [-aruv]
选项与参数:
-a:全部挂载(或卸载)/etc/exports文件中的配置
-r:重新挂载/etc/exports里面的设置。此外,亦同步更新/etc/exports及/var/lib/nfs/xtab的内容
-u:卸载某一目录
-v:在export的时候,将共享的目录显示到屏幕上
1. 重新挂载一次 /etc/exports 的设置
$ exportfs -arv
2. 将已经共享的NFS目录资源,全部都卸载
exportfs -auv
查看注册的端口列表
rpcinfo -p localhost
NFS会开启很多port,主要的端口如下:
- rpcbind 启动的port在111,同时启动在UDP与TCP
- NFS本身的服务启动在port 2049上
- 其他的rpc.*服务启动的port则是随机产生的,因此需要向port 111注册
四、NFS Client端配置
4.1 安装客户端软件nfs-utils
yum install nfs-utils -y
4.2 查看服务端可共享的目录(需要开启端口或者关闭防火墙)
注释:192.168.0.120为NFS服务端ip
#查看服务器给client提供了哪些可以使用的资源
$ showmount -e 192.168.0.120
Export list for 192.168.0.120:
/home/nfs/sharefile *
4.3 挂载服务端共享目录
将服务端的共享目录挂载到本地/home/nfs目录下
mount 192.168.0.120:/home/nfs/sharefile /home/nfs -o proto=tcp -o nolock
设置开机自启
cat >> /etc/fstab << 'EOF'
192.168.8.120:/data /data nfs defaults 0 0
EOF
[root@web-7 /]# mount -a
[root@web-7 /]# df -h|grep data
192.168.8.120:/data 37G 1.5G 36G 5% /data
4.4 卸载nfs目录挂载
umount /home/nfs