NFS

 

1. NFS简介

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过网络共享资源。将NFS主机分享的目录,挂载到本地客户端当中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,在客户端端看起来,就像访问本地文件一样。

RPC,基于C/S模型。程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需知道网络细节,甚至可以请求对方的系统调用。

对于Linux而言,文件系统是在内核空间实现的,即文件系统比如ext3、ext4等是在Kernel启动时,以内核模块的身份加载运行的。

1.1 NFS特点

  • NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源

  • 在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样

  • nfs适用于Linux与Unix之间实现文件共享,不能实现Linux与Windows间的文件共享功能

  • nfs是运行在应用层的协议,其监听于2049/tcp和2049/udp套接字上

  • nfs服务只能基于IP进行认证

1.2 NFS的应用场景

nfs有很多实际应用场景,以下是一些常用的场景:

  • 多个机器共享一台CDROM或其他设备。这对于在多台机器中安装软件来说更加便宜与方便

  • 在大型网络中,配置一台中心NFS服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录

  • 不同客户端可在NFS上观看影视文件,节省本地空间

  • 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下

2. 为什么使用NFS?

网络文件系统是应用层的一种应用服务,它主要应用于Linux 和Linux 系统、Linux 和Unix系统之间的文件或目录的共享。对于用户而言可以通过 NFS 方便的访问远地的文件系统,使之成为本地文件系统的一部分。采用NFS之后省去了登录的过程,方便了用户访问系统资源。

3. NFS原理

NFS本身的服务并没有提供数据传递的协议,而是通过使用RPC(远程过程调用 Remote Procedure Call)来实现。当NFS启动后,会随机的使用一些端口,NFS就会向RPC去注册这些端口。RPC就会记录下这些端口,RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前,首先要确保rpc服务启动。

具体过程如下:

  1. 本地用户要访问nfs服务器中文件,先向内核发起请求,内核处理调用nfs模块及rpc client

  2. rpc client向rpc server发起连接

  3. 在连接之前,NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp,还会启动其它进程(如mountd,statd,rquotad等)以完成文件共享,这些进程的端口是不固定的;是每次NFS服务启动时向RPC服务注册的,RPC服务会随机分配未使用的端口

  4. 完成连接,接受访问请求

  5. nfs应用程序向内核发起请求

  6. 内核调用文件系统

然后client端通过获取的NFS端口来建立和server端的NFS连接并进行数据的传输。

以下为启动各服务的作用

rpc:远程过程调用协议,是实现本地调用远程主机实现系统调用的协议。

portmapper:负责分配rpc server的端口,并在client端请求时,负责响应目的rpc server端口返回给client端,工作在tcp与udp的111端口上。

mountd:是nfs服务的认证服务的守护进程,client在收到返回的真正端口时,就会去连接mountd,认证取得令牌。

nfsd:nfs的守护进程,负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户,工作在tcp和udp的2049端口。

idmapd:是NFS的一个程序,用来负责远程client端创建文件后的权限问题。

quotad:用用于实现磁盘配额,当client端挂载nfs后可以限制磁盘空间的大小。

4. NFS的优缺点

4.1 优点

a.节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问

b.简单容易上手

c.方便部署非常快速,维护十分简单

4.2 缺点

a.局限性容易发生单点故障,及server机宕机了所有客户端都不能访问

b.在高并发下NFS效率/性能有限

c.客户端没用用户认证机制,且数据是通过明文传送,安全性一般(一般建议在局域网内使用)

d.NFS的数据是明文的,对数据完整性不做验证

e.多台机器挂载NFS服务器时,连接管理维护麻烦

5. NFS配置

手动搭建一个nfs服务器:

  • - 开放/nfs/shared目录,供所有用户查阅资料

  • - 开放/nfs/upload目录为172.16.12.0/24网段的数据上传目录,并将所有用户及所属的用户组都映射为nfs-upload,其UID与GID均为300

    服务端客户端
    root@node1 root@node2
    192.168.59.128 192.168.59.129

