前言:
在分布式项目中,项目可能部署在不同服务器上,但是需要访问到共同的文件资源,比如服务器A上次的的文件,要求服务器B也可以访问。
因此就需要跨机器共享文件,在这里就简单的采用nfs+rpcbind实现跨机器的文件共享。
服务器 | 类型 | 共享目录 |
192.168.1.6 | 服务器端 | /www |
192.168.1.4 | 客户端 | /www |
需求:192.168.1.6 服务器下www文件夹作为共享文件夹,要求192.168.1.4或者192.168.1.3等其它服务器可以访问使用。
注:如果多台服务器间共享,本质也是一样,一台服务器端、几台客户端服务器。
一、安装nfs和rpcbind
1.1、检查自己的电脑是否已经默认安装了nfs和rpcbind
rpm -aq | grep nfs
rpm -aq | grep rpcbind
如果没有安装可以使用命令安装
yum install nfs-utils rpcbind
二、在服务器端-配置nfs的配置文件和hosts文件
2.1、创建共享的目录
在192.168.1.6服务器下创建共享目录www
mkdir www
#赋权限
chmod -R 777 www
2.2、配置nfs的配置文件
vi /etc/exports
添加内容
/www 192.168.1.4(rw,sync,no_root_squash)
- /www:表示的是nfs服务器需要共享给其他客户端服务器的文件夹
- 192.168.1.4:表示可以挂载服务器目录的客户端ip
- (rw,sync,no_root_squash):表示该客户端对共享的文件具有读写权限
格式:【共享目录 地址 权限】
1、共享目录:表示的是nfs服务器需要共享给其他客户端服务器的文件夹
2、地址:可以使用完整IP或网段,也可以地址可以使用主机名,DNS解析的和本地/etc/hosts解析的都行
3、权限:
- rw:read-write,可读写; 注意,仅仅这里设置成读写客户端还是不能正常写入,还要正确地设置共享目录的权限,参考问题7
- ro:read-only,只读;
- sync:文件同时写入硬盘和内存;
- async:文件暂存于内存,而不是直接写入内存;
- no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
- root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
- all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
- anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
- anongid:匿名用户的GID值。
2.3、配置hosts文件
vi /etc/hosts
添加内容
192.168.1.6 hostname
2.4、启动nfs和rpcbind服务
启动服务:
service rpcbind start
service nfs start
检查启动状态:
service rpcbind status
service nfs status
重启服务:
service rpcbind restart
service nfs restart
2.5、设置服务开机自启
rpcbind 与nfs 服务需要设置开机自启,否则重启服务器后失效了
#设置开机启动
systemctl enable rpcbind
systemctl enable nfs
2.6、检测服务器的nfs状态
#查看本机共享的服务
showmount -e
三、在客户端-挂载NFS中共享的目录
3.1、客户端安装nfs 和 rpcbind 服务
安装步骤与上面一致
启动服务:
service rpcbind start
service nfs start
#设置开机启动
systemctl enable rpcbind
systemctl enable nfs
3.2、查询服务端共享的文件目录
showmount -e 192.168.1.6
当在客户端查看时,出现如下错误提示:
1、clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
方法1:开发NFS服务器需要的全部端口(开发端口过多不安全,不建议)
方法2:关闭防火墙(不安全,不建议)
方法3:防火墙对服务予以放行;服务端放行NFS所需服务nfs、rpc-bind、mountd(建议采用)
#--permanent表示永久生效,不加这个参数的话只会针对本次执行完命令生效,重启后就不管用了(
#先依次执行不带permanent参数后,再依次执行带permanent参数的指令)
firewall-cmd --add-service=nfs --permanent
firewall-cmd --add-service=rpc-bind --permanent
在客户端再次尝试showmount命令得到不一样的错误提示
2、rpc mount export: RPC: Unable to receive; errno = No route to host
NFS服务依赖服务有portmap、nfsd、mountd
firewall-cmd --add-service=mountd --permanent
3.3、客户端创建挂载目录
建议客户端192.168.1.4 创建与服务器端192.168.1.6一致的目录
mkdir www
3.4、挂载服务端的共享目录:
在客户端挂载服务端的共享目录
mount -t nfs -o nolock,nfsvers=3,vers=3 192.168.1.6:/www /www
3.5、查看挂载的状态
在客户端查看挂载的状态
mount | grep nfs
3.6、取消挂载
如果不再需要挂载,可以取消挂载
在客户端服务器下执行
umount www
如果取消不掉,强制卸载:
umount -f www
如果提示目录繁忙,就使用延迟卸载,它会等目录不忙的时候再卸载:
umount -l www
3.7、客户端设置开机自动挂载nfs
磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载。
系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。这样我们只需要将磁盘的挂载信息写入这个文件中我们就不需要每次开机启动之后手动进行挂载了。
vi /etc/fstab
192.168.1.6:/www /www nfs defaults 0 0
测试:重启服务器,发现磁盘文件夹在客户端处于挂载状态
四、测试服务器文件共享是否成功
1、在服务器端192.168.1.6 共享文件夹下创建文件
touch test.txt
2、在客户端192.168.1.4 挂载共享目录下查看文件:
3、在客户端192.168.1.4 挂载共享目录下删除文件:
rm -rf test.txt
ls
4、在服务器端192.168.1.6 共享文件夹下查看文件:
测试成功通过!