搭建 NFS 环境
NFS 介绍
NFS(Network File System) 即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS的数据传输基于RPC(remote procedure call)协议。
NFS 应用场景是:A,B,C 三台机器上需要保证被访问到的文件是一样的。A共享数据出来,B和C分别去挂载A共享的数据目录,从而B和C访问到的数据和A上的一致。
例子:跑了一个网站,上面传输了很多图片,用户访问一个图片时,需要从A机器上去请求,但A机器负载高,为了分担负载,就多弄了两台机器,B机器C机器同时提供服务;正常的话,需要到A机器上才能拿到数据,但是B机器和C机器做了负载均衡,分担了相同的服务器,那么用户也有可能到B机器或者C机器上;那么用户请求到B机器上的时候,如何才能获取到A机器上的数据呢;要么把A机器的数据传输到B机器上,同时传输到C机器上,但是这个不能时时更新,(用户上传的数据是存放在A机器上,但用户请求的时候数据是请求到B机器上)这样A上的数据还没到B上面去,就会导致用户请求获取的数据访问不到,访问为空,为404;那么NFS服务就可以解决这个问题,将A机器的数据共享到B机器、C机器,通过NFS来实现。有NFS服务以后,上传到A机器上的数据,B机器或C机器上就能马上看到和调用。NFS可以实时同步数据。
NFS原理图:
NFS 服务端安装配置
服务端配置
服务端IP:192.168.1.101
安装NFS工具:
sudo apt install -y nfs-kernel-server
配置NFS:
安装NFS服务后,会新增一个
/etc/exports
文件,NFS服务根 据它的配置来运行,其默认内容可通过命令cat /etc/exports
查看,它默认包含了一些配置 的范例,内容如所示。# /etc/exports: the access control list for filesystems which may be exported # to NFS clients. # See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
编辑
/etc/exports
文件,加入下面内容:[root@localhost ~]# sudo vim /etc/exports /home/nfstestdir 192.168.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000,no_subtree_check)
- /home/nfstestdir:要共享的开发主机目录,注意使用空格与后面的配置隔开。
- 192.168.1.0/24 配置谁可以访问,其中的/24是掩码, 即掩码是255.255.255.0。
- rw: 表示客户机的权限,rw表示可读写,具体的权限还受文件系统的rwx及用户身份影响。
- sync:资料同步写入到内存与硬盘中。
- anonuid=1000:将客户机上的用户映射成指定的本地用户ID的用户,请根据具体的主机用户组gid进行配置。
- anongid=1000: 将客户机上的用户映射成属于指定的本地用户 组ID,请根据具体的主机用户组gid进行配置。
- no_subtree_check:不检查子目录权限,默认配置。
更新exports配置:
修改完/etc/exports文件并保存后,可使用exportfs命令更新配置:
sudo exportfs -arv
启动NFS服务:
安装完成后,系统会自动启动rpcbind服务(在服务端进程名为systemd),默认监听的端口为111端口:
[root@localhost ~]# ps aux | grep rpc rpc 2390 0.0 0.0 64964 1044 ? Ss 21:19 0:00 /sbin/rpcbind -w root 3826 0.0 0.0 112680 972 pts/0 R+ 21:31 0:00 grep --color=auto rpcbind [root@localhost ~]# netstat -lntp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0: *LISTEN 1/systemd ...... tcp6 0 0 :::111 :::* LISTEN 1/systemd ......
启动NFS服务命令:
sudo systemctl start nfs
将NFS服务加入开机启动项命令:
sudo systemctl enable nfs
客户端配置
在 ICE-EVB 开发板上安装 NFS 客户端,安装命令如下:
apt install nfs-common -y
客户端挂载:
检查客户端是否有权限访问服务端文件:
showmount -e 192.168.1.101
显示信息如下:
[root@localhost ~]# showmount -e 192.168.1.101 Export list for 192.168.1.101: /home/nfstestdir 192.168.1.0/24
客户端已有权限访问服务端
开始挂载:
mount -t nfs 192.168.1.101:/home/nfstestdir /mnt/ df -h ...... 192.168.1.101:/home/nfstestdir 16G 5.2G 11G 33% /mnt
测试:
在客户端/mnt目录下创建test文件:
[root@localhost ~]# touch /mnt/test [root@localhost ~]# ls -l /mnt/ 总用量 0 -rw-r--r--. 1 mysql mysql 0 1月 16 22:05 test
查看服务端/home/nfstestdir/目录:
[root@localhost ~]# ls -l /home/nfstestdir/ 总用量 0 -rw-r--r--. 1 mysql mysql 0 1月 16 22:05 test // 存在个客户端上一样的文件,实现了同步共享。
取消挂载:
sudo umount /mnt