服务端安装NFS

 [root@node1 ~]#  yum -y install nfs-utils
 Repository extras is listed more than once in the configuration
 Last metadata expiration check: 0:00:46 ago on Sun 25 Dec 2022 05:39:45 PM CST.
 Dependencies resolved.
 =============================================================================
  Package                 Architecture Version               Repository Size
 ...      
  libverto-libevent-0.3.0-5.el8.x86_64   nfs-utils-1:2.3.3-46.el8.x86_64  
  python3-pyyaml-3.12-12.el8.x86_64       quota-1:4.04-14.el8.x86_64        
  quota-nls-1:4.04-14.el8.noarch         rpcbind-1.2.5-8.el8.x86_64        
 
 Complete!
 [root@node1 ~]#

创建目录和文件

 [root@node1 ~]#  mkdir -p /nfs/shared
 [root@node1 ~]# mkdir -p /nfs/upload
 [root@node1 ~]# cd /nfs/
 [root@node1 nfs]# ls
 shared upload
 [root@node1 nfs]# cd
 [root@node1 ~]# touch /nfs/shared/read.txt
 [root@node1 ~]# echo 'xixi' >> /nfs/shared/read.txt
 [root@node1 ~]# cat /nfs/shared/read.txt
 xixi
 [root@node1 ~]#

关闭防火墙

 [root@node1 ~]# systemctl stop firewalld
 [root@node1 ~]# setenforce 0
 [root@node1 ~]#

配置为只读,非root用户访问为匿名

 [root@node1 ~]# vi /etc/exports
 /nfs/shared *(ro,all_squash)
 /nfs 192.168.59.129(rw)
 [root@node1 ~]#

启动nfs服务

 [root@node1 ~]# systemctl enable --now nfs-server
 Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
 [root@node1 ~]# systemctl status rpcbind
 ● rpcbind.service - RPC Bind
    Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor >
    Active: active (running) since Sun 2022-12-25 17:50:12 CST; 15s ago
      Docs: man:rpcbind(8)
  Main PID: 31640 (rpcbind)
    Tasks: 1 (limit: 4766)
    Memory: 1.5M
    CGroup: /system.slice/rpcbind.service
            └─31640 /usr/bin/rpcbind -w -f
 
 Dec 25 17:50:12 node1 systemd[1]: Starting RPC Bind...
 Dec 25 17:50:12 node1 systemd[1]: Started RPC Bind.
 lines 1-12/12 (END)
 [root@node1 ~]# ss -antl
 State   Recv-Q Send-Q   Local Address:Port     Peer Address:Port Process  
 LISTEN  0       128            0.0.0.0:111            0.0.0.0:*              
 LISTEN  0       128            0.0.0.0:20048          0.0.0.0:*              
 LISTEN  0       64             0.0.0.0:44467          0.0.0.0:*              
 LISTEN  0       128            0.0.0.0:40373          0.0.0.0:*              
 LISTEN  0       128            0.0.0.0:22             0.0.0.0:*              
 LISTEN  0       64             0.0.0.0:2049           0.0.0.0:*              
 LISTEN  0       128               [::]:38023             [::]:*              
 LISTEN  0       128               [::]:111               [::]:*              
 LISTEN  0       128               [::]:20048             [::]:*              
 LISTEN  0       128               [::]:22               [::]:*              
 LISTEN  0       64               [::]:2049             [::]:*              
 LISTEN  0       64               [::]:39621             [::]:*              
 [root@node1 ~]#

查看导出

 [root@node1 ~]# showmount -e 192.168.59.128
 Export list for 192.168.59.128:
 /nfs/shared *
 [root@node1 ~]#

