一.NFS工作原理

1.NFS简介

NFS是Network File System的缩写,中文称为网络文件系统,它的主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中,从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS企业在企业中的应用场景,在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享中,例如产品的图片附件头像,然后前端所有节点在访问这些静态资源时都会读取NFS存储上的资源。

NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站应用频率更高。

2.NFS挂载原理

NFS服务器挂载结构图

如图所示:

NFS服务器设置好了共享目录/home/public,其他有访问NFS服务器权限的客户端就可以将这目录挂载到自己本地的挂载点。A客户端将/home/public挂载到了自己本地的/home/data/mypublic,B客户端将/home/public挂载到了本地的/mnt/nfs上。

 查看磁盘信息命令 df -h

3.什么是RPC

  • RPC服务类似于NFS服务器端和NFS客户端中间的一个中介
  • 因为NFS支持的功能相当多,而不同的功能会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定
  • 因为端口不固定,这样一来就会造成NFS客户端与NFS服务器端通信障碍,因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信,才能交互数据
  • 要解决上面的困扰,就需要通过远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端发出请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的

4.NFS客户端和NFS服务器建立连接的过程



1.首先服务器启动RPC服务,开启111端口
2. 服务器启动NFS服务,向RPC注册端口信息
3. 客户端启动RPC(portmap服务),向服务端RPC(portmap服务)请求服务端的NFS端口
4. 服务端的RPC(portmap)服务反馈NFS端口信息给客户端
5. 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输

二.NFS安装部署

1.查看系统信息

uname -a 查看系统信息在这里插入图片描述

要养成一个习惯,就是先查看系统版本和内核参数。同一个软件在不同版本,内核之间是有差异的,所以部署的方法也不一样,不要因为这个而造成不必要的错误

2.软件安装

要部署NFS服务,必须安装下面两个软件包:nfs-utils:NFS主程序,rpcbind:PRC主程序

###安装软件
[root@localhost ~]# yum -y install  nfs-utils rpcbind    
###nfsnobody 账户id为65534
[root@localhost ~]# id  nfsnobody    
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

注意:在安装完该软件包后会自动创建nfsnobody用户

3.启动服务

启动NFS服务之前必须先启动RPC服务

3.1启动rpcbind服务

###启动rpcbind服务
[root@localhost ~]# systemctl start  rpcbind
###设置开机自启
[root@localhost ~]# systemctl enable  rpcbind
###查看服务状态
[root@localhost ~]# systemctl status  rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2023-07-07 02:43:40 EDT; 1min 14s ago
  Process: 4671 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 4672 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─4672 /sbin/rpcbind -w

Jul 07 02:43:40 localhost.localdomain systemd[1]: Starting RPC bind service...
Jul 07 02:43:40 localhost.localdomain systemd[1]: Started RPC bind service.
###查看端口
[root@localhost ~]# netstat -lntup | grep rpcbind
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      4672/rpcbind        
tcp6       0      0 :::111                  :::*                    LISTEN      4672/rpcbind        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           4672/rpcbind        
udp        0      0 0.0.0.0:607             0.0.0.0:*                           4672/rpcbind        
udp6       0      0 :::111                  :::*                                4672/rpcbind        
udp6       0      0 :::607                  :::*                                4672/rpcbind        
###查看端口映射情况
[root@localhost ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper

在这里插入图片描述
3.2启动NFS服务

###启动nfs服务
[root@localhost ~]# systemctl start nfs
###设置开机自启
[root@localhost ~]# systemctl enable nfs
###查看服务状态
[root@localhost ~]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Fri 2023-07-07 02:49:52 EDT; 5s ago
  Process: 5076 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 5049 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 5047 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 5049 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Jul 07 02:49:52 localhost.localdomain systemd[1]: Starting NFS server and services...
Jul 07 02:49:52 localhost.localdomain systemd[1]: Started NFS server and services.
###查看注册端口信息
[root@localhost ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  10809  status
    100024    1   tcp  19282  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  27260  nlockmgr
    100021    3   udp  27260  nlockmgr
    100021    4   udp  27260  nlockmgr
    100021    1   tcp  13722  nlockmgr
    100021    3   tcp  13722  nlockmgr

在这里插入图片描述

4.配置NFS的配置文件/etc/exports

###编辑配置
[root@localhost ~]# vim   /etc/exports
###文件内容
### share /data 
/data 10.10.100.0/24(rw,sync)

在这里插入图片描述
nfs配置文件的格式:

NFS共享的目录 NFS客户端地址(参1,参2,……) NFS客户端地址2(参1,参2,……)或者

NFS共享的目录 NFS客户端地址(参1,参2,……)

上述各列参数的含义:

NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody读写

NFS配置参数权限

参数名称 参数用途
rw 表示可读可写权限
ro 表示只读权限
sync 请求或写入数据时,数据同步写入到NFS Server的硬盘才会返回,优点:数据安全不会丢失;缺点:性能比比启用该参数要差
async 写入数据时会先写入内存缓冲区,直到硬盘有空挡才会写入硬盘,这样可以提升写入效率。风险:若是服务器宕机或不正常关机,会损失缓冲区中为写入硬盘的数据
all_squash 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份
anonuid anonuid就是匿名的uid和gid。说明客户端以什么权限来访问服务端,在默认情况下是nfsnobody,uid65534
anongid 同anonuid一样,就是把uid换成gid

5.创建共享目录

###创建目录
[root@localhost ~]# mkdir /data
[root@localhost ~]# ll -d /data/
drwxr-xr-x. 2 root root 6 Jul  7 16:14 /data/

6.更改共享目录权限

###修改权限
[root@localhost ~]# chown -R nfsnobody:nfsnobody /data
[root@localhost ~]# ll -d /data/
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Jul  7 16:14 /data/

7.重新加载NFS服务

###重新加载服务
[root@localhost ~]# systemctl restart  nfs

8.检查服务器是否能够挂载

###showmount命令显示信息
[root@localhost ~]# showmount -e localhost
Export list for localhost:
/data 10.10.100.0/24

在这里插入图片描述

出现上面信息是,说明服务器可以挂载
测试的IP地址为NFS服务器的IP地址

9.NFS客户端配置

9.1 安装客户端软件

###安装软件
[root@localhost ~]# yum -y  install nfs-utils rpcbind   

安装nfs-utils软件的目的是为了使用showmount等功能,所以客户端最好也装上,但是不启动NFS服务
9.2 启动rpcbind服务

[root@localhost ~]# systemctl  start   rpcbind

9.3 检查能否访问服务器

[root@localhost ~]# showmount -e  10.10.100.222
Export list for 10.10.100.222:
/data 10.10.100.0/24

在这里插入图片描述

10.挂载NFS共享目录

###挂载NFS目录
[root@localhost mnt]# mount 10.10.100.222:/data /mnt
###查看磁盘挂载情况
[root@localhost mnt]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 7.8G     0  7.8G   0% /dev
tmpfs                    7.8G     0  7.8G   0% /dev/shm
tmpfs                    7.8G  9.0M  7.8G   1% /run
tmpfs                    7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G   22G   29G  44% /
/dev/sda1               1014M  155M  860M  16% /boot
/dev/mapper/centos-home   42G   33M   42G   1% /home
tmpfs                    1.6G     0  1.6G   0% /run/user/0
10.10.100.222:/data       44G  8.9G   36G  21% /mnt

在这里插入图片描述

11.测试读写数据

客户端创建文件在这里插入图片描述
服务器上查看
在这里插入图片描述

12.实现开机挂载

方法1
放入/etc/rc.local中,以实现开机自动挂载

 [root@localhost ~]# chmod +x /etc/rc.local 
 [root@localhost ~]# echo "#mount by  tdm"   >> /etc/rc.local 
 [root@localhost ~]# echo "/bin/mount  -t nfs 10.10.100.222:/data /mnt"  >> /etc/rc.local 

方法2
为什么fstab无法实现nfs挂载?

  • 开机启动流程所致
  • 加载防火墙在前
  • 加载网卡

放入fstab中,使用延迟服务

[root@localhost ~]# vim /etc/fstab 
[root@localhost ~]# echo " 10.10.100.222:/data  /mnt   nfs  defaults 0 0 "  >> /etc/fstab 
[root@localhost ~]# systemctl start  remote-fs.target

参考:https://www.cnblogs.com/me80/p/7464125.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