客户端安装NFS

 [root@node2 ~]# yum -y install nfs-utils
 CentOS-8.5.2111 - Base - mirrors.aliyun.com   26 kB/s | 3.9 kB     00:00    
 CentOS-8.5.2111 - Extras - mirrors.aliyun.co  16 kB/s | 1.5 kB     00:00    
 ...
 
 Installed:
  gssproxy-0.8.0-19.el8.x86_64           keyutils-1.5.10-9.el8.x86_64      
  libverto-libevent-0.3.0-5.el8.x86_64   nfs-utils-1:2.3.3-46.el8.x86_64  
  python3-pyyaml-3.12-12.el8.x86_64       quota-1:4.04-14.el8.x86_64        
  quota-nls-1:4.04-14.el8.noarch         rpcbind-1.2.5-8.el8.x86_64        
 
 Complete!
 [root@node2 ~]#

关闭防火墙并启动nfs

 [root@node2 ~]# systemctl  stop firewalld
 [root@node2 ~]# setenforce 0
 [root@node2 ~]# systemctl start nfs-server rpcbind
 [root@node2 ~]# ss -antl
 State   Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process  
 LISTEN   0        128              0.0.0.0:56939           0.0.0.0:*                
 LISTEN   0        128              0.0.0.0:111             0.0.0.0:*                
 LISTEN   0        128              0.0.0.0:20048           0.0.0.0:*                
 LISTEN   0        64               0.0.0.0:32915           0.0.0.0:*                
 LISTEN   0        128              0.0.0.0:22              0.0.0.0:*                
 LISTEN   0        64               0.0.0.0:2049            0.0.0.0:*                
 LISTEN   0        64                 [::]:45837             [::]:*                
 LISTEN   0        128                 [::]:111               [::]:*                
 LISTEN   0        128                 [::]:20048             [::]:*                
 LISTEN   0        128                 [::]:56693             [::]:*                
 LISTEN   0        128                 [::]:22                 [::]:*                
 LISTEN   0        64                 [::]:2049               [::]:*                
 [root@node2 ~]#

挂载

 [root@node2 ~]# mount -t nfs 192.168.59.128:/nfs /media/
 [root@node2 ~]# df -h
 Filesystem           Size Used Avail Use% Mounted on
 devtmpfs             370M     0 370M   0% /dev
 tmpfs               389M     0 389M   0% /dev/shm
 tmpfs               389M   11M 379M   3% /run
 tmpfs               389M     0 389M   0% /sys/fs/cgroup
 /dev/mapper/cs-root   17G  1.9G   16G  12% /
 /dev/sda1           1014M 214M 801M  22% /boot
 tmpfs                 78M     0   78M   0% /run/user/0
 192.168.59.128:/nfs   17G  1.8G   16G  11% /media
 [root@node2 ~]#

开放/nfs/upload目录为172.16.12.0/24网段的数据上传目录,并将所有用户及所属的用户组都映射为nfs-upload,其UID与GID均为300

创建nfs-upload组和用户指定uid,gid为300

 [root@node1 ~]#  groupadd -g 300 nfs-upload
 [root@node1 ~]# useradd -u 300 -g 300 nfs-upload
 [root@node1 ~]# id nfs-upload
 uid=300(nfs-upload) gid=300(nfs-upload) groups=300(nfs-upload)
 [root@node1 ~]#

改变upload目录属组为nfs-upload

 [root@node1 ~]# chown -R 'nfs-upload'.'nfs-upload' /nfs/upload/
 [root@node1 ~]# chmod g+s /nfs/upload/
 [root@node1 ~]#

指定所有用户访问都为匿名且uid gid都为300,exportfs重新加载exports文件

 [root@node1 ~]# vi /etc/exports
 [root@node1 ~]# tail -3 /etc/exports
 /nfs/shared *(ro,all_squash)
 /nfs 192.168.59.129(rw)
 /nfs/upload 172.16.12.0/24(rw,all_squash,root_squash,anonuid=300,anongid=300)
 [root@node1 ~]# exportfs -r
 [root@node1 ~]#

查看导出

 [root@node1 ~]# showmount -e 192.168.59.128
 Export list for 192.168.59.128:
 /nfs/shared *
 /nfs/upload 172.16.12.0/24
 /nfs        192.168.59.129
 [root@node1 ~]#
 
posted @ 2022-12-25 18:21  Thespace  阅读(94)  评论(0编辑  收藏  举报